2010-02-25 60 views
3

我問了類似的問題,但仍然沒有一個清晰的想法。我的目標是部分實現在C#中的一個接口。部分實現接口

可能嗎?有什麼模式可以達到這個結果嗎?

+0

爲什麼你想這樣做?界面的其他部分有什麼問題 - 你不想實現的部分? – 2010-02-25 19:16:11

+1

我不認爲你明白接口的意義。你想做什麼? – SLaks 2010-02-25 19:16:19

+4

也許界面實際上應該是兩個界面? – Greg 2010-02-25 19:17:31

回答

13

接口定義合同。如果您想使用它,您必須通過實施其所有成員來履行該合同。

也許抽象類的使用最適合你,這樣你可以定義一些默認行爲,同時允許覆蓋你需要的地方。

+0

@Dan:「如果你想使用它,你必須通過實現它的所有成員來履行合同。」不總是。傑森提出了一個很好的反例:IEnumerator。 – 2010-02-25 19:31:42

8

對於您不想實現的方法,您可以拋出NotImplementedException,對於不能實現的方法,您可以拋出NotSupportedException

最好不要這樣做,但是在.NET框架中有些地方拋出了類NotSupportedExceptionStream的設計,這很強制您爲某些方法拋出此異常。

MSDN約NotSupportedException異常:

被拋出時,不支持的調用的方法,或異常時,有閱讀,尋求,或寫入不支持調用流的嘗試功能。

+0

實際上,如果枚舉器不支持重置到初始位置,那麼'IEnumerator.Reset'的準則是拋出'NotSupportedException'。 – jason 2010-02-25 19:20:11

+0

@Jason,是的,有些Streams也可以做到這一點(請參閱我的更新)。但是我個人認爲抽象的Stream類是一個醜陋的設計。但事情就是這樣,所以在某些情況下你幾乎不得不拋出NotSupportedException。製作幾個不同的Stream接口可能會更好。我想知道如果他們不得不從頭開始重新設計,那麼製作Stream類的團隊是否會做出相同的設計選擇。 – 2010-02-25 19:23:55

2

正如其他人所說的界面應得到充分實施(雖然這種情況有解決辦法像扔NotSupportedExceptions)

你應該的接口分離原則看一看的SOLID priciples(一個羅伯特馬丁討論),並找出你是否真的需要多個接口,然後類可以選擇實現哪些接口

2

是的,你可以部分實現接口,如果你使用類似這樣的抽象類:

public interface myinterface 
{ 
    void a(); 
    void b(); 
} 
public abstract class myclass : myinterface 
{ 
    public void a() 
    { 
     ///do something 
    } 

    public abstract void b(); // keep this abstract and then implement it in child class 
} 
0

和其他帖子一樣,除了隱藏成員之外,拋出異常是最好的選擇。

interface IPartial 
{ 
    void A(); 
    void B(); 
} 

class Partial : IPartial 
{ 
    public void A() 
    { 
     // Implementation here 
    } 
    void IPartial.B() 
    { 
     throw new NotImplementedException(); 
    } 
} 

class Main 
{ 
    Main() 
    { 
     Partial t = new Partial(); 
     t.A(); 
     t.B(); // Compiler error 

     IPartial s = new Partial(); 
     s.A(); 
     s.B(); // Runtime error 
    } 
}