2016-12-02 61 views
0

假設我需要一組類實現所有方法 X,Y和Z才能正常工作。在這種情況下,我可以讓他們實施一個通用界面來強制這一點。強制類實現一組方法之一

現在,我的情況有點不同 - 我的課程需要實現至少有一個 X,Y和Z,不一定全部。接口在這裏幫不了我。我能想到的最接近的是一個共同的父母 - 它可以檢查X,Y或Z在其結構中的存在。

我寧願避免在這裏繼承,因爲我可能需要在已經有一個父類的類中實現這個「接口」。所以 - 是否有另一種優雅的方式來做到這一點?

(我在PHP中的工作,但如果一般的OOP的解決方案存在,它可用於更廣泛的受衆。)

+0

接口可以幫助你。這些接口擴展了一個通用接口。不知道你希望如何繼承,除非你想每次檢查它是哪一個。 –

+3

聽起來像一個糟糕的建築/設計。你能解釋一下爲什麼你需要「實現X,Y,Z中的至少一個」嗎? –

+0

@WaxCage我們有配置值訪問類。有些可以從數據庫中獲取它們,另一些從配置文件中獲取,另一些則可以從硬編碼數組中獲取。你可以通過getAsString(),getAsParamObject()或類似的方法從這樣的類中獲得一個值。 這絕對是一個糟糕的設計,但這是我現在需要處理的一個設計。 這些配置類經常被修改(和破壞),所以我想在重構整個事物之前確保它們的基本功能(至少以某種方式獲取值)。 –

回答

1

我寧願避免遺產在這裏,因爲我可能需要實現這個「接口「在已經有一個父類的類中。所以 - 是否有另一種優雅的方式來做到這一點?

如果我理解正確的話,你可以解決這個問題,通過Traits

trait DefaultImpl 
{ 
    public function x() 
    { 
     echo "Default implementation of x()\n"; 
    } 

    public function y() 
    { 
     echo "Default implementation of y()\n"; 
    } 

    public function z() 
    { 
     echo "Default implementation of z()\n"; 
    } 
} 

class XImpl 
{ 
    use DefaultImpl; 

    public function x() 
    { 
     echo "Custom implementation of X\n"; 
    } 
} 

$x = new XImpl(); 
$x->x(); 
$x->y(); 
$x->z(); 

這不是從設計的角度來看一個非常好的解決方案。但它比不必要的繼承更好。

相關問題