我有一个抽象类,其方法需要子类分配的值。说:
<?php
abstract class Foo {
protected $value;
/* ..... other required properties here */
public function setValue($value) {
$this->value=$value;
}
public function getProcessedValue() {
// some processing here using $this->value;
return $processed_value;
}
/* ..... other public methods here using protected properties as inputs */
} end of class Foo
class ChildFoo extends Foo {
/* addtional code here */
} // end of class ChildFoo
// in main code
$child_foo=new ChildFoo();
$child_foo->setValue($value); /* how do you force this????? */
echo $child_foo->getProcessedValue();
?>
如何在使用前强制子类初始化受保护的属性?
$child_foo->setValue($value);
以下是我考虑过的一些事情:
1)使setValue成为一个抽象方法 - 这可能会迫使开发人员在子类中实现setValue,但是他们可能会不正确地使用它(DUH!)
2)SO中的帖子建议在构造函数中包含所需的参数 - 这可能有效,但由于已经有setValue(),所以看起来很多余。我计划保留setValue(),以便可以为不同的输入重用相同的对象。
这个问题的模式是否适用于大多数程序?
答案 0 :(得分:1)
我同意在构造函数中传递参数。为什么?那么,什么是构造函数呢?它构成了一个对象。如果你正在制作披萨,你必须用面团来制作。所有其他成分都是可选的。如果您的披萨对象依赖于面团,请将其传递给构造函数,因为披萨不是没有它的披萨。番茄酱怎么样?番茄酱是可选的。这就是为什么我们不用它来制作披萨。我们制作一个setter,如果他/她想要,用户可以设置(添加)番茄酱。我们应该做面团的制作者吗?是的,因为我们还没有制作()我们的披萨,而且设置其他类型的面团还为时不晚。
还有其他方法吗?大概。使用模板方法或类似的东西,但我认为没有必要这样做。