私は、最初に提示されたオープン/クローズの原則が、依存関係の注入によって最終クラスを拡張できるという解釈を可能にしているとは思いません。
私の理解では、原則は、本番環境に置かれたコードへの直接の変更を許可しないことであり、機能の変更を許可しながらそれを達成する方法は、実装の継承を使用することです。
最初の答えで指摘されているように、これには歴史的なルーツがあります。数十年前、継承は有利であり、開発者のテストは前代未聞であり、コードベースの再コンパイルはしばしば時間がかかりすぎました。
また、C++ では、クラスの実装の詳細 (特にプライベート フィールド) が ".h" ヘッダー ファイルで一般的に公開されていたため、プログラマーがそれを変更する必要がある場合、すべてのクライアントで再コンパイルが必要になることを考慮してください。これは、Java や C# などの最新の言語には当てはまらないことに注意してください。その上、当時の開発者は、オンザフライで依存関係の分析を実行できる洗練された IDE を期待できず、頻繁な完全な再構築の必要性を回避できたとは思いません。
私自身の経験では、正反対のことをすることを好みますfinal
。「デフォルトでは、クラスは拡張 ( ) に対して閉じている必要がありますが、変更に対しては開いています」。考えてみてください: 今日、私たちはバージョン管理(クラスの以前のバージョンの復元/比較を容易にする)、リファクタリング(デザインを改善するため、または新しい機能を導入するための前奏曲としてコードを変更することを奨励します)、および開発者などのプラクティスを好んでいます。 testingは、既存のコードを変更する際のセーフティ ネットを提供します。