並不是說給乙個類取名為rectangle就真能取代乙個這個英文單詞(矩形)能指代的概念的,乙個英文單詞有其預設的,隱含的契約,有可能與程式世界裡想表達的概念不一致或有細微的差別。
當你寫下
public class rectangle{}
時,可能你腦子裡想的是矩形的契約「乙個封閉的圖形,有四個角,每個角度都是90度」,然後你開始實現這個類
public class rectangle
你的實現卻完全聚焦到了矩形的長和寬上,卻完全忽視了它們的契約」改變長度或者寬度不會互相影響」,注意,此時你並沒有實現乙個幾何意義上的「矩形」,你實現的類與下面的類無異,
public class a
隱患開始埋下……
當你被問到」正方形是乙個矩形嗎」?你腦子裡閃過初中數學(高中數學??)「當然是!!!」,於是你繼承了矩形
public class square extends rectangle
public void setwidth(int width)
}public class test
}我們學到了什麼?
乙個類或介面是被其契約定義出來的,而不是被其「名字」定義出來的。在閱讀**時要意識到雖然**」可讀」但是其語義下的契約並未實現或還是模糊的。不要一開始就建立空中樓閣的架構,設計者對其中的契約並未有具體的認識,這樣的設計往往有潛在的缺陷。
不要僅僅從乙個名字判斷出其能如何被子類繼承,例如,「馬」能被「斑馬」繼承嗎?
「。。。當然可以」
那麼這個「馬」能被「海馬」繼承嗎?!!!
(gotcha!!!)
就繼承實現來說,如果子類要invalid父類的行為,就有可能違反lsp。反之,如果子類要大量擴充套件或新增父類行為,這又說明子類特化的太厲害,已經失去了父類的意味,讀這個類已經想象不出父類大概是個什麼樣子,對於理解設計並未有什麼幫助。
不要為了重用行為而繼承乙個類,可採用聚合/組合來實現。
1,不要包外繼承,因為設計者無法控制其契約的變化。
2,不要繼承包內不是為繼承設計的類
3,盡量不要繼承非抽象類
4,盡量繼承抽象類
5,繼承抽象類時不要新增太多行為
6,對於抽象類的設計,非抽象方法做成final
7,記住,真正可適用實現繼承的scenario是很少,很苛刻的。
JAVA中的繼承
子類繼承父類的共享方法,父類中的private方法不能被共享 在同乙個包中,protected修飾的方法也可以被繼承,類成員如果不加任何修飾限定詞,預設的是包訪問許可權,也可以繼承這類方法。繼承的一般規則是 將所有的資料成員設定為private,所有方法設定為public 一般規則 package ...
Java中的繼承
一 繼承 1.在多個類中他們的屬性有共同的屬性這樣就可以在定義乙個共同的類,這個就可以的是父類。2.父類的屬性個方法,子類可以直接使,只要繼承了父類,其實就相當於擁有了父類的屬性和方法。3.子類的屬性和方法父類不能使用。4.子類構建的時候先初始化父類,然後再初始化子類。5.通過構造方法觀察子類自動呼...
Java中的繼承
在繼承的關係中,子類就是乙個父類 即,子類可以被當作父類看待。例如 父類是員工,子類是講師,那麼 講師就乙個員工 關係 is a。定義父類的格式 乙個普通的類定義 public class 父類名稱 定義子類的格式 public class 子類名稱 extends 父類名稱 定義乙個父類 員工 c...