我有一个接口,所以类编写器被迫实现某些方法。我还想允许一些默认的实现方法,所以我创建了一个抽象类。问题是所有类都继承自基类,所以我在那里有一些辅助函数。
我试着写:IClass in with abstract base但是我得到一个错误,基础没有实现接口。当然,因为我想要这个摘要并让用户实现这些方法。作为返回对象,如果我使用base我无法调用接口类方法。如果我使用界面,我无法访问基本方法。
我如何制作它以便我可以拥有这些辅助类并强制用户实现某些方法?
答案 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。接口映射),在IInterface
类Concrete
上映射的过程中,编译器将在{{1}中查找CommonMethod
它也是,甚至不必在基类中是虚拟的!
与Mau的解决方案相比,另一个重要优势是您不必列出抽象基类中的每个接口成员。