超类行为未按预期应用于 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 关键字之间的差异,以获取有关不同子类化方法的更多信息。