关于为什么海拔高度在本程序结束时不是5的任何想法? 所以我有一个源自鸟类的企鹅类,在鸟类中,我检查鸟类是否不会飞行,并根据我将给定的海拔高度重置为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定义中删除静态?
答案 0 :(得分:1)
你正在打电话给Penguin的setAltitude,它什么都不做。
p
的类型为Bird
,但其中包含的值的类型为Penguin
,它会覆盖Bird.setAltitude
,因此会被调用。
您可以查看虚拟,覆盖和新关键字之间的差异,以获取有关子类化的不同方法的更多信息。