我希望能够按照派生的顺序调用重写方法。
例如,在下面的代码中,我创建了一个名为 CallMeThird 的新类,并且在调用其CallMe
方法时,我希望它按顺序执行基类CallMe
方法继承性:
我想避免一些事情:
base.CallMe
OnCallMeFirst
和OnCallMeSecond
作为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");
}
}
}
答案 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,除非你有要求这个要求。
但是,如果你完全确定你想以任何理由避免这种情况,可以选择以下方式:
答案 2 :(得分:0)
考虑Template Method以避免使用多重继承。