如果我调用继承的重载,将调用什么方法?

Age*_*ire 2 c# methods inheritance overloading

让我说我有这个:

class A { }
class B : A { }
class C : B { }

class Foo
{
    public void Bar(A target) { /* Some code. */ }
}

class AdvancedFoo : Foo
{
    public void Bar(B target)
    {
        base.Bar(target);
        // Some code.
    }
}

sealed class SuperiorFoo : AdvancedFoo
{
    public void Bar(C target)
    {
        base.Bar(target);
        // Some code.
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我跑new SuperiorFoo().Bar(new C()),为什么会调用哪个重载?我猜它会被级联调用,但我无法弄清楚为什么以及这种行为是否得到保证.

更新

所以,base.与这两部作品Foo,并AdvancedFooSuperiorFoo,所以哪一个将被调用,为什么呢?

Kin*_*nus 6

现在我已经修改了问题,编辑了我的答案.

快速跟踪显示以下内容:

Entering SuperiorFoo.Bar()
Entering AdvancedFoo.Bar()
Entering Foo.Bar()
Leaving Foo.Bar()
Leaving AdvancedFoo.Bar()
Leaving SuperiorFoo.Bar()
Run Code Online (Sandbox Code Playgroud)

让我们谈谈发生的事情:

  1. SuperiorFoo.Bar()调用它的基本方法.由于SF.Bar()继承自AdvancedFoo,因此其基本方法是AdvancedFoo.Bar().

  2. AdvancedFoo.Bar()然后调用它的base,即Foo.Bar(),因为AdvancedFoo继承自Foo().

流程不会从SF.Bar()跳转到Foo.Bar(),因为您可能需要来自中间类的行为.

如果我们从AdvancedFoo中删除该方法,则遍历略有不同.SuperFoo.Bar()仍然会调用它的基本方法,但由于AdvancedFoo不再隐藏Foo.Bar()方法,逻辑将跳转到Foo.Bar()方法.