1. ホーム
  2. c#

すべてのメソッドをvirtualにする必要がありますか?

2023-09-20 15:16:24

質問

Javaではメソッドをfinalとしてマークすることで 不可能 をオーバーライドすることができます。

C#ではメソッドをvirtualとしてマークすることで 可能 をオーバーライドする必要があります。

C#では、クラスがどのように継承されるかわからない場合がほとんどなので、(オーバーライドされたくないいくつかのメソッドを除いて)すべてのメソッドをvirtualにマークすべきということでしょうか。

どのように解決するのですか?

C#では、オーバーライドを可能にするために、メソッドをvirtualとしてマークする必要があります。C#では、クラスがどのように継承されるかわからないため、(オーバーライドされたくないいくつかのメソッドを除いて)すべてのメソッドをvirtualにマークする必要があるということでしょうか。

いいえ。もし言語設計者がvirtualをデフォルトにすべきと考えたのなら がデフォルトだったでしょう。 .

オーバーライド可能性は 機能 であり、他の機能と同様に コスト . オーバーライド可能なメソッドのコストは相当なものです。大きな設計、実装、およびテストのコストが発生し、特にクラスに対して何らかの感度がある場合はそうです。

クラスをどのように継承させたいのかがわからない場合は クラスを公開しないでください。 なぜなら まだ設計が終わっていないからです。 拡張性モデルは間違いなく前もって知っておくべきことで、設計とテストの戦略に深く影響するはずです。

私は、すべてのクラスが シールされた であり、すべてのメソッドは 非仮想 であり、すべてのメソッドはでなければなりません。

基本的にあなたの質問は、「私は顧客がどのように私のクラスを利用しようとしているのか知らないので、任意に拡張可能にするべきでしょうか? 知ることができるようになる ! 顧客が私のクラスをどのように使用するのか分からないので、すべてのプロパティを読み書きできるようにすべきでしょうか? また、すべてのメソッドを読み書き可能なデリゲートタイプのプロパティにして、ユーザーが任意のメソッドを独自の実装に置き換えることができるようにするべきでしょうか? 証拠 という証拠を得るまでは、そのようなことはしないでください。 ユーザーが実際に必要とする機能を設計、テスト、実装するために貴重な時間を費やし、知識のある立場からそれを行ってください。