2014-02-22 45 views
0

我有一組繼承功能的類,具體取決於它們的功能。它們是屏幕元素:PHP繼承:不要重複自己與一個類都適合所有

一些例子是:
ScreenElement_Text_Area extends ScreenElement_Text extends ScreenElement ScreenElement_Text_Text extends ScreenElement_Text extends ScreenElement ScreenElement_Date_ddmmyyyyhhmm extends ScreenElement_Date extends ScreenElement

繼承使我不重複自己來指定不同的行爲(HTML代碼,樣式驗證)。簡單的例子:

ScreenElement::getTitle()
ScreenElement::getValue()
ScreenElement_Text::getMaxChars()
ScreenElement_Text_Money::getCurrency()

的問題是,這些類現在正在不同的使用場合和他們原定(這是描述的形式部分):對於例如,作爲表格中的列或描述出現在日曆中的信息。每個上下文都將方法和屬性添加到其他用例不需要的類中。例如:

當一個形式使用:getFormElement()
當在一個表中使用:calculateColumnWidth()
當日歷使用:getStartTime()

現在我問自己如何降低不斷增長的複雜!我想要更小,更專業的類,但不希望乘以類的數量或重複代碼,但我無法理解這一點。

回答

2

避免操縱太複雜結構的解決方案可能是使用Facade pattern。也就是說,例如:添加接口IScreenElement_Text_Area_Form,IScreenElement_Text_Area_TableIScreenElement_Text_Area_Calendar

ScreenElement_Text_Area實現這3個接口,但只在給定的上下文中使用最相關的接口。

通過這種方式,表單只能操作ScreenElement_Text_AreaIScreenElement_Text_Area_Form,所以它只能訪問getFormElement(),但不能訪問其他兩種方法。

這就是說,這只是一個可能的解決方案。例如,你也可以看看composition over inheritance