从父 class 调用覆盖的子方法?

Calling an overwritten child method from parent class?

我想知道这段代码理论上的输出是什么? 基本上我正在覆盖子 class 中的一个方法,但我正在调用它 父 class 中的方法。我希望它的输出是 "Child"

public class Animal {
    protected virtual void Activate() {
        Debug.Log("Parent");
    }

    void CallStuff() {
        Activate();
    }
}

public class Frog : Animal {
    override void Activate() {
        Debug.Log("Child");
    }
}

如果我有一个青蛙实例 frog 并调用 ...

frog.CallStuff();

输出结果是什么?

输出将是 "Child" 它继承了 Call Stuff 函数但覆盖了 Activate 函数,所以你会得到 Child

也许一些例子能最好地解释:

让我们从一个基础开始 class:

public class Parent {
  public virtual string WhatAmI() {
    return "Parent";
  }

  public string Output() {
    return this.WhatAmI();
  }
}

调用 Output 方法当然会给你 "Parent"

new Parent().Output(); // "Parent"

现在让我们覆盖那个虚拟方法

public class OverridingChild : Parent {
  public override string WhatAmI() {
    return "Child";
}

现在当你调用 Output() 时,它 returns "Child"

new OverridingChild().Output(); // "Child"

如果将其转换为父对象,您会得到相同的结果:

((Parent) new OverridingChild()).Output(); // "Child"

如果你想要基础 class 的值,你必须从继承 class:

中调用基础
public class OverridingChild : Parent {
  public override string WhatAmI() {
    return "Child";

  public string OutputBase() {
    return base.WhatAmI();
  }
}

new OverridingChild().OutputBase(); // "Parent"

现在是令人困惑的一点 - 以下是您如何获得任一值,具体取决于 class 编译器认为对象是什么:

public class NewMethodChild : Parent {
  // note that "new" keyword
  public new string WhatAmI() {
    return "Child";
}

当编译器认为是继承时直接调用该方法class得到预期的结果:

new NewMethodChild().WhatAmI(); // "Child"

但是如果你将它转换为基础 class,你会得到父结果:

((Parent) new NewMethodChild()).WhatAmI(); // "Parent"

而如果你调用Output方法,因为它是定义在Parentclass它看不到继承class的新WhatAmI方法,所以它也输出基值:

new NewMethodChild().Output(); // "Parent"

希望一切都解决了。