当前位置: 首页 > 知识库问答 >
问题:

什么时候使用关联、聚合、组合和继承?

赏阳嘉
2023-03-14

我在Stackoverflow上看到了很多解释关系区别的帖子:关联、聚合、组合和继承,并附有例子。然而,更具体地说,我对每种方法的优点和缺点,以及什么时候一种方法对手头的任务最有效感到困惑。这是我一直无法找到一个好答案的事情。

为了与论坛的指导方针保持一致,我没有问为什么人们个人更喜欢使用继承而不是组合。我特别感兴趣的是每种方法中的任何客观优点/缺点,尽管听起来很强。一、 e.一种方法是创建比另一种方法更可读的代码,还是具有更好的运行时效率等。

理想情况下,如果有人能给我一些现实世界的例子,这些方法可能成功或失败,以及为什么,这对发展我的和我希望其他人的知识将非常有用。

为了确保建立坚实的基础,我在Python 2中包含了每种关系的示例。如果我对这些关系的理解实际上不正确,希望这可以避免混淆。

协会

B类与A类有一周的关联关系,因为它在addAllNum方法中使用了来自A的特定属性。然而,这就是关系的范围。

class A(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def addNums():
        self.b + self.c

class B(object):
    def __init__(self, d, e):
        self.d = d
        self.e = e

    def addAllNums(self, Ab, Ac):
        x = self.d + self.e + Ab + Ac
        return x

ting = A("yo", 2, 6)
ling = B(5, 9)

print ling.addAllNums(ting.b, ting.c)

聚合

B类与A类形成聚合关系,因为它在初始化时引用一个独立的A对象作为其属性之一。虽然B对象依赖于A,但如果B被破坏,A将继续存在,因为它独立于B。

class A(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def addNums():
        self.b + self.c

class B(object):
    def __init__(self, d, e, A):
        self.d = d
        self.e = e
        self.A = A

    def addAllNums(self):
        x = self.d + self.e + self.A.b + self.A.c
        return x

ting = A("yo", 2, 6)
ling = B(5, 9, ting)

print ling.addAllNums()

组成

然而,就像聚合一样,B实际上不是引用一个独立的对象,而是在它自己的构造函数中将A的一个实例初始化为一个属性。如果B对象被破坏,那么A对象也会被破坏。这就是为什么组合是如此紧密的关系。

class A(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def addNums():
        self.b + self.c

class B(object):
    def __init__(self, d, e):
        self.d = d
        self.e = e
        self.A = A("yo", 2, 6)

    def addAllNums(self):
        x = self.d + self.e + self.A.b + self.A.c
        return x

ling = B(5, 9)

print ling.addAllNums() 

我决定不包括继承的例子,因为我对它完全满意,我觉得包括它可能会使问题偏离主题。

无论如何,同样,上述示例和继承(相互比较)的优点和缺点是什么。

谢谢你。

共有2个答案

蒋奇
2023-03-14

我个人的观点是,您应该首先考虑如何对真实世界的数据进行建模,以帮助您解决特定的现实世界问题。将事物分配给类,描述类和/或实例之间的关系,描述事物的属性等,是困难的部分:做好这一点,代码中的模式(无论是继承、聚合、子类化等)就变得容易了。例如:

正方形和矩形之间是什么关系?可逆矩阵是正方形矩阵的子类吗?死牛是哺乳动物吗?学生是人的子类吗?老师是子类吗?助教呢?

闻人业
2023-03-14

根据维基百科的经验法则是,随着时间的推移,关系会随着时间的流逝而软化,或者随着概念模型的细节增加而变得柔和,即组合成为聚合,聚合成为关联,例如,发动机最初可能是汽车的组合,但随着您添加功能,发动机可以从一辆汽车转移到另一辆车,使其成为聚合。

因此,要回答您对每种方法的优缺点的问题,更多的是您正在建模的关系的问题,类似于我应该将 Name 存储为字符串还是数字的问题

 类似资料:
  • 我开始研究 OOAD,我很难找到一个 代码示例来说明如何以编程方式实现、和。(到处都有几篇文章,但它们与 C# 或 Java 有关)。我确实找到了一两个例子,但它们都与我的导师的指示相冲突,我很困惑。 我的理解是,在: < li >关联:Foo有一个指向Bar对象的指针作为数据成员 < li >聚合:Foo有一个指向Bar对象的指针,Bar的数据被深度复制到该指针中。 < li >组成:Foo有一

  • 我试图确认我对关联、聚合的代码外观的理解 聚合:哈斯-a。它具有另一种类型的现有对象 组成:由另一个对象组成 协会:我对此有两种看法。 > 当一个类与另一个类相关联时。因此,上述两个都是关联的示例。 关联是一种较弱的聚合形式,其中类不保留对其接收的对象的引用。 我的理解正确吗?我在这里和这里阅读了相互矛盾的文章,所以我真的不确定该遵循哪一个。我的理解似乎符合第一个环节。我觉得第二个环节是错误的,或

  • null 在编写代码时,什么时候应该选择关联类型而不是泛型类型参数,什么时候应该做相反的操作?

  • 问题内容: 我试图理解这些术语的含义。我举了一些例子,例如: 汇总:Facebook 有一个 用户 组成:facebook 中的 每个用户 都有一个 会话。 协会:人们 使用 浏览器 但是我对 具有 和 使用我的 示例感到困惑。为什么不能是用户 使用 Facebook帐户或Facebook 使用 会话来认证用户? 就OOP而言,这是错误的吗?我在哪里想念这个概念? 问题答案: 该 使用 关系意味着

  • 问题内容: 什么时候适合使用AJAX? 使用AJAX的利弊是什么? 回应查德·伯奇(ChadBirch)的回答:是的,我指的是开发“标准”站点时,该站点将利用AJAX的优势,而不会因其应用程序而受挫。以会破坏搜索排名的方式使用AJAX是不可接受的。因此,如果“保持网站完好无损”需要做更多的工作,那将是一个“骗局”。 问题答案: 这是一个相当大的主题,但是您应该使用AJAX来增强用户体验,而不必完全

  • 我理解聚合和组合之间的区别,但我在联想方面有点挣扎。我目前的理解是,当“它们相互使用”时,类之间存在关联,例如,在方法调用期间将一个对象传递给另一个对象。另请参阅: http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit 这两个对象都是独立存在的,和聚合不同,任何对象