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:…然后最终它会在某些隐式转换上失败,也会在编译时失败。尽管我同意这个解决方案缺乏明确的严格性。