我有一些代码
/*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)一定是错的,但为什么它运行得很好。 我想问一个问题,在课堂测试中用check方法,$ a-> sound();动物中没有,但它仍在运行。它像我打开评论抽象类时那样运行,两者都没有区别。我真的好奇,也许我错了解这个问题,扭曲了
答案 0 :(得分:1)
我们谈论的是动物和特定动物,如猫和鳄鱼。虽然在你的定义中,动物的概念与声音的方法无关,但从动物遗传的特定动物,如猫和鳄鱼,具有声音的能力。这就是你从更一般到更具体的方式。最后你会得到更多的特殊性。
您的Animal
class
有一名protected
$name
成员以及一名获取者和一名二传手。它们非常有用,因为您无需为Crocodile
或Cat
重新定义这些内容。但是你可以告诉Animal
class
你不知道sound
方法在详细情况下会是什么样子,但你知道所有Animals
都可以制作一个sound
1}}。这就是class
为abstract
的原因:您可以实现其中的一部分,但有些事情无法在Animal
级别实施,因为不同类型的动物会有不同类型的声音