抽象类与接口抽象类接口

2022-08-30 09:26:56

我已经在SO以及网络的其余部分搜索了一个很好的答案,但我没有找到一个我真正理解的答案。我将以不同的方式介绍这一点,希望答案也能帮助其他人。

据我所知,这两个概念具有相同的规则,除了抽象类由于方法实现能力而更灵活。另外,我知道你可以实现多个接口,并且只扩展一个类,但我确信比我提到的两个有更多的差异。

请看一下这两个代码片段,给我一个例子,我可以用我的每个例子做些什么,让我想或不想使用另一个例子。

抽象类

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) {

    }
}

答案 1

抽象

摘要 类侧重于一种事物的相似性。

人们被认为是类型,因此不会被认为是类型。mammalvehicle

接口

接口侧重于类似功能的排序。

例如:你是一个人,是类型。如果你想飞,那么你需要实现一个.如果你想在飞行时射击,那么你还需要实现.mammalflying Interfacegun 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();

答案 2

要恢复这个想法(全局,而不是详细):

inheritance

是 的概念,并选择性地添加一些新功能或覆盖一些现有功能(以不同的方式执行)。但是使用继承,您可以与父级共享大部分代码。你是父母+其他一些事情。extend from something

interface

表示某些能力(我们说一个类正在实现一个接口,说它具有这些能力)。一个接口可以由2个完全不同的类实现,并且不共享它们的代码(除了它们实现的方法)。当 A 和 B 实现接口 C 时,A 不是 B,B 不是 A。

其中一个原因确实是允许程序员像对待多继承一样做同样的事情,但没有多重继承问题。interface

这个概念用于一些编程语言,如JAVA,PHP...


推荐