Абстрактный класс против интерфейса [дубликат]

этот вопрос уже есть ответ здесь:

Я искал вокруг так же, как и остальная часть интернета для хорошего ответа, но я не нашел того, что я действительно понимаю. Я собираюсь представить это по-другому, и, надеюсь, ответы помогут и другие тоже.

насколько я понимаю, две концепции имеют одинаковые правила, за исключением того, что абстрактный класс более гибкий из-за способности реализации метода. Кроме того, я знаю, что вы можете реализовать несколько интерфейсов и расширить только один класс, но я уверен, что есть больше различий, чем два, о которых я упоминал.

пожалуйста, посмотрите на два фрагмента кода и дайте мне пример, что я могу сделать с каждым из моих примеров, которые заставили бы меня хотеть или не хотеть использовать другой.

Абстрактный Класс

abstract class Foo {
    abstract public function getValue();
    abstract public function setValue($value); 
}


class myObj extends Foo {
    function getValue() {

    }
    function setValue($value) {

    }
}

интерфейс

interface Foo {
    public function getValue();
    public function setValue($value);
}

class myObj implements Foo {
    function getValue() {

    }
    function setValue($value) {

    }
}

4 ответов


чтобы возобновить идею (глобально, не подробно):

inheritance

- это понятие extend from something, и при необходимости добавить новую функцию или переопределить существующую функцию (чтобы сделать по-другому). Но используя наследование, вы разделяете большую часть кода с родителем. вы родитель + некоторые другие вещи.

interface

представляет некоторые способности (мы говорим, что класс реализация интерфейс говорит, что он имеет такие способности). Взаимодействие может быть реализован 2 классами, которые совершенно разные и не разделяют их код (за исключением методов, которые они реализуют). Когда A и B реализуют интерфейс C, A не является B и B не является A.

и одна из причин interface действительно, чтобы позволить программисту делать то же самое, что они могли бы сделать с несколькими наследованиями, но без проблем с несколькими наследованиями.

это понятие используется в некоторых языках программирования, таких как JAVA, PHP...


Аннотация

абстрактные классы сосредоточены на подобии вещей.

люди считаются типа mammal и как таковой не будет считаться типа vehicle.

интерфейс

интерфейсы фокусируют на Сортировке подобной функции.

например: ты человек и относишься к типу mammal. Если вы хотите летать, вам нужно будет реализовать flying Interface. Если вы хотите стрелять во время полета, то вам также необходимо реализовать gun Interface.

см. примеры ниже:

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();

коротко говоря, интерфейс является стандартизация набора функций,в то время как абстрактный класс - определить базовый скелет для классов, производных от.


Я уже думал об этом раньше, и лучшее, что я мог заключить, что интерфейсы являются логически удобной абстракцией чистого абстрактного класса (c++).

Что касается того, почему вы выбрали бы интерфейсы над абстрактными классами, я цитирую (источник c++ но понятия те же):

обратите внимание, что существует большое искушение добавить конкретные функции-члены и данные в чистые абстрактные базовые классы. Этому нужно сопротивляться, в вообще это признак того, что интерфейс не очень хорошо учитывается. Данные и конкретные функции-члены, как правило, подразумевают определенную реализацию и как таковые могут наследовать от интерфейса, но не должны быть этим интерфейсом. Вместо этого, если есть некоторая общность между конкретными классами, создание абстрактного класса, который наследует свой интерфейс от чистого абстрактного класса и определяет общие данные и функции-члены конкретных классов, работает хорошо.

дело в том, что когда используя интерфейсы, первое, что приходит на ум, это развязка. При использовании интерфейса пользователь и класс реализации полностью разделены. То же самое относится и к использованию чисто абстрактный класс который в основном является интерфейсом.