C# 如何从子级强制调用基方法
我有多个继承抽象类的类。我在基类中创建了一个方法,它对所有子类都是泛型的。我希望所有子类强制调用该方法,否则应该显示编译错误C# 如何从子级强制调用基方法,c#,asp.net,inheritance,parent-child,C#,Asp.net,Inheritance,Parent Child,我有多个继承抽象类的类。我在基类中创建了一个方法,它对所有子类都是泛型的。我希望所有子类强制调用该方法,否则应该显示编译错误 如何实现这一点?只需在基类构造函数中进行调用。任何派生对象都必须调用基类构造函数,以确保在创建对象时始终调用强制方法: public abstract class Base { protected Base() { //.... mandatoryMethod(); } private void
如何实现这一点?只需在基类构造函数中进行调用。任何派生对象都必须调用基类构造函数,以确保在创建对象时始终调用强制方法:
public abstract class Base
{
protected Base()
{
//....
mandatoryMethod();
}
private void mandatoryMethod() { ... }
public abstract Foo Frob();
}
public class Derived: Base
{
public Derived(....)
{
//new Base() will have been called when execution reaches this point.
}
public override Foo Frob() { ... }
}
当然,这有一些局限性:
派生的
的构造函数完成运行后需要调用MandatoryMethod
,这将不起作用派生的方法之前调用MandatoryMethod
,那么这将不起作用,您也无法强制执行。如果您拥有所有消费者的代码,您唯一的选择是代码审查,如果您不拥有,则更改需求
编译器的工作是编译合法代码并禁止非法代码。不从
Derived
调用Base
中定义的任何给定方法并不违法;这是应用程序中的逻辑需求,而不是语言需求。你不能用编译器强制执行这一点,你能得到的最接近的方法是使用构造函数解决方案,其中编译器确实保证在构造派生的对象时总是调用MandatoryMethod
。你能显示你当前的代码吗?没有代码很难猜测,但是我想不出没有调用方法会导致编译器错误。什么时候应该调用该方法?如果应该在创建期间调用它,基类应该只公开所需的构造函数。否则,当基类具有公开的方法时,逻辑应该颠倒,该方法调用所有继承者都应该实现的抽象(受保护)方法。如果所有子类都必须调用此方法,那么为什么不能在基类中调用它呢?抽象类的实例构造函数(您的public base()
)不应该是公共的。将其公开有点令人困惑,因为您不能在任何地方说newbase()
,构造函数的唯一用途是从派生类链接它,因此在这种情况下说protectedbase()
是正常的。