2017-12-16 11 views
-2

高度がこのプログラムの最後に5でない理由についての考えはありますか? 私は鳥から派生したペンギンクラスを持っています。鳥クラスでは、鳥が飛行していないかどうかを確認し、それに基づいて与えられた高度を0にリセットするか、または提供された高度を維持します。 ペンギンが飛べるとすれば(isFlightless = false)、Penguin.ArrangeBirdInPatterns(p); ArrangeBirdInTheSkyをトリガーする必要があります。高度は、ゼロではなく、指定した高度(= 5)でなければなりません。スーパークラスの動作がPenguinオブジェクトに期待通りに適用されない

私の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定義から静的を削除するとどうなりますか?

+1

言語タグを入力するのを忘れました。 – Mat

答えて

1

あなたはペンギンのsetAltitudeを呼び出していますが、何もしません。 pのタイプはBirdですが、そこに含まれる値のタイプはPenguinで、Bird.setAltitudeを上書きします。これが呼び出されます。

サブクラス化するさまざまな方法の詳細については、virtual、override、およびnewキーワードの違いを調べることができます。

関連する問題