0

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

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

对于大多数程序来说,这个问题是否有任何常见的模式?

4

1 回答 1

1

我同意在构造函数中传递参数。为什么?那么,什么是构造函数呢?它是构造对象的东西。如果您正在制作比萨饼,则必须使用面团制作它。所有其他成分都是可选的。如果您的披萨对象依赖于面团,请将其传递给构造函数,因为没有它,披萨就不是披萨。番茄酱呢?番茄酱是可选的。这就是为什么我们不用它来制作披萨的原因。我们制作了一个设置器,用户可以根据需要设置(添加)番茄酱。我们应该为面团做一个二传手吗?是的,因为我们还没有构建()我们的比萨饼,现在设置其他类型的面团还为时不晚。

还有其他方法吗?大概。使用模板方法或类似方法,但我认为这样做没有意义。

于 2013-10-02T13:34:24.760 回答