26

次のコードのようなメソッドのシグネチャでsealedキーワードの後に​​続く必要がありますか?override

public sealed override string Method1(){.....}

つまり、オーバーライドせずに基本クラス内のメソッドを「シール」したい場合overrideでも、キーワードは必要ですか?

4

4 に答える 4

46

メソッドをシールすることは、それをオーバーライドする場合にのみ意味があります。

ここで何が起こるかは次のとおりです。
基本クラス(override)からメソッドをオーバーライドし、クラスから派生したクラスがこのメソッド()をオーバーライドすることは許可されなくなったことをコンパイラーに通知しますsealed

メソッドがクラスで宣言された新しいメソッドであり、派生クラスがメソッドをオーバーライドしないようにしたい場合は、単に仮想として宣言しないでください。

メソッドが基本クラスで宣言されているが、オーバーライド可能なシーリングではない場合、すでにオーバーライドできないため、意味がありません。

于 2012-12-13T11:00:16.330 に答える
4

ヒルガース氏がここで最良の答えを提供したと思いますが、 Javaの経験があるプログラマー(私のように)に 何か新しいものを追加するために、C#を初めて使用するほとんどのプログラマーは、オーバーライドに関して 混乱sealedする傾向があると思います。finalJava

Javaでは、"any"修飾子を指定しない場合のデフォルトの動作では、メソッドはその派生クラスでオーバーライドできます。

C#の場合、デフォルトの動作では、キーワードを使用して明示的に指定しない限り、メソッドをオーバーライドできませvirtual

これが上記のベストアンサーを補足するのに役立つことを願っています。

于 2016-07-13T15:38:04.343 に答える
1

オーバーライドを封印することしかできないので、答えはイエスだと思います。

于 2012-12-13T11:00:05.410 に答える
0

まあ、それは技術的には可能です....しかし、解決策は私のオプションではちょっと汚いです。

A(コードベースまたは外部ライブラリのいずれかに)クラスがあると想像してください。

public class A
{
    public virtual void M () { /* implementation */ }
}

(抽象)クラスB : Aは次のように定義できます。

public class B : A
{
    public sealed override void M() => base.M();
}

メソッドを封印したため(セマンティックの変更を行わなかったとしても)、どのクラスC : B もオーバーライドできません。A.M

于 2020-05-03T18:06:48.013 に答える