2017-12-10 20 views
2

한다고 가정 우리는 두 클래스 (A와 B) 정의 : 재정 및 C#에서 숨기기 방법

class A 
{ 
    public new virtual string ToString() 
    { 
     return "I'm class A object."; 
    } 
} 

class B : A 
{ 
    public override string ToString() 
    { 
     return "I'm class B object."; 
    } 
} 

우리가 작성하는 경우 :

A a = new B(); 
Console.WriteLine(a); 

"B"(namespace.B)을 것이다 콘솔에 표시됩니다.
즉, 클래스 A (System.Object.ToString())의 암시 적 조상의 ToString() 메서드가 호출됩니다.
클래스 A 또는 B가 아닌 System.Object 클래스의 메서드를 호출하는 이유는 무엇입니까?

+0

이 도와 드릴까요 https://stackoverflow.com/questions/10415900/what-is -public-new-virtual-void-method-mean –

답변

1

첫째, 당신이 할 경우 :

Console.WriteLine(a.ToString()); 
Console.WriteLine(b.ToString()); 

그것은 당신이 원하는 두 개의 문자열에서 기록합니다.

A 인스턴스에서 ToString을 명시 적으로 호출해야한다는 것을 의미합니다. 따라서 a.ToString()가 작동합니다. ((object)a).ToString() 않습니다.

Console.WriteLine(a)으로 전화하면 Console.Writeline(object) 과부하가 걸립니다. 결과적으로 WriteLine 함수는 object 참조를 사용하므로 기본값은 object.ToString()입니다.

이 두 경우 모두에서 우선 확인하고 문제가 사라집니다 (난 당신이 이미 알고 추측하고있어) :

class A 
{ 
    public override string ToString() 
    { 
     return "I'm class A object."; 
    } 
} 

class B : A 
{ 
    public override string ToString() 
    { 
     return "I'm class B object."; 
    } 
} 
+0

정말 고마워요. 오버로드 된 Console.WriteLine (Object) 메서드에 대한 호출이 실제로 손실되었습니다. 이 때문에 Object의 ToString() 메서드가 호출되었습니다. –