没有调用多级继承的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的方法被跳过。这难道不可能吗?我认为这就是继承/多态性的全部意义。提前感谢!

没有调用多级继承的base.Method()

您的例子对我来说是预期的。我看到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" );
    }
}