internal sealed
C++(普通の) では、仮想関数が存在する時は、デストラクタは仮想デストラクタにしなければならない。仮想関数が存在するという事は、そのクラスは基底クラスになる予定があるという事だからだ。
逆を返せば、仮想関数が存在しない時は、デストラクタは仮想デストラクタにする必要はない。(してはいけない?…ということではないと思う)
.NET 対応言語では、オーバーライド可能なメソッドが存在しない時は、そのクラスはシールにすべきなのだろうか。
私の考えは「とりあえずシールにしとけ」だ。
継承のメカニズムの利点は「拡張」というよりは「ポリモーフィック」に扱えるかどうか、だと思う。何か共通処理があるから基底クラスにしたりとか、拡張したいから何かから派生したりというよりは、さまざまな派生クラスを「同一のように(ポリモーフィック)」に扱いたい、というとき継承を使う。(もちろん前者達の意味でも使いたい時はあるが)
そう考えると、オーバーライド可能なメソッド(またはプロパティ)を持たないクラスは、継承予定がないという事になるので、そのクラスはシールにすべきかと悩む。シールにしなくても特筆すべき害悪(シールにすると若干パフォーマンスが良くなるというのはある)がないところが更に悩みに拍車をかける。
ところで、.NET で「オーバーライド可能なメソッドを持たないクラス」というのは作りにくい。というより、かなり意図して作らないといけない。理由は Object の存在だ。
ご存知の通り .NET 界では、如何なるクラスも Object の DNA を受け継いでいる。Object に存在するオーバーライド可能メソッドもその一つだ。
ToString() や Equals() をオーバーライドして、わざわざ sealed キーワードをつける人が何人いるだろうか。つまり、オーバーライド可能なメソッドが存在しないクラスというのはほぼ存在しないという事になる。
いや逆か?このクラスをシールにしたいという要求が存在するから、全てのメソッドはオーバーライド不可能になるのか?
…とここまで書いて、ちょうど中さんが似た投稿をしてる事に気付いた。
sealedクラス、NotInheritableクラスの効用