php中的抽象类
下面我有一些代码php中的抽象类,php,oop,inheritance,abstract-class,Php,Oop,Inheritance,Abstract Class,下面我有一些代码 /*abstract*/ class Animal{ protected $name; protected $legs; public function setName($name){ $this->name = $name; } public function getName(){ return $this->name; } // abstract public fun
/*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);
我想,如果不使用abstract,那么最后一行$t->check($cro)肯定是错的,但为什么它运行得很好呢。
我想问一个问题,用check方法进行课堂测试,$a->sound();动物体内不存在,但它仍在运行。它运行起来就像我打开comment抽象类一样,两者并没有什么不同。我真的很想知道,也许我对这个问题的理解是错误的,我们谈论的是动物和特定的动物,比如猫和鳄鱼。虽然在你的定义中,动物的概念与声音的方法无关,但从动物遗传而来的特定动物,如猫和鳄鱼,具有声音的能力。这就是你从更一般到更具体的过程。最后你会得到更多的细节
您的
动物
类
有一个受保护的
$name
成员以及一个getter和setter。它们很有用,因为您不必为鳄鱼
或猫
重新定义它们。但是你可以告诉动物
类
,你不知道声音
方法在细节上会是什么样子,但是你知道所有动物
都能发出声音
。这就是为什么类
是抽象的
:您可以实现它的一部分,但有些事情不能在动物
级别实现,因为不同类型的动物会有不同类型的声音。方法声音
存在于鳄鱼
类中。这就是它运行的原因。但在动物中没有,并且在鳄鱼
类对象上运行带有animal的参数check方法。此对象具有声音方法。无论Animal
是否有此方法,如果子类中存在此方法,都无关紧要。那么,为什么世界上存在抽象,而我们没有使用它,但仍在运行。像这样,我不能在《动物号》中定义声音()problem@KIM,这些只是设置或获取值的功能的名称。例如,name的setter是setName,name的getter是getName