问题描述
|
我是OO编程的新手,我试图了解如何以适当的方式将值分配给子类的通用属性。我总是每次都会以不同的方式来做,所以我想问问你平时的工作是一个好主意。
假设我有一个父类Fruit,还有两个子类Apple和Banana。
abstract class Fruit {
protected $color; //empty property
protected function getColor(){
return $this->color;
}
}
class Apple extends Fruit {
protected $color = \'red\';
}
class Banana extends Fruit {
protected $color = \'yellow\';
}
?>
每个子类必须具有属性color,例如,超类中的getColor函数将使用该属性。
但是我该如何处理财产?
我在父级中定义了空变量$ color。然后,在子类中设置变量$ color,然后通过parent :: __ construct将其传递给父级,以将值分配给父级中的属性。
我在父级中定义了空变量$ color。然后,我只是在子类中使用$ this-> color来设置值。
我在每个子类中定义属性,然后像这样保留它。继承的方法仍然可以使用它。
我想认为最好是收集父类中的通用属性,但是写这么多行来设置一些值感觉有点过头(如果我有很多属性,还有很多功能参数)。第二个和第三个有效,但是很难看出我实际上需要定义该属性。
我在这里应该怎么看?我对所有的OO思维方式都感到困惑,以至于我几乎没有编写任何代码,哈哈。
谢谢。
解决方法
没有“银色子弹”。通常,应通过构造函数的参数设置所有子类中期望不同的字段,以确保对其进行显式设置。其他字段可以通过将值分配给属性来初始化。
例如,可以通过为属性分配值来设置水果的颜色(因为许多水果可以是红色的),但是名称应由构造函数的参数设置(因为名称唯一地标识了水果)。
, 您的所有子类都将继承color属性。
protected
关键字将确保它继承给孩子,但不能被外界使用。您不需要在子级中声明$this->color
,因为它已经存在,您可以在子级中的方法中为$this->color
赋值。
, 最好的方式显示在您的清单上-为class属性分配默认值。但是我可能会在代码中利用一些依赖注入的想法,然后将默认值传递给构造函数。