C# 抽象类不实现接口

C# 抽象类不实现接口,c#,inheritance,interface,C#,Inheritance,Interface,我有一个接口,因此类编写器必须实现某些方法。我还想允许一些默认实现的方法,所以我创建了一个抽象类。问题是所有类都从基类继承,所以我在基类中有一些助手函数 我试图用抽象基编写:IClass,但我得到了一个错误,即该基没有实现接口。当然,因为我想要这个摘要,并让用户实现这些方法。作为返回对象,如果使用base,则无法调用接口类方法。如果使用该接口,则无法访问基本方法 如何使其具有这些助手类并强制用户实现某些方法?将接口方法移动到抽象类中,并将其声明为抽象。由此,派生类被迫实现它们。如果您想要默认行为

我有一个接口,因此类编写器必须实现某些方法。我还想允许一些默认实现的方法,所以我创建了一个抽象类。问题是所有类都从基类继承,所以我在基类中有一些助手函数

我试图用抽象基编写
:IClass
,但我得到了一个错误,即该基没有实现接口。当然,因为我想要这个摘要,并让用户实现这些方法。作为返回对象,如果使用base,则无法调用接口类方法。如果使用该接口,则无法访问基本方法


如何使其具有这些助手类并强制用户实现某些方法?

将接口方法移动到抽象类中,并将其声明为抽象。由此,派生类被迫实现它们。如果您想要默认行为,请使用抽象类;如果您只想固定签名,请使用接口。这两个概念不能混用。

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

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() {
        // ...
    }

}

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

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#spec(13.4.4.接口映射),在映射
IInterface
Concrete
类的过程中,编译器也会在
CommonImpl
中查找
CommonMethod
,它甚至不必在基类中是虚拟的


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

我更喜欢Mau的解决方案。它是显式的,让编译器为您执行一致性工作。在这个解决方案中,您可能会忘记将IInterface添加到派生类中。@PlayTank:…然后最终它会在某些隐式转换上失败,也会在编译时失败。尽管我同意这个解决方案缺乏明确的严格性。