超类行为未按预期应用于 Penguin 对象
Superclass behaviour doesn't apply as expected to the Penguin object
有没有想过为什么程序结束时高度不是 5?
所以我有一个从 Birds 派生的 Penguin class,在 Birds class 中我检查鸟类是否不会飞,并基于此我将给定高度重置为 0 或保持提供的高度。
假设企鹅会飞(isFlightless=false),Penguin.ArrangeBirdInPatterns(p);应该触发 ArrangeBirdInTheSky,它确实如此,然后高度应该是我提供的高度 (=5),而不是零。
我的 VS 崩溃了,我正在使用在线提琴手,很难调试。
using System;
public class Bird {
public double altitude;
public bool isFlightless;
public virtual void setLocation(double longitude, double latitude) {
}
public virtual void setAltitude(double altitude) {
this.altitude = altitude;
}
public void ArrangeBirdOnGround()
{
setAltitude(0);
}
public void ArrangeBirdInTheSky()
{
setAltitude(altitude);
}
public static void ArrangeBirdInPatterns(Bird b)
{
if(b.isFlightless)
{
b.ArrangeBirdOnGround();
}
else
{
b.ArrangeBirdInTheSky();
}
}
};
public class Penguin : Bird
{
public override void setAltitude(double altitude) {
}
}
public class Program
{
public static void Main()
{
Bird p = new Penguin();
p.setAltitude(5);
p.isFlightless = false;
Penguin.ArrangeBirdInPatterns(p);
Console.WriteLine(p.altitude); //// returns 0. why not 5
}
}
此外,为什么我不能这样称呼它:ArrangeBirdInPatterns(p);如果我从 ArrangeBirdInPatterns 定义中删除静态?
您正在调用 Penguin 的 setAltitude,它什么也不做。
p
的类型是 Bird
,但是那里包含的值的类型是 Penguin
,它覆盖了 Bird.setAltitude
,所以这就是所谓的。
您可以查看 virtual、override 和 new 关键字之间的差异,以获取有关不同子类化方法的更多信息。
有没有想过为什么程序结束时高度不是 5? 所以我有一个从 Birds 派生的 Penguin class,在 Birds class 中我检查鸟类是否不会飞,并基于此我将给定高度重置为 0 或保持提供的高度。 假设企鹅会飞(isFlightless=false),Penguin.ArrangeBirdInPatterns(p);应该触发 ArrangeBirdInTheSky,它确实如此,然后高度应该是我提供的高度 (=5),而不是零。
我的 VS 崩溃了,我正在使用在线提琴手,很难调试。
using System;
public class Bird {
public double altitude;
public bool isFlightless;
public virtual void setLocation(double longitude, double latitude) {
}
public virtual void setAltitude(double altitude) {
this.altitude = altitude;
}
public void ArrangeBirdOnGround()
{
setAltitude(0);
}
public void ArrangeBirdInTheSky()
{
setAltitude(altitude);
}
public static void ArrangeBirdInPatterns(Bird b)
{
if(b.isFlightless)
{
b.ArrangeBirdOnGround();
}
else
{
b.ArrangeBirdInTheSky();
}
}
};
public class Penguin : Bird
{
public override void setAltitude(double altitude) {
}
}
public class Program
{
public static void Main()
{
Bird p = new Penguin();
p.setAltitude(5);
p.isFlightless = false;
Penguin.ArrangeBirdInPatterns(p);
Console.WriteLine(p.altitude); //// returns 0. why not 5
}
}
此外,为什么我不能这样称呼它:ArrangeBirdInPatterns(p);如果我从 ArrangeBirdInPatterns 定义中删除静态?
您正在调用 Penguin 的 setAltitude,它什么也不做。
p
的类型是 Bird
,但是那里包含的值的类型是 Penguin
,它覆盖了 Bird.setAltitude
,所以这就是所谓的。
您可以查看 virtual、override 和 new 关键字之间的差异,以获取有关不同子类化方法的更多信息。