Abstract Class vs. Interface [duplicate] Abstract Class vs. Interface [duplicate] php php

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.