部分實現接口
回答
接口定義合同。如果您想使用它,您必須通過實施其所有成員來履行該合同。
也許抽象類的使用最適合你,這樣你可以定義一些默認行爲,同時允許覆蓋你需要的地方。
@Dan:「如果你想使用它,你必須通過實現它的所有成員來履行合同。」不總是。傑森提出了一個很好的反例:IEnumerator。 – 2010-02-25 19:31:42
對於您不想實現的方法,您可以拋出NotImplementedException
,對於不能實現的方法,您可以拋出NotSupportedException
。
最好不要這樣做,但是在.NET框架中有些地方拋出了類NotSupportedException
和Stream
的設計,這很強制您爲某些方法拋出此異常。
從MSDN約NotSupportedException異常:
被拋出時,不支持的調用的方法,或異常時,有閱讀,尋求,或寫入不支持調用流的嘗試功能。
實際上,如果枚舉器不支持重置到初始位置,那麼'IEnumerator.Reset'的準則是拋出'NotSupportedException'。 – jason 2010-02-25 19:20:11
@Jason,是的,有些Streams也可以做到這一點(請參閱我的更新)。但是我個人認爲抽象的Stream類是一個醜陋的設計。但事情就是這樣,所以在某些情況下你幾乎不得不拋出NotSupportedException。製作幾個不同的Stream接口可能會更好。我想知道如果他們不得不從頭開始重新設計,那麼製作Stream類的團隊是否會做出相同的設計選擇。 – 2010-02-25 19:23:55
正如其他人所說的界面應得到充分實施(雖然這種情況有解決辦法像扔NotSupportedExceptions)
你應該的接口分離原則看一看的SOLID priciples(一個羅伯特馬丁討論),並找出你是否真的需要多個接口,然後類可以選擇實現哪些接口
是的,你可以部分實現接口,如果你使用類似這樣的抽象類:
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
}
和其他帖子一樣,除了隱藏成員之外,拋出異常是最好的選擇。
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
}
}
- 1. 接口實現(接口分離原理)
- 2. 分離接口和實現
- 3. 將接口實例分配給實現該接口的類
- 4. 實現接口
- 5. 實現接口
- 6. 實現接口
- 7. 實現接口
- 8. 接口實現
- 9. 訪問實現不是接口的一部分的接口的類的功能
- 10. 通過.NET Remoting實現內部接口
- 11. C#cs0660誤差(實現接口部件)
- 12. 實現靜態內部接口Scala的
- 13. 實現內部非靜態接口
- 14. 爲什麼匿名類不能實現兩個分離的接口,但可以實現內部接口?
- 15. 部分類中接口實現的問題
- 16. 我可以部分實現接口層次嗎?
- 17. 如何在派生類或通過部分類實現接口?
- 18. 最好的接口模擬/假的部分實現
- 19. .NET中接口的部分顯式實現
- 20. 問題在分離接口和實現
- 21. 接口的分離與實現
- 22. 內部接口在公共接口中的實現
- 23. C#接口實現
- 24. 接口實現C#
- 25. 實現AIDL接口
- 26. 實現Iterable接口
- 27. TypeScript接口實現
- 28. GetEnumerator接口實現
- 29. 實現IDataErrorInfo接口
- 30. Java實現接口
爲什麼你想這樣做?界面的其他部分有什麼問題 - 你不想實現的部分? – 2010-02-25 19:16:11
我不認爲你明白接口的意義。你想做什麼? – SLaks 2010-02-25 19:16:19
也許界面實際上應該是兩個界面? – Greg 2010-02-25 19:17:31