何时使用关联,聚合,组合和继承?

时间:2016-09-12 15:09:14

标签: python inheritance associations aggregation composition

我在Stackoverflow上看到很多帖子解释了关系之间的区别:关联,聚合,组合和继承,以及示例。但是,我更加特别地混淆了每种方法的优缺点,以及当一种方法对于手头的任务最有效时。这是我无法真正找到一个好答案的。

与论坛的指导方针保持一致,我询问为什么人们可能会个人更喜欢使用继承而非组合。我对每种方法中的任何客观利益/弱点都特别感兴趣,这听起来有点强烈。即一种方法是否创建了比另一种更可读的代码,或者它是否具有更好的运行时效率等。

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

为了确保有一个可靠的基础,我已经在Python 2中包含了每个关系的例子。如果我对这些关系的理解实际上并不正确,那么这应该可以避免混淆。

协会

B类与A类有一周的关联关系,因为它在addAllNums方法中使用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 个答案:

答案 0 :(得分:1)

根据wikipedia的经验法则是,关系随着时间的推移而变得柔和,或者随着概念模型的细节越来越多,即组合成为聚合,聚合成为关联,例如引擎可能是一个组合汽车最初但是当你添加功能时,引擎可以从一辆汽车转移到另一辆汽车,使其成为聚合。

所以,为了回答你关于每种方法的利弊的问题,它更多的是你正在建模的关系的问题,类似于我应该将一个名字存储为字符串或数字的问题

答案 1 :(得分:0)

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

正方形和矩形之间有什么关系? 可逆矩阵是方矩阵的子类吗? 死牛是哺乳动物吗? 学生是人的子类吗?老师是一个子类吗? TA怎么样?