2017-12-16 17 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을 무시하므로 호출되는 값입니다.

가상, 대체 및 새 키워드 간의 차이점을 살펴보면 하위 클래스 화 방법에 대한 자세한 정보를 얻을 수 있습니다.