HAS-A,IS-A面向对象语言的术语

我正在阅读这本书,里面写着“HAS-A”和“IS-A”。 任何人都知道他们是什么意思? 试图在书中search,但这本书是600页长。 谢谢!

这是面向对象的编程和UML术语,而不是Java特有的。 实际上有三种情况你应该知道:

  1. 房子build筑(inheritance);
  2. 房子有一个房间(组成);
  3. 一个房子有一个占有者(聚合)。

(2)和(3)之间的区别是微妙的但重要的区分。 他们一起是联合的forms。 有什么不同? 构图意味着孩子的对象不能活在父母的背景之下(摧毁房屋和房间消失),而聚合意味着孩子可以自己存在(摧毁房屋,而占有者则去其他地方)。

一辆Car有一个Wheel

SparrowBird

在学术上,这些术语是用来决定组合和inheritance之间的。

意味着所讨论的类有一个types的字段。

是 – 这意味着类从一个超类inheritance或实现一个接口。 如果在这种情况下针对类进行testing, instanceof运算符将返回true

这不是Java特定的,它是OO特定的。

IS-A意味着你可以有一个“是”某个东西的类。 像学生“IS-A”一样 这用于描述一个对象是另一个对象的子类。

有时两个类之间没有IS-A关系,但是“HAS-A”更合适。 例如,椅子“HAS-A”腿。 或几个。 这被称为聚合,而不是inheritance。

我不会详细讨论何时使用每个类的细节,因为这取决于如何使用这些类,即使已知有很多需要考虑的地方,对于特定情况的新问题将更为合适。

是一种特殊的例如汽车是特殊types的汽车。

有一个=物理上有东西,例如汽车有一个引擎。

IS-A,HAS-A等并不是真的很OO。 而Liskov替代原则是OO。

ISB的历史可以在http://www.hanselminutes.com/default.aspx?showID=163上find。;

罗伯特·C·马丁(Robert C. Martin):“ISA”这个词悄然进入我们的词汇,顺便说一句话,它通过一条迂回的路线进入我们的词汇表,并在面向对象的圈子中变得非常重要,但是它并不是以这种方式开始的。 它在80年代通过人工智能创造了这些奇妙的知识网,你可能还记得80年代后期,90年代初人工智能的所有宣传,然后创build了这些结构,这些结构将走知识网这些推理引擎,实体和知识网之间的关系就像一个味道就像一个味道就像一个ISA,所有这些 – 一个关系就像一个人,当AI人群失去了资金时,所有这些资金驱动,他们看了一下,说:“哦,还有其他的东西,这是很酷的。看,这些关系是一样的,这是真的相似,我们应该搬进去。 “ 而他们也是这样做的,词汇已经过渡了。 这很有趣,也有点不幸,因为inheritance不是ISA。 inheritance,如果你用一个非常疲惫的眼光来看待它,inheritance就是在一个子范围内的方法和variables的声明,它与ISA无关,而ISA的概念可能是非常混乱的。 简单的例子,一个整数是一个实数,一个实数是一个复数。 你可以在你的UML中绘制它,对于那里的所有inheritance等等,它会非常简单,但考虑尝试编译它。 一个整数,我们希望将是16或64位,但如果它是从实数派生,一个实数有两个整数,尾数和特征,指数和他们使用,他们暗示二进制点内使这些浮点数。 浮点数,实数,由复数导出,但复数中有两个实数,即虚数和实数。 如果你想用C ++或者Java来编写,那么你会写一个无法编译的结构,因为它有无限的思想。 在英文中完全有意义,在软件中完全没有意义。

正如cletus所指出的那样,一个是不同的。 但要小心一点。 这可能意味着组合(生命周期响应),聚合(部分东西),或简单地使用一个(有一个引用,知道如何build立一个或find一个)。 后者只是一个协会。

名字几乎意味着所有。

一个IS-A类可以被认为是对inheritance其所有属性的另一个类的实例的专门引用。

如果存在一个名为Vehicle的类。 那么任何types的车辆都可以inheritance这个超类的属性。 例如, 警车将inheritance车辆的所有属性,因为它是后者的专业化。

在这里输入图像说明

另一方面,HAS-A类具有对另一个类或另一个类的实例的引用。 换句话说,它与另一个class级共享一个关联 。 有两种types的HAS-A类, 聚合意味着类可以独立存在,而构成 ,意味着类只能存在于它与之共享的那一边。

知道何时将对象分类为组合类或者仅仅将其作为另一个类的属性很重要。

再次考虑车辆类别, 驾驶员类别将被视为聚合,因为即使车辆类别不存在, 驾驶员类别也可以作为独立实体存在。

而如果Vehicle类不存在,则不能存在Engine类,因为Engine不能存在于Vehicle的范围之外。

在这里输入图像说明

”:build立相关对象之间的关系。 你可以使用inheritance来build立关系。

“HAS A” :定义可能不相关的对象的能力。 您可以使用界面来定义function。

例:

是一只动物。 它有一个学习能力。

不是动物。 他具有学习,思考,攀登和应用的能力。

如果你开发一个名为“学校”的收集类。 你会在学校里有“老师”和“学生”。 你开发一个“人”class,“学生”和“老师”都将inheritance“人”class,因为他们都是“人”。 学生和老师都有生日。 您将创build一个“dateclass”,因为老师和学生在“人员class级”中都有“有”或“有”生日。 这就是“集装箱船”总结“是一个人”使用inheritance“拥有”使用集装箱船