- - PR -
メソッドのオーバーライド
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-04-05 15:08
C#について質問があります。
CollectionBaseの継承クラスで、Clear()メソッドをオーバーライドしようとして、以下のようなコードを書いたのですが、コンパイルすると「継承メンバ 'System.Collections.CollectionBase.Clear()' は、virtual、abstract、または override に指定されていないので、オーバーライドできません。」と言うメッセージが出ます。 - - - - - using System; using System.Collections; class CustomCollection : CollectionBase { public override void Clear() { base.Clear(); } static void Main() { new CustomCollection(); } } - - - - - 「override」を「new」に直せばメッセージは出なくなるのですが、下記のドキュメントではClear()メソッドは「virtual」となっているのでオーバーライドできるものだと思ったのですが、何か間違っているでしょうか? http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemcollectionscollectionbaseclasscleartopic.asp |
|
投稿日時: 2005-04-05 15:40
MSDNの誤植ですね。
CollectionBase.Clearはvirtual宣言はされていませんので、オーバーライドできません。 newで隠蔽するか、IListを再実装することで隠蔽するかですね。 余談: インターフェイスの実装には全てVirtual属性が付加されます。 そのためそれとは別にFinal属性が存在し、オーバーライドの可否が判断されます。 MSDNはVirtual属性だけ見てドキュメント化しちゃったのかな? //VS2002のヘルプも2005のドキュメントもvirtualとは書いてないのになぁ。 |
|
投稿日時: 2005-04-05 16:00
Hongliangさん、ありがとうございます。
誤植、でしたか... > インターフェイスの実装には全てVirtual属性が付加されます。 > そのためそれとは別にFinal属性が存在し、オーバーライドの可否が判断されます。 Clear()メソッドをMSILで見たら「virtual final」となっていたのですが、これのことですね。 |
1