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

时间:2017-06-09 18:50:00

标签: c# inheritance overwrite

我想知道这段代码的输出理论上是什么?  基本上我覆盖了子类中的一个方法,但我称之为  父类中的方法。我希望这个输出是"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();

输出是什么?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

也许一些例子可以解释得最好:

让我们从基类开始:

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()时,它会返回“Child”

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

如果你把它投给父母,你会得到同样的结果:

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

如果你想要基类的值,你必须从继承类中调用base:

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

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

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

现在对于令人困惑的位 - 这里是你如何获得任一值,这取决于编译器认为对象是什么类:

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

当编译器认为它是继承类时,直接调用该方法可以获得预期的结果:

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

但是如果你把它转换为基类,你得到父结果:

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

如果你调用Output方法,因为它是在Parent类中定义的,它没有看到继承类的新WhatAmI方法,所以它也输出了基值:

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

希望能够解决问题。