2013-10-02 51 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