Is-a & Has-a

在面向对象设计、面向对象程序设计等领域,Is-a描述的是类的父子继承关系。

当一个类S继承另外一个类F时,我们一般会说这是子类S继承父类F,或说类F是类S的父类。换句话说即为

S is a F .

S被包含在F内,或说F包含S。更为一般得说,概念体S物是概念体F物的特殊化,而概念体S物是概念体F物的一般化。

举例:

三角形是一个多边形;外科医生是一个医生;苹果是一个水果······

那如果说

黑板是一个教室。

显然,黑板怎么可能是教室呢?这明显不满足‘Is-a’关系。但是退一步思考,黑板和教室的确是有关联的,这点是不可否认的。只是它们之间的关系并非‘Is-a’,而是‘Has-a’。
如果说

教室有一个黑板。

这样就更加符合逻辑了,在面向对象程序设计中,这表示教室带有黑板的实例变量。也就是说教室会有一个黑板的引用,但是教室并没有继承黑板。


Summary:

在实际面向对象编程过程中,如果想知道某物是否应该继承另一物时,就可以使用‘Is-a’测试来检验。

Is-a测试适用于在继承层次的任何地方。如果你的继承层次树设计得很好,那么所有的子类都应该通过任何一个上层父类的Is-a测试。

参考:

  • Is-a 维基百科
  • “Head First Java”(中文版)

你可能感兴趣的:(Is-a & Has-a)