- PR -

メソッドのオーバーライド

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/02/22
投稿数: 15
投稿日時: 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
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-04-05 15:40
MSDNの誤植ですね。
CollectionBase.Clearはvirtual宣言はされていませんので、オーバーライドできません。
newで隠蔽するか、IListを再実装することで隠蔽するかですね。

余談:
インターフェイスの実装には全てVirtual属性が付加されます。
そのためそれとは別にFinal属性が存在し、オーバーライドの可否が判断されます。
MSDNはVirtual属性だけ見てドキュメント化しちゃったのかな?
//VS2002のヘルプも2005のドキュメントもvirtualとは書いてないのになぁ。
未記入
会議室デビュー日: 2005/02/22
投稿数: 15
投稿日時: 2005-04-05 16:00
Hongliangさん、ありがとうございます。
誤植、でしたか...

> インターフェイスの実装には全てVirtual属性が付加されます。
> そのためそれとは別にFinal属性が存在し、オーバーライドの可否が判断されます。

Clear()メソッドをMSILで見たら「virtual final」となっていたのですが、これのことですね。
1

スキルアップ/キャリアアップ(JOB@IT)