[英]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.