没有调用多级继承的base.Method()
本文关键字:base Method 继承 调用 多级 | 更新日期: 2023-09-27 18:12:03
我已经搜索过了,没有找到任何解决我的问题的方法。我的场景很简单:
public class A
{
public virtual void MethodOne()
{
Console.log( "A" );
}
}
public class B : A
{
public override void MethodOne()
{
base.MethodOne();
Console.log( "B" );
}
}
public class C : B
{
public override void MethodOne()
{
base.MethodOne();
Console.log( "C" );
}
}
我想做的是有一个类C的实例(我们将其命名为'instanceC')调用父类和祖父类的重写方法。所以我希望这样:
instanceC.MethodOne();
// Output:
// "A"
// "B"
// "C"
但是我得到了这个:
instanceC.MethodOne();
// Output
// "A"
// "C"
类B的方法被跳过。这难道不可能吗?我认为这就是继承/多态性的全部意义。提前感谢!
您的例子对我来说是预期的。我看到A B C,我认为你最有可能的问题是C没有扩展B。然而,让我建议一个可以说更安全的模式,而我们在这个问题上。您似乎希望MethodOne的所有重写都从其基类执行代码。很好,继承是一个很好的模式。然而,使用这种模式,您不能强迫继承者执行基本逻辑,因为您不能强迫它们调用base.MethodOne()
。即使它们调用了base.MethodOne()
,您也不能保证逻辑的顺序。他们会在方法的开始、中间还是结束时调用base.MethodOne()
?通常,在这些类型的模式中,您希望子类在函数开始时执行所有基本逻辑。下面的模式强制继承者按照基类期望的顺序执行基逻辑。它在技术上不太灵活,但更安全,因为继承者必须按照基类指定的方式扩展基类。
public class A
{
//Don't make this method virtual because you don't actually want inheritors
//to be able to override this functionality. Instead, you want inheritors
//to be able to append to this functionality.
public void MethodOne()
{
Console.WriteLine( "A" );
MethodToBeOverriddenOne();
}
//Expose a place where inheritors can add extra functionality
protected virtual void MethodToBeOverriddenOne() { }
}
public class B : A
{
//Seal the method because you don't actually want inheritors
//to be able to override this functionality. Instead, you want inheritors
//to be able to append to this functionality.
protected sealed override void MethodToBeOverriddenOne()
{
Console.WriteLine("B");
MethodToBeOverriddenTwo();
}
//Expose a place where inheritors can add extra functionality
protected virtual void MethodToBeOverriddenTwo() { }
}
public class C : B
{
protected sealed override void MethodToBeOverriddenTwo()
{
Console.WriteLine("C");
}
}
你发布的例子很完美,无论你在你的实际代码中做什么都与你发布的不同。
这是你在ideone上运行的代码,就像你想要的那样。
using System;
public class Test
{
public static void Main()
{
var c = new C();
c.MethodOne();
}
}
public class A
{
public virtual void MethodOne()
{
Console.WriteLine( "A" );
}
}
public class B : A
{
public override void MethodOne()
{
base.MethodOne();
Console.WriteLine( "B" );
}
}
public class C : B
{
public override void MethodOne()
{
base.MethodOne();
Console.WriteLine( "C" );
}
}