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

day*_*ill 10 python inheritance associations composition aggregation

我在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)
Run Code Online (Sandbox Code Playgroud)

聚合

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()
Run Code Online (Sandbox Code Playgroud)

组成

就像聚合一样,B而不是引用一个独立的对象,实际上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() 
Run Code Online (Sandbox Code Playgroud)

我决定不再包含一个继承的例子,因为我对它完全满意,而且我觉得它的包含可能会使问题的一点点切断.

无论如何,上面的例子和继承的优点和缺点是什么(相互比较).

谢谢.

小智 0

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

正方形和长方形有什么关系?可逆矩阵是方阵的子类吗?死牛是哺乳动物吗?学生是人的子类吗?老师是子类吗?那么TA们呢?