|
まず、C#では大文字と小文字を区別します。 tostring メソッドとなると、Object が virtual で定義する ToSTring メソッドとは無関係のメソッドということになります。 これではオーバーライド以前の問題です。
ToString だとして、条件によって異なります。 まず、引数を持つ場合。 Object クラスが定義する ToString は、public virtual String ToString() というシグネチャ(引数の型や数、返値の型の総称)を持ちます。このメソッドをオーバーライドする場合、このシグネチャとおなじシグネチャでなければなりません(もちろん、virtual は override に変更する必要がありますが)。 もし違うシグネチャであれば自由に定義できます(メソッドのオーバーロードと言います)。もっとも返値の型だけが違うってのは定義できませんけど。 シグネチャが同じ場合、まずコンパイルするときに警告が出ます(どんな警告かはご自分でご確認ください。CS**** ってなエラーコードでヘルプを検索すれば詳細を見られます)。ですが警告なので、警告をエラーにするオプションを付けない限りコンパイルそのものは有効でアセンブリ(exe/dll ファイル)は生成されます。 一見問題なさそうですが、警告通りこれはオーバーライドになっていません。一般には「隠蔽」と呼ばれる状態になっています。 メソッドが隠蔽されたときどういうことになるか、以下のコードで確認してみてください。また override キーワードを使った同様のコードでどうなるかも確認してみてください。
class Hoge { // new キーワードは、上記の警告を打ち消すためのものです。 // オーバーライドじゃなくて隠蔽するんだと明示します。 // つけなくても警告が出るだけでコンパイルは通り、コードの意味は変わりません。 public new string ToString() { return "HogeのToStringが呼ばれた"; } } // エントリポイント public static void Main() { Hoge hoge = new Hoge(); Console.WriteLine(hoge.ToString()); object obj = hoge; Console.WriteLine(obj.ToString()); }
|