Cormac有一个非常好的答案,但是我只想首先说明造成混乱的原因。
OO中的继承通常使用现实世界中的隐喻来教授,例如“苹果和橙子都是水果的子类”。不幸的是,这导致人们错误地认为,OO类型应根据独立于程序的某些分类层次结构进行建模。
但是在软件设计中,应根据应用程序的要求对类型进行建模。其他领域中的分类通常是不相关的。在带有“ Apple”和“ Orange”对象的实际应用程序中(例如,超市的库存管理系统),它们可能根本不是完全不同的类,而“ Fruit”之类的类将是属性而不是超类。
圆椭圆问题是一个红色鲱鱼。在几何中,圆是椭圆的特化形式,但是示例中的类不是几何图形。至关重要的是,几何图形是不可变的。虽然可以对其进行变换,但是随后可以将一个圆变换为省略号。因此,圆可以更改半径但不能更改为省略号的模型并不对应于几何。这样的模型在特定的应用程序(例如绘图工具)中可能有意义,但是几何分类与如何设计类层次结构无关。
那么Circle应该是Ellipse的子类,反之亦然吗?这完全取决于使用这些对象的特定应用程序的要求。绘图应用程序在处理圆和椭圆时可以有不同的选择:
将圆形和椭圆形视为具有不同UI的不同类型的形状(例如,椭圆形上有两个调整大小手柄,圆圈上有一个手柄)。这意味着从应用程序的角度来看,您可以拥有一个在几何上是圆形的椭圆,但不是一个圆形的椭圆。
将包括圆在内的所有椭圆都一样,但是可以选择将x和y锁定为相同的值。
椭圆只是已应用缩放变换的圆圈。
每种可能的设计都会导致不同的对象模型-
在第一种情况下,Circle和Ellipses将成为同级类
在第二个中,根本不会有单独的Circle类
在第三个中,将没有明显的Ellipse类。因此,所谓的圆椭圆问题不会以任何这些方式进入画面。
因此要回答提出的问题:圆是否应延伸椭圆?答案是:这取决于您要如何处理。但是可能不会。