C# - 按继承顺序调用派生类中的重写方法

时间:2015-04-19 10:19:38

标签: c# inheritance override abstract

我希望能够按照派生的顺序调用重写方法。

例如,在下面的代码中,我创建了一个名为 CallMeThird 的新类,并且在调用其CallMe方法时,我希望它按顺序执行基类CallMe方法继承性:

  • CallMeFirst
  • CallMeSecond
  • CallMeThird

我想避免一些事情:

  • 在派生类中调用base.CallMe
  • 使用OnCallMeFirstOnCallMeSecond作为CallMe仍然会向派生类公开,代码可能会变得混乱。

在这种情况下,我可以使用一个漂亮,干净的模式吗?

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Base b = new CallMeThird();
            b.CallMe();

            while (Console.ReadKey().Key != ConsoleKey.Escape)
            {

            }
        }
    }

    public abstract class Base
    {
        public abstract void CallMe();
    }

    public class CallMeFirst : Base
    {
        public override void CallMe()
        {
            Console.WriteLine("I would like to be called first");
        }
    }

    public class CallMeSecond : CallMeFirst
    {
        public override void CallMe()
        {
            Console.WriteLine("I would like to be called second");
        }
    }

    public class CallMeThird : CallMeSecond
    {
        public override void CallMe()
        {
            Console.WriteLine("I would like to be called third");
        }
    }
}

3 个答案:

答案 0 :(得分:1)

base.CallMe();添加到每个覆盖中,这样它将链接您的继承层次结构。

您可以随心所欲地避免它,但这是解决方案。覆盖意味着替换,如果你想使用父类实现,你最好称之为。

但是,我认为这里不需要继承。如果CallMeThird只使用CallMeSecond(依此类推)而不是需要与它互换,I would prefer composition。这意味着CallMeThird将包含CallMeSecond并返回对其CallMe方法的调用。这个例子是为了知道你的问题是否是一个组合或继承问题而被剥离。

答案 1 :(得分:1)

正如内森所指出的,通过base进行呼叫的能力确实存在,并且它可能是实现您想要的最简单,最干净,最高效和最稳定的方式。因此,我建议不要avoiding the feature that exists specifically to solve your problem,除非你有要求这个要求。

但是,如果你完全确定你想以任何理由避免这种情况,可以选择以下方式:

  1. 避免多态(使这些方法非虚拟)。
  2. 定义自定义属性。
  3. 使用该属性在每个类中装饰所需的方法。
  4. 在基类中的方法中,使用反射来构建继承链(从基类到对象的实际类)。
  5. 对于链中的每个类型,选择使用您的属性修饰的方法。
  6. 对于生成的方法序列,按所需顺序调用每个方法。

答案 2 :(得分:0)

考虑Template Method以避免使用多重继承。