2013-10-02 50 views
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(),以便同一个对象可以重用于不同的输入。

这个问题有什么模式可能是大多数程序常见的吗?

回答

1

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

还有别的办法吗?大概。使用模板方法或类似的东西,但我没有看到这样做的意义。

+0

谢谢!听起来很明显,现在你解释它的方式。一个简单的比喻就是过分分析。 – alds

+0

对不起延迟赏金。我一直在思考这个问题,并一直在看别人的代码。你所建议的是一个很好的指导方针/模式,用精心设计的例子来说明。现在,当我创建我的课程时,我总是制定哪些参数是必需的,哪些是可选的。我按照你的建议做了,并将所需的参数放在构造函数中。 Setter函数现在提供了一种方法来包含修改默认状态/行为(由所需参数提供的默认状态)的可选参数。非常感谢您帮助我进一步提高OOP技能! – alds