超类行为不会按预期应用于Penguin对象

问题描述 投票:-2回答:1

关于为什么海拔高度在这个项目结束时不是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定义中删除静态?

c# subclass superclass
1个回答
1
投票

你正在打电话给Penguin的setAltitude,它什么都不做。 p的类型是Bird,但其中包含的值的类型是Penguin,它会覆盖Bird.setAltitude,因此这就是所谓的。

您可以查看虚拟,覆盖和新关键字之间的差异,以获取有关子类的不同方法的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.