强奸久久久久久久|草草浮力在线影院|手机成人无码av|亚洲精品狼友视频|国产国模精品一区|久久成人中文字幕|超碰在线视屏免费|玖玖欧洲一区二区|欧美精品无码一区|日韩无遮一区二区

首頁 > 產(chǎn)品 > 知識 > 里氏代換原則,里氏代換原則的示例

里氏代換原則,里氏代換原則的示例

來源:整理 時間:2023-08-20 16:35:13 編輯:智能門戶 手機(jī)版

本文目錄一覽

1,里氏代換原則的示例

LSP講的是基類和子類的關(guān)系。只有當(dāng)這種關(guān)系存在時,里氏代換關(guān)系才存在。如果兩個具體的類A,B之間的關(guān)系違反了LSP的設(shè)計,(假設(shè)是從B到A的繼承關(guān)系)那么根據(jù)具體的情況可以在下面的兩種重構(gòu)方案中選擇一種。-----創(chuàng)建一個新的抽象類C,作為兩個具體類的超類,將A,B的共同行為移動到C中來解決問題。-----從B到A的繼承關(guān)系改為委派關(guān)系。
在進(jìn)行設(shè)計的時候,我們盡量從抽象類繼承,而不是從具體類繼承。如果從繼承等級樹來看,所有葉子節(jié)點應(yīng)當(dāng)是具體類,而所有的樹枝節(jié)點應(yīng)當(dāng)是抽象類或者接口。當(dāng)然這個只是一個一般性的指導(dǎo)原則,使用的時候還要具體情況具體分析。簡單的理解為一個軟件實體如果使用的是一個父類,那么一定適用于其子類,而且它察覺不出父類對象和子類對象的區(qū)別。也就是說,軟件里面,把父類都替換成它的子類,程序的行為沒有變化。

里氏代換原則的示例

2,繼承的說話與里氏替換原則

在面向?qū)ο笏枷胫锌芍?,派生類擁有基類向下公開的所有特征,它是基類的一個特例。 當(dāng)派生類對象賦于基類類型時,將出現(xiàn)以下情況:派生類的數(shù)據(jù)結(jié)構(gòu)依次對應(yīng)于基類的數(shù)據(jù)結(jié)構(gòu)。而派生類擁有的自己的數(shù)據(jù)將不可見。 當(dāng)基類的對象試圖轉(zhuǎn)換為派生類型時,將出現(xiàn)基類對象的數(shù)據(jù)無法依次填充完派生類的所有數(shù)據(jù)結(jié)構(gòu)。這就造成了它將無法完成派生類定義的功能。編譯器將會提示甚至報錯。 這就是派生類能勝任基類功能,而基類卻無法完全勝任派生類功能的原因。 強(qiáng)制轉(zhuǎn)換屬于 基類到派生的過程:那是因為 設(shè)計人員知道:該基類對象的數(shù)據(jù)結(jié)構(gòu)完全可以填充完派生類的結(jié)構(gòu)。否則,將出現(xiàn)強(qiáng)轉(zhuǎn)錯誤。一般最好避免使用強(qiáng)轉(zhuǎn)! 還有,子類能夠出現(xiàn)在任何父類對象出現(xiàn)的地方不是完全正確的,父類有時也不會將自己的一些成員公開給子類。
也就是說基類所能提供的服務(wù)(所提供的功能)能夠在自類中有所作用。 比如鳥基類和繼承自他的燕子類,鳥類有飛行的方法,而燕子可以繼承使用這個方法,他們就合適作為繼承。 而鴕鳥就不適合繼承自鳥,因為鴕鳥修改了他父類的功能,也就是屏蔽掉了?;卮鹧a(bǔ)充:面向?qū)ο笤O(shè)計的原則是這樣的,并不是說一定,只不過如果子類會屏蔽或者修改父類行為,那么這種繼承就不是一個好的設(shè)計而已。你當(dāng)然可以把一個垃圾桶繼承自水桶,但是水桶是放水的,而垃圾桶屏蔽了水桶的放水的功能而放垃圾了,當(dāng)你使用多態(tài)特性的時候你會發(fā)現(xiàn)你有可能把水放在一個垃圾桶里面,這水還能喝么?

繼承的說話與里氏替換原則

3,如何理解里氏替換原則

我簡單的給你說一下吧。首先,這是編譯器的要求,如果不這么做,無法通過編譯。其次,面向?qū)ο蟮木幊蹋渲欣^承有個大原則,任何子類的對象都可以當(dāng)成父類的對象使用。如有父類人類,可以使用一般的槍,有警察類,可以使用任何的槍。class Person void shoot(SimpleGun simpleGun);}class Police extends Person void shoot(Gun gun);}其中SimpleGun extends Gun。這樣的話任何警察類的對象都可以被當(dāng)做人類來使用。也就是說警察類既然會使用任何的槍,當(dāng)然可以使用一般的槍。Person person = new Police();person.shoot(simpleGun);而如果反過來,普通人可以使用任何搶,警察只能使用一般槍。class Person void shoot(Gun gun);}class Police extends Person void shoot(SimpleGun simpleGun);}這樣的話就不合理了,既然警察是人類的一個子類,所以警察也是人類,既然是人類就應(yīng)該能使用人類的方法,也就是使用任何的槍,可以根據(jù)上面的定義,反而警察類的能力還變小了。所以有一個原則,子類的能力必須大于等于父類,即父類可以使用的方法,子類都可以使用。返回值也是同樣的道理。假設(shè)一個父類方法返回一個List,子類返回一個ArrayList,這當(dāng)然可以。如果父類方法返回一個ArrayList,子類返回一個List,就說不通了。這里子類返回值的能力是比父類小的。還有拋出異常的情況。任何子類方法可以聲明拋出父類方法聲明異常的子類。而不能聲明拋出父類沒有聲明的異常。這一切都是為了,任何子類的對象都可以當(dāng)做父類使用。

如何理解里氏替換原則

4,C中基類和派生類之間的類型轉(zhuǎn)換的內(nèi)部原理是什么

里氏替換原則 即父類和派生類之間遵循 is a的關(guān)系。
有種叫做:里氏替換 原則,就是 基類和派生類的 轉(zhuǎn)化 關(guān)系原理. 不想拷貝: http://baike.baidu.com/view/1688346.htm(直接去看看吧.應(yīng)該懂些)
內(nèi)部原理?不就是隱式轉(zhuǎn)換嗎 簡單來說,派生類一定可以隱式轉(zhuǎn)換為基類,因為派生類是繼承基類過來的,所有基類有的定義它都會有,所以這樣的隱式轉(zhuǎn)換是被認(rèn)為合法的,比如: class A class B:A A aInstance=new B(); 但是基類類型不能隱式轉(zhuǎn)換為派生類,因為派生類中的成員定義在基類中是不一定存在的,如下面這樣的轉(zhuǎn)換是無法通過的: B bInstance=new A(); //不能從基類隱式轉(zhuǎn)換到派生類 當(dāng)你確實知道一個類型為A的變量實際上是派生類B時,可以通過強(qiáng)制類型轉(zhuǎn)換為派生類: A a=new B(); .... .... B b=(B)a;
在類的層次結(jié)構(gòu)中(即繼承結(jié)構(gòu)中)基類和派生類的構(gòu)造函數(shù)的使用方式。派生類對象的初始化由基類和派生類共同完成:基類的成員由基類的構(gòu)造函數(shù)初始化,派生類的成員由派生類的構(gòu)造函數(shù)初始化。   當(dāng)創(chuàng)建派生類的對象時,系統(tǒng)將會調(diào)用基類的構(gòu)造函數(shù)和派生類的構(gòu)造函數(shù),構(gòu) 造函數(shù)的執(zhí)行次序是:先執(zhí)行基類的構(gòu)造函數(shù),再執(zhí)行派生類的構(gòu)造函數(shù)。如果派生類又有對象成員,則,先執(zhí)行基類的構(gòu)造函數(shù),再執(zhí)行成員對象類的構(gòu)造函數(shù),最后執(zhí)行派生類的構(gòu)造函數(shù)。 至于執(zhí)行基類的什么構(gòu)造函數(shù),缺省情況下是執(zhí)行基類的無參構(gòu)造函數(shù),如果要執(zhí)行基類的有參構(gòu)造函數(shù),則必須在派生類構(gòu)造函數(shù)的成員初始化表中指出。如: class A public A( )  public A( int i ) }; class B : A public B( )  public B( int i )  public B( int i, int j ):A(i) }; B b1 = new B(); //執(zhí)行基類A的構(gòu)造函數(shù)A(),再執(zhí)行派生類的構(gòu)造函數(shù)B()B b2 = new B(1); //執(zhí)行基類A的構(gòu)造函數(shù)A(),再執(zhí)行派生類的構(gòu)造函數(shù)B(int)B b3 = new B(0,1); //執(zhí)行執(zhí)行基類A的構(gòu)造函數(shù)A(int) ,再執(zhí)行派生類的   構(gòu)造函數(shù)B(int,int)   在這里構(gòu)造函數(shù)的執(zhí)行次序是一定要分析清楚的。另外,如果基類A中沒有提供無參構(gòu)造函數(shù)public A( ) class A public A( int i ) }; class B : A public B():A(i)  public B(int i):A(i)  public B(int i, int j):A(i) };
繼承

5,C中基類和派生類之間的類型轉(zhuǎn)換的內(nèi)部原理是什么

內(nèi)部原理?不就是隱式轉(zhuǎn)換嗎簡單來說,派生類一定可以隱式轉(zhuǎn)換為基類,因為派生類是繼承基類過來的,所有基類有的定義它都會有,所以這樣的隱式轉(zhuǎn)換是被認(rèn)為合法的,比如:class A { .... }class B:A {....} A aInstance=new B(); 但是基類類型不能隱式轉(zhuǎn)換為派生類,因為派生類中的成員定義在基類中是不一定存在的,如下面這樣的轉(zhuǎn)換是無法通過的:B bInstance=new A(); //不能從基類隱式轉(zhuǎn)換到派生類 當(dāng)你確實知道一個類型為A的變量實際上是派生類B時,可以通過強(qiáng)制類型轉(zhuǎn)換為派生類:A a=new B();........B b=(B)a;
<p>有種叫做:里氏替換 原則,就是 基類和派生類的 轉(zhuǎn)化 關(guān)系原理.</p> <p> </p> <p>不想拷貝: <a target="_blank">http://baike.baidu.com/view/1688346.htm</a></p>(直接去看看吧.應(yīng)該懂些)
在類的層次結(jié)構(gòu)中(即繼承結(jié)構(gòu)中)基類和派生類的構(gòu)造函數(shù)的使用方式。派生類對象的初始化由基類和派生類共同完成:基類的成員由基類的構(gòu)造函數(shù)初始化,派生類的成員由派生類的構(gòu)造函數(shù)初始化?! ‘?dāng)創(chuàng)建派生類的對象時,系統(tǒng)將會調(diào)用基類的構(gòu)造函數(shù)和派生類的構(gòu)造函數(shù),構(gòu) 造函數(shù)的執(zhí)行次序是:先執(zhí)行基類的構(gòu)造函數(shù),再執(zhí)行派生類的構(gòu)造函數(shù)。如果派生類又有對象成員,則,先執(zhí)行基類的構(gòu)造函數(shù),再執(zhí)行成員對象類的構(gòu)造函數(shù),最后執(zhí)行派生類的構(gòu)造函數(shù)。至于執(zhí)行基類的什么構(gòu)造函數(shù),缺省情況下是執(zhí)行基類的無參構(gòu)造函數(shù),如果要執(zhí)行基類的有參構(gòu)造函數(shù),則必須在派生類構(gòu)造函數(shù)的成員初始化表中指出。如:class A public A( )  public A( int i ) };class B : A public B( )  public B( int i )  public B( int i, int j ):A(i) };B b1 = new B(); //執(zhí)行基類A的構(gòu)造函數(shù)A(),再執(zhí)行派生類的構(gòu)造函數(shù)B()B b2 = new B(1); //執(zhí)行基類A的構(gòu)造函數(shù)A(),再執(zhí)行派生類的構(gòu)造函數(shù)B(int)B b3 = new B(0,1); //執(zhí)行執(zhí)行基類A的構(gòu)造函數(shù)A(int) ,再執(zhí)行派生類的   構(gòu)造函數(shù)B(int,int)   在這里構(gòu)造函數(shù)的執(zhí)行次序是一定要分析清楚的。另外,如果基類A中沒有提供無參構(gòu)造函數(shù)public A( )  public A( int i ) };class B : A public B():A(i)  public B(int i):A(i)  public B(int i, int j):A(i) };

6,面向?qū)ο笤O(shè)計原則開放封閉原則

面向?qū)ο笤O(shè)計原則-開放封閉原則,對于擴(kuò)展是開放的,對于修改是封閉的。修改(增加)類的成員變量或?qū)傩远际菍儆凇靶薷摹?。擴(kuò)展一般是指在原有的架構(gòu)(小一點的說是接口)基礎(chǔ)上進(jìn)行擴(kuò)展。開放封閉原則是指在現(xiàn)有的功能中,不修改原有的代碼中進(jìn)行擴(kuò)展。為符合開放封閉原則,可以利用一些設(shè)計模式來實現(xiàn)。如第四副圖,在原有countArea()方法需要增加輸出功能。比如可以使用適配器模式(前提是要面向接口編程)。如下:原先的設(shè)計是定義一個接口ISqure,其定義的方法為第四副圖左邊類Squre包含的setLength、countArea方法。第四副圖左邊類Squre實現(xiàn)了ISqure。客戶端調(diào)用代碼:ISqure squre = new Square(); (一般不會這樣直接獲取對象,如通過工廠方法獲取對象);double area = squre.countArea();以上是原有的設(shè)計現(xiàn)在需要countArea方法中還具有輸出功能,如何在不修改Squre類的情況下做到呢?新建另一個類SqureImpl,同時它也實現(xiàn)接口ISqure,代碼如下:public class SqureAdapter implements ISqure static ISqure squre = new Squre();//原有的代碼中的類Squre public void setLength(double length) squre.setLength(length); } public double countArea() double area = squre.countArea(); System.out.println(area); //增加輸出area return area; }}修改客戶端調(diào)用代碼:ISqure squre = new SqureAdapter(); double area = squre.countArea();這樣達(dá)到了不修改原有Square類,而是通過繼承(擴(kuò)展)接口ISqure,來增加了輸出area的功能。這樣做的好處是維持了原有代碼(功能)的穩(wěn)定性(可能系統(tǒng)的代碼其他地方有很多調(diào)用Square的countArea方法,這樣對它們是不影響的)。我也是最近在看面向?qū)ο笤O(shè)計原則的書,有問題或建議請?zhí)岢鰜?,大家共同學(xué)習(xí)。
1,面向?qū)ο笫且环N思考方式(不用考慮哪些定義,就像我問你,漢語的說話方式,大部分人是不會思考完你要說的話是否符合規(guī)則在說呢,只要記住把所有涉及到的東西看成對象去編程)例:“一個人吃飯” 面向過程的思考方式:“第一步,人拿起筷子。第二步,人用筷子夾飯。第三步,人把飯吃掉。第四步,無線循環(huán)第二步第三步,直到飯沒或人吃飽?!? 面向?qū)ο蟮乃伎挤绞剑喝耸且粋€類,飯是一個類,飯類中某屬性減少,人類中某屬性增加,飯類中屬性沒有時,或人類中屬性達(dá)到最大值即吃完。 擴(kuò)展還是修改? 擴(kuò)展時什么?不就是增加,往類里面添加就是擴(kuò)展。其實答案你自己已經(jīng)寫出來了,你 1,2,3,4,里面那個有添加就是擴(kuò)展。修改不就是改變,改為嘛。擴(kuò)展是開放的,對于修改是封閉的。就是說 擴(kuò)展你可以無限擴(kuò),沒有局限。 修改你只能改那類里的東西,類本來就有的屬性。(沒必要記,有些人就喜歡把不需要定義的,硬改成有定義。只要記住把所有涉及到的東西看成對象去編程)
1、開閉原則(Open Close Principle):開閉原則就是說對擴(kuò)展開放,對修改關(guān)閉。-----在程序需要進(jìn)行拓展的時候,不能去修改原有的代碼,實現(xiàn)一個熱插拔的效果--------。所以一句話概括就是:為了使程序的擴(kuò)展性好,易于維護(hù)和升級。想要達(dá)到這樣的效果,我們需要使用接口和抽象類。看下定義:這樣的原則還有很多:2、里氏代換原則(Liskov Substitution Principle)里氏代換原則(Liskov Substitution Principle LSP)面向?qū)ο笤O(shè)計的基本原則之一。 里氏代換原則中說,任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。 LSP是繼承復(fù)用的基石,只有當(dāng)衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被復(fù)用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。里氏代換原則是對“開-閉”原則的補(bǔ)充。實現(xiàn)“開-閉”原則的關(guān)鍵步驟就是抽象化。而基類與子類的繼承關(guān)系就是抽象化的具體實現(xiàn),所以里氏代換原則是對實現(xiàn)抽象化的具體步驟的規(guī)范3、依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)這個是開閉原則的基礎(chǔ),具體內(nèi)容:真對接口編程,依賴于抽象而不依賴于具體。4、接口隔離原則(Interface Segregation Principle)這個原則的意思是:使用多個隔離的接口,比使用單個接口要好。還是一個降低類之間的耦合度的意思,從這兒我們看出,其實設(shè)計模式就是一個軟件的設(shè)計思想,從大型軟件架構(gòu)出發(fā),為了升級和維護(hù)方便。所以上文中多次出現(xiàn):降低依賴,降低耦合。5、迪米特法則(最少知道原則)(Demeter Principle)為什么叫最少知道原則,就是說:一個實體應(yīng)當(dāng)盡量少的與其他實體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對獨立。6、合成復(fù)用原則(Composite Reuse Principle)原則是盡量使用合成/聚合的方式,而不是使用繼承。
文章TAG:里氏代換原則示例里氏代換原則

最近更新

  • 燈光控制器,KTV包房燈光控制器燈光控制器,KTV包房燈光控制器

    KTV包房燈光控制器2,有沒有燈光控制器3,燈光控制器一條線是如何控制若干條線路的4,光源控制器有哪些特點怎么應(yīng)用啊5,燈光控制器怎么用的6,led燈控制器的產(chǎn)品簡介1,KTV包房燈光控制器LED調(diào)光.....

    知識 日期:2023-08-20

  • 瑞昱芯片,瑞昱主營什么芯片呢瑞昱芯片,瑞昱主營什么芯片呢

    瑞昱主營什么芯片呢2,博通網(wǎng)卡芯片和瑞昱網(wǎng)卡芯片哪個好3,內(nèi)存卡瑞昱Realtek芯片怎么樣4,我的主板上有3顆瑞昱芯片它們分別是什么5,瑞昱RTL8762C芯片功能怎么樣6,realtek和ALC6621,瑞昱主營.....

    知識 日期:2023-08-20

  • 萊卡充電寶數(shù)據(jù),充電寶上的數(shù)據(jù)是什么意思萊卡充電寶數(shù)據(jù),充電寶上的數(shù)據(jù)是什么意思

    搜電充電如何寶充電搜電充電有帶插頭的和不帶插頭的兩種寶充電有插孔的地方可以充電。對于數(shù)據(jù)line充電寶藏,一般最好使用原數(shù)據(jù)line充電寶藏-,充電寶充電有什么問題充電寶充電的原因有.....

    知識 日期:2023-08-20

  • 20awg 數(shù)據(jù)線20awg 數(shù)據(jù)線

    含義:最高頻率:26awg107kHz,30awg270kHz。3.選擇正規(guī)品牌數(shù)據(jù)線,好的數(shù)據(jù)線的內(nèi)導(dǎo)體會用鍍錫銅線和無氧純銅線,山寨的數(shù)據(jù)線大部分會用鐵絲,美國標(biāo)準(zhǔn)22AWG2CUSB數(shù)據(jù)電纜,1,數(shù)據(jù)線纜的粗細(xì)數(shù).....

    知識 日期:2023-08-20

  • 交流電三要素,電工電子中正弦交流電的三要素交流電三要素,電工電子中正弦交流電的三要素

    電工電子中正弦交流電的三要素2,何謂交流電的三要素他們各反映了什么3,交流電三要素是4,正弦交流電的三要素是什么并簡單說明5,交流電的三大要素和三大參數(shù)是什么6,三相應(yīng)弦交流電的三要素.....

    知識 日期:2023-08-20

  • a710,佳能A710到底怎么樣a710,佳能A710到底怎么樣

    佳能A710到底怎么樣2,誰用過聯(lián)想A710手機(jī)怎么樣3,佳能A710的性能好嗎4,聯(lián)想A710筆記本怎么樣5,佳能a710和a2100有什么區(qū)別那個性價高6,聯(lián)想A550和聯(lián)想A710比較1,佳能A710到底怎么樣佳能滴A系.....

    知識 日期:2023-08-20

  • 科技創(chuàng)新大賽,全國科技創(chuàng)新大賽科技創(chuàng)新大賽,全國科技創(chuàng)新大賽

    全國科技創(chuàng)新大賽2,全國科技創(chuàng)新大賽含金量3,有哪些適合高中生參加的科技創(chuàng)新比賽4,青少年科技創(chuàng)新大賽含金量高嗎第34屆大賽如何報名5,科技創(chuàng)新大賽主要方向是什么6,青少年科技創(chuàng)新大賽省.....

    知識 日期:2023-08-20

  • 小米手環(huán)2同步數(shù)據(jù)閃退小米手環(huán)2同步數(shù)據(jù)閃退

    小米手環(huán)顯示在運動過程中無法直接關(guān)閉同步數(shù)據(jù)。小米手環(huán)顯示無法移動同步數(shù)據(jù)如何撤退?小米手環(huán)同步數(shù)據(jù)保持轉(zhuǎn)動小米手環(huán)-,斷開時,-2手環(huán)2可以單獨記錄步數(shù)。1、小米手環(huán)2總是連接失敗.....

    知識 日期:2023-08-20