[英]Java Inheritance hierarchy
矩形是父類,而正方形是矩形(父類)的子類。 這種關系正確嗎?
顯然,正方形在矩形的前面更具體,可以將其與矩形建立IS-A關系。 但是,如果我們以這種方式看到內存使用率會更高(在堆中創建正方形對象時,實例變量length和breath會像矩形一樣分別分配內存)。
而我們可以通過將Square與矩形平行放置來聲明Square類中的一個變量,從而將其減少一半。 因此,在堆中創建Square對象時,只會分配一個實例變量內存。
那么哪種方法會更有效?
通過將Square作為矩形的子級。
Or
鑒於有效的堆內存利用率,通過將Square放在繼承層次結構中的並行分支上?
如果我在任何時候錯了,請糾正我。
繼承最適合用來表示對象之間的“是”關系。
例如,這是繼承的一種錯誤用法:
public class List<E> {
:
}
public class Vector<E> extends List<E> {
:
}
您可能會問:“如果Vector使用了List的所有功能,那么為什么這是一個不好的繼承示例?” 這是次優的,因為Vector不是列表。 結果可能是List類可能以對Vectors不重要的方式演化,或者更糟的是,它會在Vectors中創建安全漏洞或缺陷。 在這種情況下,組合會更好,即,向量“具有”列表(而不是強迫向量成為列表)。
子類別確實應該是其父類別的示例(例如,MountainBike是自行車)。 如果不是這樣,則很可能關系不是應該由繼承層次結構表示的關系。
但是如果以這種方式看到內存使用率會更高(在堆中創建正方形對象時,實例變量的長度和呼吸將分別分配給內存,例如矩形
層次結構是鼓勵代碼重用和改善模塊化的工具。 如果在項目的此階段擔心內存分配,則應該選擇與Java不同的語言。 使用Java 是因為您希望獲得與抽象和面向對象有關的設計改進。
您不能肯定這is-a
設計方法在這里是顯而易見的選擇。 相反,您可以將Rectangle
作為基礎,並且當寬度等於高度時它將是一個正方形。 盡管Square 是一個 Rectangle,但您也可以使用Rectangle屬性對其進行建模。
但我同意,從概念上講,將Square
建模為擴展Rectangle
似乎更好。
您關於減少空間復雜性的問題
這個層次結構現在很簡單,因此您在問這個問題,但是假設您正在使用同時包含寬度和高度的操作來構建Rectangle
。 這些操作也將對Square
有效。 例如:
public int calculateArea(int width, int height);
如果從Rectangle
擴展Square
,則可能會使用相同的方法。 現在,要執行此操作,您必須通過構造函數初始化寬度和高度 。 您要做的就是將這些設置為相同,然后您可以得到該區域。 您不必出於任何原因而覆蓋它。 但是,如果Square
是分開的,那么您將如何進行面積計算? 您是否僅出於空間復雜性不可知的設計考慮而將它單獨插入。
如果擴展正方形,圍繞寬度和高度構建的所有內容都可以被正方形同樣利用。
您建議的節省空間的方法放棄了代碼的可重用性。 因此,最好擴展Square而不是節省該內存。
那么哪種方法會更有效?
By putting Square as a child of rectangle. Or By Putting Square at a parallel branch in inheritance hierarchy in view of effective heap memory utilization?
效率的提高是以犧牲代碼的可重用性為代價的。 因此,答案是“ 通過將Square作為矩形的子代。 ”
但是,請稍等...您也許也可以節省內存!
如果width和height都不是基元,則可以使Width和Height之類的引用指向同一對象,而不是2個不同的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.