Liskov 置換原則 (Liskov Substitution Principle)、LSP と呼ばれます
定義:
基底クラスへのポインターまたは参照を使用する関数は、意識せずに派生クラスのオブジェクトを使用できなければなりませんit .
基本クラスを参照するすべての場所は、そのサブクラス オブジェクトを透過的に使用できなければなりません。
言い換えれば、親クラスが出現する限り、サブクラスも出現することができ、それをサブクラスに置き換えてもエラーや例外は発生しません。しかし、逆に、サブクラスが出現する場合、親クラスに置き換えると問題が発生する可能性があります。
この原則は、適切な継承のための仕様を定義することです。簡単に言えば、これには 4 つのレベルの意味があります:
1. サブクラスは親クラスのメソッドを完全に実装する必要があります
抽象クラスを定義する
public abstract class ViewPoint { //去丽江旅游 public abstract void where(); }
次の 2 つのクラスはこの抽象クラスを実装します
public class Lijiang extends ViewPoint { @Override public void where() { System.out.println("欢迎来到丽江..."); } } public class Zhangjiajie extends ViewPoint { @Override public void where() { System.out.println("欢迎来到张家界..."); } }
キャラクターはチュチュで、内部にパラメータを渡すクラス型が設定されています。この時点では、ツツが行きたい観光地はまだ抽象的な
public class Tutu { //定义要旅游的景点 private ViewPoint viewpoint; //涂涂要去的景点 public void setViewPoint(ViewPoint viewpoint) { this.viewpoint = viewpoint; } public void travelTo() { System.out.println("涂涂要去旅游了"); viewpoint.where(); } }
シーンでした。行き先の特定の観光スポットを設定します
public class Sence { public static void main(String args[]) { Tutu tutu = new Tutu(); //设置要去的旅游景点 tutu.setViewPoint(new Lijiang()); tutu.travelTo(); } }
実行結果:
ツツは旅行に行きます
麗江へようこそ...
2. Zi Aクラスは独自の特性を持つことができます
つまり、クラスのサブクラスで、他のメソッドまたは属性を定義できます
3. メソッドをオーバーライドまたは実装します。親クラスの入力パラメータを拡大できる場合
親クラスが存在できる箇所には、サブクラスが存在することができ、実行結果は変わりません。逆は当てはまりません。
親クラス、say() のパラメータは HashMap 型であり、Map 型のサブタイプです。 (サブクラスのスコープは親クラスより大きくする必要があるため)
import java.util.Collection; import java.util.HashMap; public class Father { public Collection say(HashMap map) { System.out.println("父类被执行..."); return map.values(); } }
サブクラスの場合、say() のパラメータが Map 型になります。Map の範囲は、HashMap 型よりも大きくなります。 LSP の原則に沿っています。パラメータの型が異なるため、ここでのsayは親クラスのsayを上書きしないことに注意してください。しかし過負荷。
import java.util.Collection; import java.util.Map; /* * 子类继承了父类的所有属性 */ public class Son extends Father { //方法输入参数类型 public Collection say(Map map) { System.out.println("子类被执行..."); return map.values(); } }
Scene class
import java.util.HashMap; public class Home { public static void main(String args[]) { invoke(); } public static void invoke() { //父类存在的地方,子类就应该能够存在 //Father f = new Father(); Son s = new Son(); HashMap map = new HashMap(); //f.say(map); s.say(map); } }
say メソッドが親クラスで呼び出された場合でも、サブクラスで呼び出された場合でも、結果は親クラスが実行されます...
ただし、上記の Father の Say パラメータを Map に変更し、サブクラス Son の Say パラメータを HashMap に変更すると、結果は
#f.say(map) result:parent class Executed...## になります。 #s.say(map) の結果: サブクラスが実行されます...
これは論理的な混乱を引き起こします。したがって、サブクラスのメソッドの前提条件は、親クラスでオーバーライドされた前提条件と同じか、それよりも広い必要があります。
4. 親クラスのメソッドをオーバーライドまたは実装すると、出力結果を削減できます実際には、上記と同様です。サブクラスは、親クラスが出現できる場所に出現できます。出現できます。サブクラスに置き換えてもエラーや例外は発生せず、ユーザーはそれが親クラスであるかサブクラスであるかを知る必要はありません。しかし、その逆は当てはまらず、サブクラスがどこに出現しても、親クラスは適応できない可能性があります。 (結局のところ、サブクラスのスコープは親クラスのスコープ以上である必要があります)
以上がJava デザイン パターンのリスコフ置換原則とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。