部分实现接口

时间:2010-02-25 19:13:00

标签: c# interface

我问了类似的东西,但我还没有明确的想法。我的目标是在 C#中部分实现一个接口。

有可能吗?是否有任何模式可以实现这一结果?

6 个答案:

答案 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
    }
}