【问题标题】:Superclass behaviour doesn't apply as expected to the Penguin object超类行为未按预期应用于 Penguin 对象
【发布时间】:2017-12-16 10:55:34
【问题描述】:

关于为什么这个程序结束时海拔不是 5 的任何想法? 所以我有一个派生自 Birds 的 Penguin 类,在 Birds 类中,我检查鸟类是否不会飞,并基于此将给定高度重置为 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】:

你正在调用 Penguin 的 setAltitude,它什么都不做。 p 的类型是 Bird,但是其中包含的值的类型是 Penguin,它覆盖了 Bird.setAltitude,所以这就是被调用的内容。

您可以查看 virtual、override 和 new 关键字之间的区别,以获取有关子类化不同方式的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    相关资源
    最近更新 更多