我问了类似的东西,但我还没有明确的想法。我的目标是在 C#中部分实现一个接口。
有可能吗?是否有任何模式可以实现这一结果?
答案 0 :(得分:13)
接口定义合同。如果您想使用它,您必须通过实施所有成员来履行该合同。
使用抽象类可能最适合您,这样您就可以定义一些默认行为,同时允许覆盖您需要的地方。
答案 1 :(得分:8)
您可以针对您不想实施的方法投放NotImplementedException
,或针对您无法实施的方法投放NotSupportedException
。
最好不要这样做,但是.NET框架中有些地方会抛出NotSupportedException
个类,而Stream
的设计几乎会迫使你为某些方法抛出这个异常。
从MSDN关于NotSupportedException:
不支持调用的方法时,或者尝试读取,搜索或写入不支持调用的功能的流时抛出的异常。
答案 2 :(得分:3)
正如其他人所说的那样,接口应该完全实现(虽然有很多方法可以解决这个问题,比如抛出NotSupportedExceptions)
您应该看一下接口隔离原则(Robert Martin讨论的SOLID priciples之一),并确定您是否确实需要多个接口,然后类可以选择哪些接口实施
答案 3 :(得分: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
}
答案 4 :(得分:1)
接口中方法的某些实现在一组类中是完全可能的,而其余的则需要唯一地实现。
使用抽象类需要您使用抽象方法重新声明未实现的方法,这是多余的,因为接口中已有声明。异常方法也不是最好的方法,因为如果您不小心,则只有在看到错误消息时才知道在运行时实现的“缺失”实现。
这是一种无需抽象类且不使用异常的方法。接口中的方法之一是以单独的(也许是通用的)方式实现的。因此,您只需要在实现类中实现“其余”即可。
interface Interface
{
void A();
void B();
}
class PartialImplementer
{
public void B()
{
// common implementation
}
}
class Implementation : PartialImplementer, Interface
{
public void A()
{
// unique implementation
}
}
答案 5 :(得分: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
}
}