抽象类没有实现接口

时间:2010-07-11 15:26:10

标签: c# inheritance interface

我有一个接口,所以类编写器被迫实现某些方法。我还想允许一些默认的实现方法,所以我创建了一个抽象类。问题是所有类都继承自基类,所以我在那里有一些辅助函数。

我试着写:IClass in with abstract base但是我得到一个错误,基础没有实现接口。当然,因为我想要这个摘要并让用户实现这些方法。作为返回对象,如果我使用base我无法调用接口类方法。如果我使用界面,我无法访问基本方法。

我如何制作它以便我可以拥有这些辅助类并强制用户实现某些方法?

3 个答案:

答案 0 :(得分:15)

确保基类中的方法与接口具有相同的名称,并且它们是公共的。另外,将它们设为虚拟,以便子类可以覆盖它们而不隐藏它们。

interface IInterface {
   void Do();
   void Go();
}

abstract class ClassBase : IInterface {

    public virtual void Do() {
         // Default behaviour
    }

    public abstract void Go();  // No default behaviour

}

class ConcreteClass : ClassBase {

    public override void Do() {
         // Specialised behaviour
    }

    public override void Go() {
        // ...
    }

}

答案 1 :(得分:6)

将接口方法移动到抽象类中,并将它们声明为抽象类。通过这种方式,派生类被迫实现它们。如果您需要默认行为,请使用抽象类,如果您只想修复签名,请使用接口。这两个概念都不混合。

答案 2 :(得分:0)

最近遇到了同样的问题,我想出了一个更优雅(在我看来)的解决方案。它看起来像:

public interface IInterface
{
    void CommonMethod();
    void SpecificMethod();
}

public abstract class CommonImpl
{
    public void CommonMethod() // note: it isn't even virtual here!
    {
        Console.WriteLine("CommonImpl.CommonMethod()");
    }
}

public class Concrete : CommonImpl, IInterface
{
    void SpecificMethod()
    {
        Console.WriteLine("Concrete.SpecificMethod()");
    }
}

现在,根据C#规范(13.4.4。接口映射),在IInterfaceConcrete上映射的过程中,编译器将在{{1}中查找CommonMethod它也是,甚至不必在基类中是虚拟的!

与Mau的解决方案相比,另一个重要优势是您不必列出抽象基类中的每个接口成员。