Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从子级强制调用基方法_C#_Asp.net_Inheritance_Parent Child - Fatal编程技术网

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()
    是正常的。