部分实现接口
回答
接口定义合同。如果您想使用它,您必须通过实施其所有成员来履行该合同。
也许抽象类的使用最适合你,这样你可以定义一些默认行为,同时允许覆盖你需要的地方。
@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