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