【发布时间】: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