設計模式-黎克特制替換原則
物件導向的語言繼承必不可少的,有如下優點
**共享,減少建立類的工作量
提高**的重用性
提高**的可擴充套件性
提高**的可擴充套件性
提高產品**的開放性
繼承侵入性 只要繼承,必須擁有父類的內容
降低**的靈活性,子類必須擁有父類的屬性和方法
增強耦合性。
黎克特制替換原則,為繼承定義規範。
正方形是一種特殊的長方形,如果將正方形設計為長方形的子類,不符合黎克特制替換原則
下方有三個類
類圖如下
關係如上所示
package demo1;
public class smarttest }}
package demo1;
/* * 定義乙個長方形類
* @author ming
* */
public class rectangle
public long getwidth()
public void setheight(long height)
public long getheight()
}
package demo1;
/* * 定義乙個正方形類繼承自長方形類
* * @author ming
* * */
public class square extends rectangle
public long getwidth()
public void setheight(long height, long width)
public long getheight()
}
在上面的三塊**中,當呼叫smarttest類的resize方法的時候,如果傳入的是父類,那麼將會可以的,如果傳入的是子類,正方形,那麼將會不可以的。
即。上方的為長方形行,正方形不行。
所以上面的栗子不符合黎克特制替換原則。
解決方法,使用繼承時,要遵守黎克特制替換原則,類b繼承類a時,不要重寫父類a的方法,也不能過載父類a的方法。
如果**更改如下更改
讓其兩個都共同定義同乙個父類即可
其中最上層的類為兩個類的抽象類。
/* * 定義乙個四邊形類,只有get方法set方法
* @author ming
* */
public abstract class quadrangle
package com.ming;
public class rectangle extends quadrangle
public long getwidth()
public void setheight(long height)
public long getheight()
}
package com.ming;
public class square extends quadrangle
public long getwidth()
public void setheight(long height)
public long getheight()
}
在上方的圖中,由於兩個為平級關係,所以父類的地方,換成子類也都可以。
黎克特制替換原則;父類可以的地方,換成子類也同樣可以。
乙個栗子
package com.ming2;
public class a
}
package com.ming2;
public class b extends a
public int func2(int a, int b)
}
在上方中,如果這樣書寫
package com.ming2;
public class client
}
就違反了黎克特制替換原則,即子類能使用的時候,父類也必須能使用。
www.iming.info
設計模式 (黎克特制替換原則)
黎克特制替換原則的引入 是針對物件導向中的繼承的缺點 乙個原則首先先介紹下它的定義 黎克特制替換原則為繼承定義了規範,下面我用書中看到的例子來說 1.子類必須完全實現父類的方法 首先先定義乙個槍的抽象類 public abstract class abstractgun 實現類的定義,不同的槍枝進行...
設計模式 黎克特制替換原則
設計模式 黎克特制替換原則 oo 中的繼承性的思考和說明 繼承包含這樣一層含義 父類中凡是已經實現好的方法,實際上是在設定規範和契約,雖然它不強制要求所有的子類必須遵循這些契約,但是如果子類對這些已經實現的方法任意修改,就會對整個繼承體系造成破壞。繼承在給程式設計帶來便利的同時,也帶來了弊端。比如使...
設計模式 黎克特制替換原則
1 繼承包含這樣乙個含義 父類中凡是已經實現好的方法,實際上是在設定規範和契約,雖然他不強制要求所有子類遵循這些契約,但如果子類對這些已經實現的方法任意修改,就會對整個繼承體系造成破壞。2 繼承給程式帶來便利與帶來了弊端。比如繼承會給程式帶來侵入性,程式可移植性降低,增加物件間的耦合度。如果這個類被...