私は最近、オブジェクト指向プログラミングの良い習慣として、クラスからの継承を常に許可する必要があると言われました。私は本当にそうは思いませんが、私は私の心に確固たる議論を持っていません。
ブロックされた継承の実際の例:
- C ++ STLクラス(特殊なクラステンプレート)では、継承(非仮想デストラクタを持つ)は許可されません。
- Javaには
final
、のような多くの標準コンポーネントに適用されるクラス修飾子がありますjava.lang.String
。
私が思う考えられる理由は次のとおりです。
- サブクラスが機密性の高い内部にアクセスする可能性があるため、セキュリティ。(私はそうは思いません-彼らはプライベートメンバーにアクセスしません。)
- パフォーマンス。サブクラスは、メンバー関数の一部をオーバーライドすることにより、効率的な実装を台無しにする可能性があるためです。(子は非仮想関数をオーバーライドしません。)
- 継承よりも構成を強制するため。(私は完全に同意します。必要のない場合は継承を優先すべきではありません。)
だから私の質問は:どのような状況で私は意図的に継承をブロックする必要がありますか?