web-dev-qa-db-ja.com

C#でプロパティのセッターメソッドをオーバーライドするにはどうすればよいですか?

サブクラスを持つクラスがあります。スーパークラスにはPositionプロパティがあります。 Positionプロパティが変更された場合、サブクラスは追加の操作を実行する必要があるため、セッターメソッドをオーバーライドしてスーパークラスのセッターを呼び出そうとしています。

スーパークラスのセッターの呼び出し部分がダウンしていると思いますが、ここでオーバーライド構文がどのように機能するのか理解できません。

これが私の最善の試みです: code

ゲッターは概念実証のためだけにあります-私もそれを上書きしたいと思いますか?

ゲッターとセッターはこの形式のエラーを私に与えます:

継承されたメンバー 'superClassName.Position。[gs] et'は​​、仮想、抽象、またはオーバーライドとしてマークされていないため、オーバーライドできません

以下は、適切な測定のためのエラーのスクリーンキャップです。 errors

また、setの前にoverrideキーワードを使用してみました。余分なゲッターを削除しても効果はありません。

正しい構文は何ですか?

26
Anko

オーバーライドは問題ありません。ただし、エラーメッセージが示すように、基本クラスのプロパティを仮想としてマークして、それをオーバーライドできるようにする必要があります。

public virtual Vector2 Position

Javaとは異なり、C#ではクラスメンバーはデフォルトでは仮想ではありません。基本クラスを変更できない場合は、運が悪いです。

38
dtb

Positionプロパティは基本クラスでは仮想ではないため、オーバーライドできません。仮想化すると、それを上書きできるようになります。

少し厄介なことですが、他のビットを使わずにオーバーライドしています。これは、私が頻繁に行うことではないので、何が起こっているのかを確認するために、いじくり回す必要がありますが、first =やるべきことは、基本クラスのプロパティを変更することです...

これは、コンパイラメッセージが正確に伝えていることでもあります。

継承されたメンバー 'superClassName.Position。[gs] et'は​​、仮想、抽象、またはオーバーライドとしてマークされていないため、オーバーライドできません

基本クラスのプロパティについて何かを伝えています-それをオーバーライドするために変更する必要があるのはそれです。コンパイラのメッセージが役立ちます-それらに細心の注意を払ってください!

7
Jon Skeet

基本クラスで:キーワードvirtualを追加

5
benwasd

エラーメッセージで問題が指摘されています:)

そもそも仮想(または抽象)でないメンバーをオーバーライドすることはできません。

スーパークラスでは、プロパティ定義にvirtualが必要です。

public virtual Vector2 Position { ... }
5
Isak Savo

virtualまたはabstractとしてマークされていないメンバーは上書きできません

あなたのVector2プロパティは、スーパークラスのvirtualです。

public virtual Vector2 Position
3
Tomasz Jaskuλa