里氏替換原則
OOP(Object Oriented Programming) 面向?qū)ο缶幊?/strong>
OO中的繼承性的思考
- 1.繼承包含這樣一層含義,父類(lèi)中凡是已經(jīng)寫(xiě)好的方法,實(shí)際上就是設(shè)定規(guī)范。雖然不強(qiáng)制要求所有子類(lèi)必須遵守規(guī)范(不重寫(xiě)方法),但是如果子類(lèi)對(duì)這些方法,任意修改就會(huì)對(duì)繼承體系造成破壞。
- 2.繼承在程序設(shè)計(jì)帶來(lái)便利同時(shí),也帶來(lái)弊端。使用繼承會(huì)給程序帶來(lái)侵入性,程序的可移植性降低,增加了對(duì)象間的耦合,如果一個(gè)類(lèi)被其他類(lèi)繼承,則當(dāng)這個(gè)類(lèi)需要修改時(shí),必須考慮所有的子類(lèi),并且父類(lèi)修改后,所有涉及到的子類(lèi)的功能可能會(huì)受到影響。
- 3.問(wèn)題提出,編碼中如何正確的使用繼承? => 里氏替換原則
基本介紹
- 1.里氏替換原則(Liskov Substitution Principle)在1988年,由麻省理工學(xué)院的里姓女士提出的。
- 2.如果對(duì)每個(gè)類(lèi)T1對(duì)象t1,都有類(lèi)型T2的對(duì)象t2,使得以T1定義的所有對(duì)象t1替換為t2時(shí),程序的行為不會(huì)方式改變,那么T2類(lèi)是T1的子類(lèi)。換句話說(shuō),所有引用基類(lèi)的地方,必須能透明的使用其子類(lèi)的對(duì)象。
- 3.在使用繼承時(shí),遵循里氏替換原則,在子類(lèi)中盡量不要重寫(xiě)父類(lèi)中寫(xiě)好的方法。
- 4.里氏替換原則,說(shuō)明繼承讓兩個(gè)類(lèi)的耦合性增強(qiáng)了,在合適的情況下,可以使用組合,聚合,依賴(lài)傳遞解決問(wèn)題。
案例1
案例只是為了體現(xiàn)原則的設(shè)計(jì),并無(wú)實(shí)際意義文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-678121.html
/**
* @author 長(zhǎng)名06
* @version 1.0
* 里氏替換原則 案例1
* 分析
* 因?yàn)锽類(lèi)繼承了A類(lèi),且不小心,重寫(xiě)了A類(lèi)的fun1方法,導(dǎo)致
* 原有的父類(lèi)的方法的功能,被破壞,違反了里氏替換原則
* 所以,在需要重寫(xiě)父類(lèi)的方法的類(lèi)關(guān)系中,可以將繼承關(guān)系替換成依賴(lài)(組合,聚合)關(guān)系
*/
public class Liskov1 {
public static void main(String[] args) {
A a = new A();
System.out.println("2-4=" + a.fun1(2, 4));
System.out.println("5-4=" + a.fun1(5, 4));
B b = new B();
System.out.println("2-4=" + b.fun1(2,4));//要求出2-4
System.out.println("4-5=" + b.fun1(4,5));//要求出4-5
System.out.println("4-5 + 9=" + b.fun2(4,5));//要求出4-5 + 9
}
}
class A {
public int fun1(int a, int b) {
return a - b;
}
}
class B extends A {
@Override
public int fun1(int a, int b) {
return a + b;
}
public int fun2(int a, int b) {
return fun1(a, b) + 9;
}
}
案例2
/**
* @author 長(zhǎng)名06
* @version 1.0
* 使用組合方式 替代繼承方式
*/
public class Liskov2 {
public static void main(String[] args) {
A a = new A();
System.out.println("2-4=" + a.fun1(2, 4));
System.out.println("5-4=" + a.fun1(5, 4));
B b = new B();
System.out.println("2-4=" + b.fun3(2,4));
System.out.println("4-5=" + b.fun3(4,5));
System.out.println("4+ 5 + 9=" + b.fun2(4,5));
}
}
class Base{
}
class A extends Base {
public int fun1(int a, int b) {
return a - b;
}
}
class B extends Base {
private A base = new A();
public int fun1(int a, int b) {
return a + b;
}
public int fun2(int a, int b) {
return fun1(a, b) + 9;
}
public int fun3(int a,int b){
return base.fun1(a,b);
}
}
只是為了記錄自己的學(xué)習(xí)歷程,且本人水平有限,不對(duì)之處,請(qǐng)指正。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-678121.html
到了這里,關(guān)于里氏替換原則的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!