从父 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"
希望一切都解决了。
我想知道这段代码理论上的输出是什么?
基本上我正在覆盖子 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"
希望一切都解决了。