2017-12-10 7 views
2

我々は二つのクラス(AとB)が定義されていると仮定します。私たちが書く場合 オーバーライドと隠蔽方法

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()メソッドが呼び出された理由です。 –