2013-05-10 60 views
2

我有一個接口,這是類A,B和C共同但現在我需要添加兩種方法,只適用於B類和不適用於類A & C. So ,我是否需要將這兩種方法添加到通用接口本身,並在類A & C中拋出未實現的異常,還是有更好的方法來做到這一點嗎?C# - 接口/類設計問題

interface ICommon 
{ 
    Method1; 
    Method2; 
    Method3; 
    Method4; 
} 

Class A: ICommon 
{ 
    Method1; 
    Method2; 
} 

Class B: ICommon 
{ 
    Method1; 
    Method2; 
    Method3; 
    Method4; 
} 

Class C: ICommon 
{ 
    Method1; 
    Method2; 
} 

在此先感謝

+1

爲什麼不能在類'B'上實現它們,而不將它們作爲接口的一部分?換句話說 - 你爲什麼要在界面上使用這些方法? – Oded 2013-05-10 17:15:55

+0

我第二次@Oded可能會在您對事物進行建模的過程中出現錯誤。 – gideon 2013-05-10 17:18:43

+0

事實上,我們在所有類A,B和C中只有兩種方法。但是現在只有我們已經獲得了僅適用於類B的此要求。此外,我只能在類B上實現此功能,但客戶端應用程序指的是ICommon接口由工廠類創建。 – user972255 2013-05-10 17:23:28

回答

8

如果這些方法是共同的其他類(不只是B):

具有B-擴展另一個接口

interface ICommon2 
{ 
    Method3; 
    Method4; 
} 

class B : ICommon, ICommon2 
{ 
    Method1; 
    Method2; 
    Method3; 
    Method4; 
} 

如果這些方法是特定於只有B:

class B : ICommon 
{ 
    Method1; 
    Method2; 
    Method3; 
    Method4; 
} 
+4

根據具體情況,從ICommon繼承'ICommon2'也是一個好主意。 – 2013-05-10 17:18:16

+0

它可以。但它不是在這種情況下,因爲@ user972255不希望Method3和Method4在類A或B中 – 2013-05-10 17:21:52

+0

@ jeremy-todd說的是,代替B從兩個接口繼承,一個選項是讓第二個接口繼承第一個B只能從ICommon2繼承。它仍會完成與您的代碼相同的功能。正如jeremy所說,這取決於你的界面和類所代表的。 – Tombala 2013-05-10 17:25:48

0

如果兩個類必須實現相同的接口,但其中一個類需要比接口包含的方法更多的方法,則這些方法不屬於該接口。否則,其他班級也需要這些方法。

接口描述行爲,如IDisposable指示Dispose()方法。如果你的Method3()和Method4()實現了某些行爲,你應該只從這兩個方法中提取一個接口,並將該接口應用到需要這些方法的類。

1

如果接口有方法,你就必須實現它們,但你可以偷偷做:

Class A: ICommon 
{ 
    public void Method1() 
    { 
    } 

    public void Method2() 
    { 
    } 

    void ICommon.Method3() 
    { 
     throw new NotSupportedException(); 
    } 

    void ICommon.Method4() 
    { 
     throw new NotSupportedException(); 
    } 
} 

這是一個數組究竟是如何implemments的IList接口和隱藏成員一樣Add

+0

我不認爲@ user972255需要在接口上使用Method3和Method4,因爲他詢問「我是否需要將這兩種方法添加到通用接口中。」但是解釋如何用顯式接口實現「隱藏」方法很有幫助。 +1 – 2013-05-10 17:43:26

+0

@Steaks:我知道有不同的方式來看待這個「問題」。既然你給出了一個很好的答案,我提供了這種不同的方法,這可能無助於OP,但也許其他方法。 – 2013-05-10 17:46:24

+0

完全同意!這就是我在評論中試圖說的,也是爲什麼我高舉你的答案。 – 2013-05-10 17:48:38