【问题标题】:abstract class in phpphp中的抽象类
【发布时间】:2016-06-26 15:06:44
【问题描述】:

下面有一些代码

/*abstract*/ class Animal{
    protected $name;
    protected $legs;

    public function setName($name){
        $this->name = $name; 
    }

    public function getName(){
        return $this->name;
    }

    // abstract public function sound();
}


class Cat extends Animal{
    public function sound(){
        echo 'Meo meo meo';
    }
}

class Crocodile extends Animal{
    public function sound(){
        echo 'Never hear it';
    }
} 

function check(Animal $a){
    echo $a->getName();br();
    echo $a->sound();br();
}

$cat = new Cat();
$cat->setName("Cat");

$cro = new Crocodile();
$cro->setName('Nothing');


class test{
    public function check(Animal $a){
        echo $a->getName();
        echo $a->sound();
    }
}   


$t = new test();    
$t->check($cro);    

我认为,如果不使用抽象,那么最后一行 $t->check($cro) 肯定是错误的,但为什么它运行良好。 我想问一个问题,在课堂测试中使用检查方法 $a->sound();在 Animal 中不存在,但它仍然运行。它就像我打开评论抽象类时一样运行,两者没有什么不同。我真的很奇怪,也许我理解错了这个问题,扭曲了

【问题讨论】:

  • 方法sound 存在于Crocodile 类中。这就是它运行的原因。
  • 但在animal中没有,并且带有Animal的参数
  • 您在Crocodile 类对象上运行检查方法。这个对象有sound 方法。如果方法存在于子类中,Animal 是否有这个方法无关紧要。
  • 那么为什么世界上存在抽象,而我们在没有它的情况下使用但仍在运行。像这样,我不能在动物中定义 sound() 没问题

标签: php oop inheritance abstract-class


【解决方案1】:

我们谈论的是动物和特定的动物,例如猫和鳄鱼。虽然在您的定义中,动物的概念与发声的方法无关,但特定的动物,如猫和鳄鱼,是从动物身上继承而来的,具有发声的能力。这就是你从更一般到更具体的方式。最后你会得到更多的特殊性。

您的 Animal class 有一个 protected $name 成员以及一个 getter 和一个 setter。它们很有用,因为您不必为CrocodileCat 重新定义它们。但是你可以告诉Animalclass,你不知道sound 方法在细节上的样子,但你知道所有Animals 都可以生成sound。这就是为什么classabstract的原因:你可以实现它的一部分,但有些东西不能在Animal级别实现,因为不同类型的动物会有不同类型的声音。

【讨论】:

  • @KIM,这些只是设置或获取值的功能的名称。例如name的setter是setName,name的getter是getName
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 2016-03-12
相关资源
最近更新 更多