2012-03-29 98 views
1

我發現自己希望一個接口可以由在幾個類中實現的方法組成。如果我能做到這一點,我可以爲一個角色創建一個接口,該角色具有該類中的一個函數和該類中的一個函數。兩個類之間的接口拆分

任何語言對此支持嗎?典型的Java/C#/ VB.NET風格的OO有可能嗎?

例如:我有一個函數,它接受一個值對象,並將所有零件保存到正確的表中。我只是創建了一個名爲StatsPersistence的接口,我將其注入到函數中,以便我可以對其行爲進行單元測試,但它缺少一種方法。我想能夠添加一個方法,但該方法與前兩個不同的類,所以這顯然是不可能的。所以,我在一個類中有兩個方法,另一個在另一個類中,但它們都是「StatsPersistence」的「角色」所需的。而且,這些方法也是其他角色所需要的三種方法,而不僅僅是這一方面。

我有什麼:

interface StatsPersistence 
    public saveSession(session) // fulfilled in much larger StatsActiveRecord 
    public saveAppUse(appUse) // fulfilled in much larger StatsActiveRecord 

我想要什麼:

interface StatsPersistence 
    public saveSession(session) // fulfilled in much larger StatsActiveRecord 
    public saveAppUse(appUse) // fulfilled in much larger StatsActiveRecord 
    public updateUnit(name)  // fulfilled in much larger UnitActiveRecord 

可以只是使包裝所有三種方法一個新的類,並有該類剛剛作出的呼籲兩個實現者,但這看起來就像很多OOverkill一樣。

我的想法是傾向於:

  • 我的界面作用過於寬泛
  • 作出這樣的包裝這三個類,並讓它實現我想要的界面
+1

可能是門面模式? – 2012-03-30 00:45:11

+0

「接口是類必須滿足的合同」而不是「類是接口必須應用的合同」。 – Dhananjay 2012-03-30 10:58:09

+0

@Dhananjay我知道,我只是希望可能有一個「未知的未知」潛藏在我對界面和類的理解之外,以及它們如何構成。也許一些新特性的使用,或者我不知道的函數式編程技術。 – Steve 2012-04-02 14:15:06

回答

2

假設你有一個變量類型StatsPersistence。接口契約強制StatsPersistence的任何實例擁有三種方法。因此,StatsActiveRecord不能存儲爲StatsPersistence,而UnitActiveRecord也不能。這意味着兩個對象都不能成爲StatsPersistence的實例,因爲這兩個對象都不滿足接口合同。因此,在類之間拆分接口實現是不可能的。

有幾種選擇。

正如您所提到的,您可以擁有一個實現接口並調用兩個獨立類的主類。這可能會很棘手,因爲這兩個'小類'是由主人聯繫在一起的。

您提到的界面過於寬泛。如果合適,您可以拆分接口。

最好的解決方案(在一般情況下)是組合類。如果兩個班級必須一起工作來決定誰做某些事情,那麼他們可能是一個班級。

相關問題