部分实现接口
回答
接口定义合同。如果您想使用它,您必须通过实施其所有成员来履行该合同。
也许抽象类的使用最适合你,这样你可以定义一些默认行为,同时允许覆盖你需要的地方。
@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. 实现静态内部接口Scala的
- 7. 实现内部非静态接口
- 8. 为什么匿名类不能实现两个分离的接口,但可以实现内部接口?
- 9. 部分类中接口实现的问题
- 10. 如何在派生类或通过部分类实现接口?
- 11. 最好的接口模拟/假的部分实现
- 12. 接口的分离与实现
- 13. 问题在分离接口和实现
- 14. 实现和接口
- 15. 实现接口C#
- 16. 实现AIDL接口
- 17. Java接口实现
- 18. GetEnumerator接口实现
- 19. 实现Iterable接口
- 20. 实现IConvertible接口
- 21. 类设计:类实现接口实现另一个接口
- 22. 将显式接口实现重构隐式接口实现
- 23. 接口实现时不透露实现接口的类
- 24. 实现与接口集合的接口
- 25. 在接口中实现接口属性?
- 26. 如何以某种方式实例化部分实现接口的类
- 27. 正确类型进口零部件不共享接口实现
- 28. Vaadin Widgetset编译 - 实现外部接口的小部件
- 29. 德尔福接口实现
- 30. 匿名类实现接口
为什么你想这样做?界面的其他部分有什么问题 - 你不想实现的部分? – 2010-02-25 19:16:11
我不认为你明白接口的意义。你想做什么? – SLaks 2010-02-25 19:16:19
也许界面实际上应该是两个界面? – Greg 2010-02-25 19:17:31