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

时间:2010-02-08 00:15:03

标签: oop

我刚读完这本书,里面有“HAS-A”和“IS-A”。谁知道具体是什么意思?尝试在书中搜索,但这本书长达600页。

10 个答案:

答案 0 :(得分:141)

这是面向对象的编程和UML术语,而不是特定于Java的。实际上你应该注意三个案例:

  1. 众议院建筑(继承);
  2. 房子房间(组成);
  3. 众议院拥有占有者(聚合)。
  4. (2)和(3)之间的差异是微妙但重要的区分。它们一起是 association 的形式。有什么不同?组合意味着子对象不能在父母的上下文之外生活(破坏房屋和房间消失),而聚合意味着孩子可以独立存在(破坏房屋,占用者去其他地方)。

答案 1 :(得分:53)

Car有一个Wheel

Sparrow是一个Bird

在学术上,这些术语用于决定构成和继承。

答案 2 :(得分:15)

Has-a表示有问题的类'具有'类型的字段。

Is-a表示类从超类扩展或实现接口。如果在这种情况下针对某个类进行测试,instanceof运算符将返回true

答案 3 :(得分:6)

这不是特定于java的,它是特定于OO的。

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

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

我不会详细介绍何时使用每个类,因为它取决于类的使用方式,即使知道有太多需要考虑的因素,针对特定情况的新问题也会更合适。

答案 4 :(得分:6)

是a =特殊种类,例如汽车是一种特殊的车辆。

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

答案 5 :(得分:6)

这些名字几乎意味着所有。

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

如果存在名为 Vehicle 的班级。然后车辆的任何类型都可以继承这个超类的属性。例如警车将继承车辆的所有属性,因为它是后者的专业化。

enter image description here

另一方面,HAS-A类具有对另一个类或另一个类的实例的引用。换句话说,它与另一个类共享关联。有两种类型的HAS-A类,聚合意味着该类可以独立存在,而组合,意味着该类只能与它共享一个关联的一侧存在。

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

再次使用车辆类,驱动程序类将被视为聚合,因为驱动程序类可以作为独立实体存在,即使车辆类不再存在。

如果车辆类不存在,则引擎类不存在,因为引擎不能存在于范围之外<强>车辆

enter image description here

答案 6 :(得分:5)

&#34; 是A &#34; :建立相关对象之间的关系。您可以使用 继承 来建立关系。

&#34;有A&#34; :定义可能不相关的对象的功能。您可以使用 界面 来定义功能。

示例:

是一个动物。 具有学习能力。

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

答案 7 :(得分:4)

IS-A,HAS-A等并不是非常OO。相反,Liskov substitution principle是OO。

鲍勃叔叔在http://www.hanselminutes.com/default.aspx?showID=163

阐明了IS-A的历史
  罗伯特C.马丁:“ISA”这个词悄悄进入我们的词汇,通过一个单词ISA的方式,它通过迂回的路径悄悄进入我们的词汇,并在面向对象的圈子中变得非常重要,但它没有开始那样。它通过人工智能人群在80年代悄悄创造出来,他们创造了这些精彩的知识网,你可能还记得这一点,所有关于人工智能的宣传都是在80年代末期,90年代早期,然后创建了这些结构,这些结构将知识网络引入这些推理引擎,并且实体和知识网之间的关系就像是一样,味道像a,闻起来像一个ISA,所有这些 - 一种关系就像一个,有一个,当AI人群失去它的资金时,所有那些资金驱动器,他们有点看了看,并说,“哦,还有其他的东西,它有点酷。看,这些关系就像已经开启和关闭,它真的相似,我们应该进入。 “他们有点做了,词汇也过渡了。这很有趣,它也有点不幸,因为继承不是ISA。继承,如果你用一个非常厌倦的眼睛看它,继承是子方面中的方法和变量的声明,它与ISA无关,ISA的概念可能非常混乱。简单的例子,整数是实数,实数是复数。你可以在你的UML中绘制它,它非常简单,所有继承都在那里,等等,但考虑尝试编译它。我们希望整数是16或64位,但如果它是从实数推导出来的,则实数中有两个整数,尾数和一个特征,指数和它们使用的,它们暗示了它们内部的二进制点制作这些浮点数。浮点数,实数,来源于复数,但复数中有两个实数,即虚数和实数。如果您考虑用C ++或Java编写,那么您将编写一个无法编译的结构,因为它具有无限的思想。用英语做出完美的理解在软件中毫无意义。

答案 8 :(得分:2)

正如克莱图斯指出的那样,is-a是不同的。但要注意has-a。这可能意味着组合(生命周期责任),聚合(某事物的一部分),或简单地使用-a(引用,知道如何构建一个或找到一个)。后者只是一种联想。

答案 9 :(得分:1)

如果您开发了一个名为&#34; School&#34;的集合类。你会有#34;老师&#34;和#34;学生&#34;在学校。你培养了一个'#34;班级和两个&#34;学生&#34;和老师&#34;将继承自&#34; Person&#34;因为两者都是 - &#34;是&#34;人。学生和老师都有生日。你会创建一个&#34;日期类&#34;因为老师和学生都有&#34;或&#34;有一个&#34;在#34; Person Class&#34;内的生日。这是&#34;集装箱船&#34; 总之,&#34;是一个人&#34;使用继承 &#34;有一个&#34;使用集装箱船