我正在尝试用PHP学习OOP,现在我已经达到了抽象类。
我在理解何时应该在抽象类中实现抽象方法以及何时不应该实现抽象方法时遇到一些问题。
例如,请输入以下代码:
<?php
abstract class concept_car {
/**
* Properties can not be declared as abstract natively:
* http://stackoverflow.com/questions/7634970/php-abstract-properties
*/
protected $weelNum = NULL;
protected $doorsNum = NULL;
protected $color = NULL;
protected $carType = NULL;
// the inheritance class must define this methods
abstract public function setWeelNum($weelNum);
abstract public function setDoorsNum($doorsNum);
abstract public function setCarType($carType);
}
我不知道将3个方法声明为抽象是否可以,或者我应该删除抽象并实现它们,因为这些属性与方法属于同一个类。
在代码的实际形式中,我认为我必须在这里将方法声明为abstract,并在子类中的继承类中实现它们,但我不知道这是否正确。
P.S:我是一名初学者,我正在努力了解情况如何,我还没有达到设计模式,所以请在概念中解释我,以便我知道什么是正确的方法。答案 0 :(得分:7)
简单的问题你必须问自己:
扩展此类的所有类都做同样的事情吗?
对于这个例子,答案是肯定的,他们都会做
public function setWeelNum($weelNum) {
$this->weelNum = $weelNum;
}
所以不要在每个类中复制/粘贴该代码,这没有意义。
当该班级的所有孩子必须以不同方式实施此方法时。
例如,在课程Animal
中,您将拥有public abstract function move();
,因为所有动物都会移动,但您不知道具体是什么。
答案 1 :(得分:4)
通常,您应该在最后一个共同祖先中实现所有方法。因此,如果您希望您的子类的行为方式相同,请立即实现它们。如果要实现它们,但在不同的类中以多种方式实现它们,请将它们抽象化。
实际上,抽象类只是为了要求如果有人从这个公共类继承某些东西,他将提供这些方法(抽象类与接口类似)。
如果实现所有这些,则无需使用抽象类。