次のコードのようなメソッドのシグネチャでsealed
キーワードの後に続く必要がありますか?override
public sealed override string Method1(){.....}
つまり、オーバーライドせずに基本クラス内のメソッドを「シール」したい場合override
でも、キーワードは必要ですか?
次のコードのようなメソッドのシグネチャでsealed
キーワードの後に続く必要がありますか?override
public sealed override string Method1(){.....}
つまり、オーバーライドせずに基本クラス内のメソッドを「シール」したい場合override
でも、キーワードは必要ですか?
メソッドをシールすることは、それをオーバーライドする場合にのみ意味があります。
ここで何が起こるかは次のとおりです。
基本クラス(override
)からメソッドをオーバーライドし、クラスから派生したクラスがこのメソッド()をオーバーライドすることは許可されなくなったことをコンパイラーに通知しますsealed
。
メソッドがクラスで宣言された新しいメソッドであり、派生クラスがメソッドをオーバーライドしないようにしたい場合は、単に仮想として宣言しないでください。
メソッドが基本クラスで宣言されているが、オーバーライド可能なシーリングではない場合、すでにオーバーライドできないため、意味がありません。
ヒルガース氏がここで最良の答えを提供したと思いますが、 Javaの経験があるプログラマー(私のように)に
何か新しいものを追加するために、C#を初めて使用するほとんどのプログラマーは、オーバーライドに関して
混乱sealed
する傾向があると思います。final
Java
Javaでは、"any"
修飾子を指定しない場合のデフォルトの動作では、メソッドはその派生クラスでオーバーライドできます。
C#の場合、デフォルトの動作では、キーワードを使用して明示的に指定しない限り、メソッドをオーバーライドできません。virtual
これが上記のベストアンサーを補足するのに役立つことを願っています。
オーバーライドを封印することしかできないので、答えはイエスだと思います。
まあ、それは技術的には可能です....しかし、解決策は私のオプションではちょっと汚いです。
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