Abstract Class vs. Interface [duplicate]
I have searched around SO as well as the rest of the web for a good answer but I have't found one that I really understand. I am going to present this in a different way and hopefully the answers will help others as well.
As far as I understand, the two concepts have the same rules except an abstract class is more flexible due to the method implementation ability. Also, I am aware you can implement multiple interfaces and only extend a single class but I'm sure there are more differences than the two I mentioned.
Please look at the two snippets of code and give me an example what I can do with each of my examples that would make me want or not want to use the other.
Abstract Class
abstract class Foo {
abstract public function getValue();
abstract public function setValue($value);
}
class myObj extends Foo {
function getValue() {
}
function setValue($value) {
}
}
Interface
interface Foo {
public function getValue();
public function setValue($value);
}
class myObj implements Foo {
function getValue() {
}
function setValue($value) {
}
}
Solution 1:
Abstract
Abstract Classes focus on a kind of things similarity.
People are considered of type mammal
and as such would not be considered of type vehicle
.
Interface
Interfaces focus on collation of similar function.
For example: You are a human being and are of type mammal
. If you want to fly then you will need to implement a flying Interface
. If you want to shoot while flying, then you also need to implement the gun Interface
.
See the examples below:
abstract class Mammal {
protected $age_;
//below are functions I think all mammals will have,including people
abstract public function setAge($age);
abstract public function getAge();
abstract public function eat($food);
}
class Person extends Mammal {
protected $job_; //Person's feature
public function setAge($age){
$this->age_ = $age;
}
public function getAge(){
return $this->age_;
}
public function eat($food){
echo 'I eat ' ,$food ,'today';
}
//People only attribute
public function setJob($job){
$this->job_ = $job;
}
public function getJob(){
echo 'My job is ' , $this->job_;
}
}
//Now a person wants to fly, but they are typically not able to do so.
//So we implement an interface
interface Plane{
public function Fly();
}
//I also want shoot enemy
interface Gun{
public function shoot();
}
class Person2 extends Mammal implements Plane,Gun{
protected $job_;//Person feature
public function setAge($age){
$this->age_ = $age;
}
public function getAge(){
return $this->age_;
}
public function eat($food){
echo '<br/>I eat ' ,$food ,' today<br/>';
}
//Only a person has this feature.
public function setJob($job){
$this->job_ = $job;
}
public function getJob(){
echo 'My job is ' , $this->job_;
}
//-----------------------------------------
//below implementations from interfaces function. (features that humans do not have).
//Person implements from other class
public function fly(){
echo '<br/>I use plane,so I can fly<br/>';
}
public function shoot(){
echo 'I use gun,so I can shoot<br/>';
}
}
$People = new Person();
echo '<pre>';
print_r( get_class_methods('People'));
echo '</pre>';
echo '<pre>';
print_r( get_class_methods('People2'));
echo '</pre>';
$People2 = new Person2();
$People2->setAge(24);
echo $People2->getAge();
$People2->eat('egg');
$People2->setJob('PHP devepop');
echo $People2->getJob();
$People2->fly();
$People2->shoot();
Solution 2:
To resume the idea (globally, not in detail):
inheritance
is the notion to extend from something
, and optionally add some new feature or override some existing feature (to do differently). But using inheritance, you share a big part of code with the parent. You are a parent + some other things.
interface
is representing some abilities (we says a class is implementing an interface to says that it has these abilities). An interface can be implemented by 2 classes which are completely different and do not share their code (except for methods they implements). When A and B are implementing interface C, A is not a B and B is not a A.
And one of the reason for interface
is indeed to allow programmer to do the same as they could do with multi-inheritance, but without multi-inheritance problems.
This notion is used in some programming languages like JAVA, PHP...