Java デザイン パターンのリスコフ置換原則とは何ですか?
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。
