我只是在读完这本书,里面有"HAS-A"和"IS-A"这两个词.谁知道具体是什么意思?尝试在书中搜索,但这本书长达600页.
cle*_*tus 145
这是面向对象的编程和UML术语,而不是特定于Java的.实际上你应该注意三种情况:
(2)和(3)之间的区别是微妙但重要的区分.他们一起是形式的关联.有什么不同?组合意味着子对象不能在父母的上下文之外生活(破坏房屋和房间消失),而聚合意味着孩子可以独立存在(破坏房屋,占用者去其他地方).
Ano*_*on. 54
A Carhas-a Wheel.
A Sparrow是-a Bird.
在学术上,这些术语用于决定构成和继承.
这些名字几乎意味着所有.
可以将IS-A类视为对继承其所有属性的另一个类的实例的专用引用.
如果存在名为Vehicle的类.然后任何类型的车辆都可以继承这个超类的属性.例如,警车将继承车辆的所有属性,因为它是后者的专业化.
另一方面,HAS-A类具有对另一个类或另一个类的实例的引用.换句话说,它与另一个类共享一个关联.有两种类型的HAS-A类,聚合意味着该类可以独立存在,而组合,意味着该类只能与它共享一个关联的一侧存在.
重要的是要知道何时将对象分类为组合类或简单地将其分类为另一个类的属性.
再次获取Vehicle类,Driver类将被视为聚合,因为即使Vehicle类不再存在,Driver类也可以作为独立实体存在.
而一个引擎类可以不存在,如果一个汽车类是不存在的,因为发动机不能在范围之外存在车辆.
这不是特定于Java的,它是OO特定的.
IS-A意味着你可以拥有一个"是"的东西.就像一个学生"IS-A"的人.这用于描述一个对象是另一个对象的子类.
有时两个类之间不存在IS-A关系,但"HAS-A"更合适.例如,椅子"HAS-A"腿.或几个.这称为聚合,而不是继承.
我不会详细介绍何时使用每个类,因为它取决于类的使用方式,即使知道有太多需要考虑,针对特定情况的新问题也会更合适.
正如 cletus 指出的那样,is-a 是不同的。但要小心 has-a。这可能意味着组合(终生责任)、聚合(某事物的一部分)或简单地使用-a(有一个引用,知道如何构建一个或找到一个)。后者只是一个协会。
IS-A、HAS-A 等实际上并不是非常面向对象。相反,里氏替换原则是OO。
\n\nUncle Bob 揭示了 IS-A 的历史,网址为:http://www.hanselminutes.com/default.aspx ?showID=163
\n\n\n\nRobert C. Martin:“ISA”这个词悄悄地进入了我们的词汇表,顺便说一下,ISA 这个词通过一种迂回的方式进入了我们的词汇表,并在面向对象的圈子中变得非常重要,但它并没有就这样开始吧。它在 80 年代通过人工智能人群悄然出现,他们创造了这些美妙的知识网络,你可能还记得,80 年代末、90 年代初对人工智能的所有炒作,然后创建了这些结构它将行走知识网这些推理引擎,实体和知识网之间的关系就像a,味道像a,闻起来像ISA,所有这些\xe2\x80\x93A关系是a,就像a,有一个,当人工智能人群失去了资金,以及所有这些资金驱动时,他们看了看并说,“哦,还有其他东西,这很酷。看,有这些关系,就像已经存在和正在存在一样,真的很相似,我们应该搬进去。” 他们确实这么做了,词汇也发生了转变。这很有趣,但也有点不幸,因为继承不是 ISA。继承,如果你以一种非常厌倦的眼光看待它,继承就是子作用域中方法和变量的声明,它与 ISA 无关,而且 ISA 的概念可能非常令人困惑。简单的例子,整数是实数,实数是复数。您可以在 UML 中绘制它,它非常简单,具有所有继承等等,但请考虑尝试编译它。我们希望整数是 16 位或 64 位,但如果它是从实数导出的,实数中有两个整数,一个尾数和一个特征,指数和它们使用的,它们隐含了其中的二进制小数点使这些浮点数。浮点数(即实数)源自复数,但复数中有两个实数,即虚部和实部。如果您考虑用 C++ 或 Java 编写它,您会编写一个无法编译的结构,因为它有无限的思想。在英语中完全有意义,在软件中完全没有意义。
\n
" IS A ":建立相关对象之间的关系.您可以使用继承来建立关系.
"有A":定义可能不相关的对象的功能.您可以使用界面来定义功能.
例:
狗是动物.它具有学习的能力.
人不是动物.他有学习,思考,攀登和应用的能力.