国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

設計模式:里氏替換原則(詳解)

這篇具有很好參考價值的文章主要介紹了設計模式:里氏替換原則(詳解)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。



前言

本博主將用CSDN記錄軟件開發(fā)求學之路上親身所得與所學的心得與知識,有興趣的小伙伴可以關注博主!也許一個人獨行,可以走的很快,但是一群人結伴而行,才能走的更遠!

一、 介紹

(1)引入

  1. 繼承包含這樣一層含義:父類中凡是已經實現好的方法,實際上是在設定規(guī)范和契約,雖然它不強制要求所有的子類必須遵循這些契約,但是如果子類對這些已經實現的方法任意修改,就會對整個繼承體系造成破壞。

  2. 繼承在給程序設計帶來便利的同時,也帶來了弊端。
    比如:
    ● 使用繼承會給程序帶來侵入性;
    ● 程序的可移植性降低;
    ● 增加對象間的耦合性;
    ● 如果一個類被其他的類所繼承,則當這個類需要修改時,必須考慮到所有的子類,并且父類修改后,所有涉及到子類的功能都有可能產生故障

  3. 問題提出:在編程中,如何正確的使用繼承? => 里氏替換原則

(2)基本介紹

  1. 里氏替換原則(LSP)在1988年,由麻省理工學院的以為姓里的女士提出的。

  2. 如果對每個類型為T1的對象o1,都有類型為T2的對象o2,使得以T1定義的所有程序P在所有的對象o1都代換成o2時,程序P的行為沒有發(fā)生變化,那么類型T2是類型T1 的子類型。換句話說,所有引用基類的地方必須能透明地使用其子類的對象。

  3. 在使用繼承時,遵循里氏替換原則,在子類中盡量不要重寫父類的方法。

  4. 里氏替換原則告訴我們,繼承實際上讓兩個類耦合性增強了,在適當的情況下,可以通過聚合,組合,依賴來解決問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-457245.html

二、代碼演示

1、版本一:原始版本

public class Liskov {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A a = new A();
		System.out.println("11-3=" + a.func1(11, 3));
		System.out.println("1-8=" + a.func1(1, 8));

		System.out.println("-----------------------");
		B b = new B();
		System.out.println("11-3=" + b.func1(11, 3));//這里本意是求出11-3
		System.out.println("1-8=" + b.func1(1, 8));// 1-8
		System.out.println("11+3+9=" + b.func2(11, 3));
		
		

	}

}

// A類
class A {
	// 返回兩個數的差
	public int func1(int num1, int num2) {
		return num1 - num2;
	}
}

// B類繼承了A
// 增加了一個新功能:完成兩個數相加,然后和9求和
class B extends A {
	//這里,重寫了A類的方法, 可能是無意識
	public int func1(int a, int b) {
		return a + b;
	}

	public int func2(int a, int b) {
		return func1(a, b) + 9;
	}
}
  1. 我們發(fā)現原來運行正常的相減功能發(fā)生了錯誤。原因就是類B無意中重寫了父類的方法,造成原有功能出現錯誤。在實際編程中,我們常常會通過重寫父類的方法完成新的功能,這樣寫起來雖然簡單,但整個繼承體系的復用性會比較差。特別是運行多態(tài)比較頻繁的時候。
  2. 通用的做法是:原來的父類和子類都繼承一個更通俗的基類,原有的繼承關系去掉,采用依賴,聚合,組合等關系代替。

2、版本二:里氏替換原則

public class Liskov {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A a = new A();
		System.out.println("11-3=" + a.func1(11, 3));
		System.out.println("1-8=" + a.func1(1, 8));

		System.out.println("-----------------------");
		B b = new B();
		//因為B類不再繼承A類,因此調用者,不會再func1是求減法
		//調用完成的功能就會很明確
		System.out.println("11+3=" + b.func1(11, 3));//這里本意是求出11+3
		System.out.println("1+8=" + b.func1(1, 8));// 1+8
		System.out.println("11+3+9=" + b.func2(11, 3));
		
		
		//使用組合仍然可以使用到A類相關方法
		System.out.println("11-3=" + b.func3(11, 3));// 這里本意是求出11-3
		

	}

}

//創(chuàng)建一個更加基礎的基類
class Base {
	//把更加基礎的方法和成員寫到Base類
}

// A類
class A extends Base {
	// 返回兩個數的差
	public int func1(int num1, int num2) {
		return num1 - num2;
	}
}

// B類繼承了A
// 增加了一個新功能:完成兩個數相加,然后和9求和
class B extends Base {
	//如果B需要使用A類的方法,使用組合關系
	private A a = new A();
	
	//這里,重寫了A類的方法, 可能是無意識
	public int func1(int a, int b) {
		return a + b;
	}

	public int func2(int a, int b) {
		return func1(a, b) + 9;
	}
	
	//我們仍然想使用A的方法
	public int func3(int a, int b) {
		return this.a.func1(a, b);
	}
}

到了這里,關于設計模式:里氏替換原則(詳解)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 設計模式:里氏代換原則(Liskov Substitution Principle,LSP)介紹

    里氏代換原則(Liskov Substitution Principle,LSP)是面向對象設計原則的一部分,它強調 子類對象應該能夠替換其父類對象而不影響程序的正確性 。換句話說,子類對象應該可以在不改變程序正確性的前提下替換掉父類對象。 該原則的實現原理可以通過以下幾點來說明: 子類必

    2024年04月29日
    瀏覽(15)
  • 設計原則學習之里氏替換原則

    以下內容均來自抖音號【it楠老師教java】的設計模式課程。 1 、原理概述 子類對象(objectofsubtype/derivedclass)能夠替換程序(program)中父類對象(objectofbase/parentclass)出現的任何地方,并且保證原來程序的邏輯行為(behavior)不變及正確性不被破壞。 2、簡單的示例1 // 基類:

    2024年02月14日
    瀏覽(20)
  • 深入理解設計原則之里氏替換原則(LSP)【軟件架構設計】

    深入理解設計原則之里氏替換原則(LSP)【軟件架構設計】

    C++高性能優(yōu)化編程系列 深入理解軟件架構設計系列 深入理解設計模式系列 高級C++并發(fā)線程編程 里氏替換原則(Liskov Substitution Principle, LSP)于1986年有Barbara Liskov提出,他當時是這樣描述這條原則的: 如果S是T的子類型,那么T的對象可以被S的對象所替換,并不影響代碼的運行

    2024年02月07日
    瀏覽(23)
  • 基于面向對象基礎設計——里氏替換原則

    基于面向對象基礎設計——里氏替換原則

    在Java中,支持抽象和多態(tài)的關鍵機制之一是繼承。正是使用了繼承,我們才可以創(chuàng)建實現父類中抽象方法的子類。那么,是什么規(guī)則在支配著這種特殊的繼承用法呢?最佳的繼承層次的特征又是什么呢?在什么情況下會使我們創(chuàng)建的類層次結構掉進不符合開閉原則的陷阱中呢

    2024年02月14日
    瀏覽(26)
  • 設計模式:依賴倒轉原則(詳解)

    本博主將用CSDN記錄軟件開發(fā)求學之路上親身所得與所學的心得與知識,有興趣的小伙伴可以關注博主!也許一個人獨行,可以走的很快,但是一群人結伴而行,才能走的更遠! 依賴倒轉原則( Dependence Inversion Principle )是指: 高層模塊不應該依賴低層模塊,二者都應該依賴其抽

    2024年02月06日
    瀏覽(15)
  • 設計模式和七大原則概述及單一職責原則詳解

    設計模式的目的 編寫軟件過程中,程序員面臨著來自,耦合性,內聚性以及可維護性,擴展性,重用性等方面的挑戰(zhàn)。設計模式是為了讓程序,具有更好的 1.代碼重用性(相同代碼,不用重復編寫) 2.可讀性(編程規(guī)范性,便于其他程序員的閱讀和理解) 3.可擴展性(當需要增加新

    2024年02月12日
    瀏覽(26)
  • 里氏替換原則究竟如何理解?

    介 紹 里 氏 替 換 原 則 的 文 章 非 常 多 , 但 可 能 大 家 看 完 之 后 , 心 中 仍 然 留 有 疑 問 , 如 何 去 落 地 實 現 , 如 何 判 斷 是 否 影 響 程 序 功 能 。 本 文 將 帶 領 大 家 深 入 理 解 里 氏 替 換 , 一 起 領 略 下 它 的 真 正 面 目 。 但 在 此 之 前 , 有 必

    2024年02月08日
    瀏覽(26)
  • 里氏替換原則

    里氏替換原則 OOP(Object Oriented Programming) 面向對象編程 OO中的繼承性的思考 1.繼承包含這樣一層含義,父類中凡是已經寫好的方法,實際上就是設定規(guī)范。雖然不強制要求所有子類必須遵守規(guī)范(不重寫方法),但是如果子類對這些方法,任意修改就會對繼承體系造成破壞。 2.繼

    2024年02月11日
    瀏覽(34)
  • 設計模式(二):依賴倒轉原則(詳解)

    本博主將用CSDN記錄軟件開發(fā)求學之路上親身所得與所學的心得與知識,有興趣的小伙伴可以關注博主!也許一個人獨行,可以走的很快,但是一群人結伴而行,才能走的更遠! 依賴倒轉原則( Dependence Inversion Principle )是指: 高層模塊不應該依賴低層模塊,二者都應該依賴其抽

    2024年02月04日
    瀏覽(21)
  • 設計模式(三):開放封閉原則(詳解)

    本博主將用CSDN記錄軟件開發(fā)求學之路上親身所得與所學的心得與知識,有興趣的小伙伴可以關注博主!也許一個人獨行,可以走的很快,但是一群人結伴而行,才能走的更遠! 開閉原則(Open Closed Principle)是編程中最基礎、最重要的設計原則 一個軟件實體如類,模塊和函數

    2024年02月04日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包