Abstract Class vs. Interface [duplicate]
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 interfaceinterface Plane{ public function Fly(); }//I also want shoot enemyinterface 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();
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...
Briefly speaking, interface is to standardize a set of functions,while abstract class is to define a basic skeleton for classes to derive from.