我同意
@vczh的观点,但我倒不认为这是is a的流毒。
事实上是很多人根本就搞不清什么是is a xxx。
X is a Y的一个我认为相对正确理解是,所有的X是所有的Y的真子集。
然后我们来套一下就知道了
所有的窗口是所有的矩形的真子集。
好像有点不对,窗口和矩形有神马关系。
我相信你不会指着你家的窗子说,这是个矩形,然后指着你家的挂钟说,这是个圆形,,,,
再想一下我们是怎么把窗口和矩形结合起来的?
事实上一个读起来比较正常的句子是:窗口是矩形的。
千万别丢了这个的,有没有这个的含义可完全不一样。
我们不会说,苹果是水果的。
所以,窗口是矩形的,这个描述真实的含义是:窗口是个矩形的容器,窗口是个矩形的控件,窗口是个矩形的XX。
如此一来,窗口是不是个矩形简直就是呼之欲出的事情。
至于窗口到底是个啥,事实上我非常不建议任何初学者从神马窗口这种东西开始构建自己的设计。在XX是YY这种概念都不能清晰的分辨的时候,从窗口这种高度具象和复杂的东西出发,弄出来的东西必然是惨不忍睹的。
OOD做多了,像C#这样的单根继承体系怎么设计基本已经是本能了,我也随便贡献一个吧,以Windows操作系统里面的窗口为例,初步的构想是这样的:
//标准的应用程序窗口 public class ApplicationWindow : StandardWindow, IMenuContainer, IToolbarContainer //标准窗口,指矩形窗口 public class StandardWindow : WindowBase, IDialog, IResizable //窗口基类 public class WindowBase : LayoutControl //布局控件 public class LayoutControl : ContainerControl //容器控件 public class ContainerControl : Control //控件 public class Control : IVisual //对话框,指有标题和关闭按钮的矩形可视化容器。 public interface IDialog : IRectangleVisual, IClosable, ITitleContainer //可以调整大小的矩形容器 public interface IResizable : IRectangleVisual //呈现为矩形区域的视觉控件 public interface IRectangleVisual : IVisual //需要绘制的东西 public interface IVisual //具有目录条的容器 public interface IMenuContainer //具有工具条的容器 public interface IToolbarContainer //可以关闭的视觉控件 public interface IClosable : IVisual
可以看出来,在我的设计里,矩形这一特征,还是被保留在继承体系中,但是只是其中一个很小的小枝。