强制子类初始化受保护的属性

时间:2013-10-02 08:18:33

标签: php oop design-patterns override instantiation

我有一个抽象类,其方法需要子类分配的值。说:

<?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(),以便可以为不同的输入重用相同的对象。

这个问题的模式是否适用于大多数程序?

1 个答案:

答案 0 :(得分:1)

我同意在构造函数中传递参数。为什么?那么,什么是构造函数呢?它构成了一个对象。如果你正在制作披萨,你必须用面团来制作。所有其他成分都是可选的。如果您的披萨对象依赖于面团,请将其传递给构造函数,因为披萨不是没有它的披萨。番茄酱怎么样?番茄酱是可选的。这就是为什么我们不用它来制作披萨。我们制作一个setter,如果他/她想要,用户可以设置(添加)番茄酱。我们应该做面团的制作者吗?是的,因为我们还没有制作()我们的披萨,而且设置其他类型的面团还为时不晚。

还有其他方法吗?大概。使用模板方法或类似的东西,但我认为没有必要这样做。