大まかに言えば、Liskov Substitution Principle は、ユーザーに影響を与えることなく、派生クラスを基本クラスの代わりに使用できると述べています。基本クラスが抽象クラスの場合、つまり基本クラスのインスタンスを使用しているユーザーがいない場合、Liskov の継承制限は派生クラスにも適用されますか?
5 に答える
特定のクラスをインスタンス化できないからといって、それを使用できないわけではありません。このシナリオでは、呼び出し元のコードは、動作するコントラクトの定義として抽象基本クラスを使用しています。その意味で、基本クラスから派生するすべてのクラスは、基本クラスによって定義されたインターフェースに関して交換可能であるべきであるため、はい、Liskov は引き続き適用されます。実際、これが、いくつかの共通の動作を持つクラスのコレクションに抽象基本クラスを持たせたい主な理由の 1 つです。つまり、基本クラス インターフェイスの観点から操作を定義でき、どの派生クラスがどの派生クラスかを気にする必要がありません。あなたは実際に操作しています。
はい、呼び出し元はいつでもこれを実行できるためです。
BaseAbstractClass instance = new DerivedClass();
抽象クラスは LSP とまったく競合しません。多くの人は、クライアント コードから直接 "new" を使用することは LSP の精神に反すると考えています。オブジェクトのインスタンス化と使用の両方を行う場合、その実装に強く結び付けられ、それを「代用」することはまったくできません。
オブジェクトをファクトリ経由で作成するか、引数として渡すか、さまざまな状況で必要な具体的な型を決定することに集中できるある種のリポジトリによって作成された後に依存性注入を介して渡すことを検討してください。
要するに、はい。LSP は、基本的にすべての公開継承に適用されます。基本クラスが抽象であるという事実は、それを変えません。基本クラスはインターフェイスを定義し、すべての正当な派生物はそのインターフェイスのすべての要件を満たす必要があります。
はい。
Uncle Bob の The Liskov Substitution Principle 記事の「A Real Example」セクション (7-8 ページ) を参照してください。