2011-02-09 5 views
3

다음 (LinqPad) 예를 고려하십시오. 클래스 X의 ToString은 가상으로 표시됩니다. 왜 출력이 "Hi, I 'm Y, Hi, I 'm X"와 같지 않은 대신 typename이 인쇄됩니까? 물론 가상 객체를 가상 객체로 정의했기 때문에 ToString 가상 객체를 마킹하는 것은 잘못되었습니다. 여기서 일어나는 일을 이해하려고 노력하고 있습니다. Object.ToString()을 숨 깁니다 ToString()라는 X에서 새로운 가상 메서드를 만드는 것ToString을 기본 클래스에 가상으로 표시하면 어떻게됩니까?

void Main() 
{ 
    Y y = new Y(); 
    Console.WriteLine(y); 
} 

// Define other methods and classes here 

class X 
{ 
    public virtual String ToString() 
    { 
    return "Hi, I'm X"; 
    } 
} 

class Y : X 
{ 
    public override String ToString() 
    { 
    return "Hi, I'm Y, " + base.ToString(); 
    } 
} 
+1

다음은 가상 및 비 가상 메서드에 대한 훌륭한 데모입니다. http://msdn.microsoft.com/en-us/library/aa645767%28v=vs.71%29.aspx –

답변

15

. 그래서 만약 당신은 :

Y y = new Y(); 
X x = y; 
Object o = y; 

Console.WriteLine(y.ToString()); // Shows "Hi, I'm Y, Hi, I'm X"; 
Console.WriteLine(x.ToString()); // Shows "Hi, I'm Y, Hi, I'm X"; 
Console.WriteLine(o.ToString()); // Calls object.ToString; shows just "Y" 

가 호출 단지

Console.WriteLine(y); 

형식 이름이 인쇄 왜 마지막 줄에 해당합니다.

기본적으로, 당신의 X.ToString 방법은 에게 object.ToString() 방법 오버라이드 (override) : class Xvirtual String ToString()를 사용하여

public override String ToString() 
{ 
    return "Hi, I'm X"; 
} 
+0

OK, 완벽 함 감각. –

8

을, 당신은 object.ToString 대신를 오버라이드 (override)의 "숨어"하고 있습니다.

Console.WriteLine(y);으로 전화하면 object.ToString()가 호출됩니다. 이 메소드를 오버라이드하지 않았으므로 메소드가 호출되지 않습니다.

말했다되고 그건

, 컴파일러는 경고합니다 :

경고 1 'X.ToString을()'상속 숨 깁니다 멤버 '는 Object.toString()'. 현재 멤버가 해당 구현을 재정의하게하려면 override 키워드를 추가합니다. 그렇지 않으면 새 키워드를 추가하십시오.

+0

LinqPad에서 아무런 경고도 표시되지 않았습니다.). –

+0

최신 LINQPad 베타 버전 (www.linqpad.net/beta.aspx)을 사용해보십시오. 이제 경고가 표시됩니다. –

관련 문제