从派生类(或替代设计)调用函数

时间:2017-09-27 09:11:30

标签: c#

我有一个C#类来检测和处理某些事件。我想从这个类中派生出以不同方式对事件作出反应的子类,如下所示:

public class Detector
{
     void EventXHasHappened()
     {
         React();
     }

     protected virtual void React()
     {
     }
}

public class Derived : Detector
{
   protected override void React()
   {
      // Never gets called
   }
}

如果我理解正确,这不起作用,因为无法从基类调用派生类中的函数。有没有一种巧妙的方法可以做到这一点,还是整个方法都错了? (那么什么是好的设计?)

4 个答案:

答案 0 :(得分:0)

可以从派生类中调用方法;您将继承EventXHasHappened方法,因此,对于所有意图和目的,您的代码将起作用。

var d = new Derived();
d.EventXHadHappened();  // This will call d.React();

答案 1 :(得分:0)

var derived = new Derived();
derived.EventXHasHappened();

这是有效的代码。将调用React(),您可以在任何派生类中重写React()并更改行为。

作为' React'是一个受保护的方法,它可以被任何子类调用。此外,虚拟关键字意味着它被设计为被覆盖并在基类中使用!

答案 2 :(得分:0)

如果我理解你的问题,可能是你试图用反应方法实现多态行为:如果是,那么请按照下面的文章: https://www.infoworld.com/article/3024718/application-development/how-to-implement-polymorphism-in-c.html

答案 3 :(得分:0)

上面的代码有效,并且会调用派生的覆盖。但是,如果基础中没有React的实现,并且可能没有实例化其中一个的逻辑,那么我将使用抽象类,React作为抽象方法:< / p>

public abstract class Detector
{
    public void EventXHasHappened()
    {
        React();
    }
    protected abstract void React();
}

public class Derived : Detector
{
    protected override void React()
    {
        //TODO - your code
    }
}

然后:

Detector d = new Derived();
d.EventXHasHappened();