C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: C#のオーバーライド


(過去ログ 27 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■12896 / inTopicNo.1)  C#のオーバーライド
  
□投稿者/ 鬱手前 (2回)-(2008/01/20(Sun) 15:16:46)

分類:[ASP.NET (C#)] 

オーバーライドする際はoverrideキーを指定しないとオーバーライドできないと
覚えていたのですが
サンプルで
tostringの場合overrideがついていませんでした
いいのでしょうか?

お願いします
引用返信 編集キー/
■12898 / inTopicNo.2)  Re[1]: C#のオーバーライド
□投稿者/ Hongliang (224回)-(2008/01/20(Sun) 15:47:09)
Hongliang さんの Web サイト
まず、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());
}
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -