MVC架构中的继承和组合之间的区别?

时间:2017-11-06 13:15:51

标签: python class

两者之间有什么更好的选择?我认为他们都提供相同的解决方案,但哪一个更适合在MVC架构中选择?在下面的代码中,Parent类是Model的一部分,Child类是Controller的一部分:

class Parent():
    def parent_function(self):
        print("parent class")

#passing parent as argument
class Child(Parent):
    def child_function(self):
        return super().parent_function()

#referencing parent on __init__
class Child():
    def __init__(self):
        self.parent = Parent()
        super().__init__()
    def child_function(self):
        return self.parent.parent_function()

谢谢

4 个答案:

答案 0 :(得分:4)

他们不是一回事。

前者使用继承,这意味着Parent中的所有方法和属性都可以在Child中使用。后者使用组合,其中Child个实例保留对Parent的(私有)引用。自动继承"复制"基础对象的功能,同时允许更改细节,但强制子对象实现父对象的相同接口。作文并没有强制这一点,允许更多的灵活性,但管理复杂的作曲链 - 可能是一个挑战。

无论你走哪个方向,只有当基类和派生类功能相似但细节不同时才应使用它们(例如Dog和Chihuahua / GoldenRetriever)。在您的评论中,您说要在MVC应用程序中链接模型和控制器,然后您只需要在控制器类中保留对模型的引用,并在必要时调用模型上的相关方法。由于模型和控制器是完全不同的东西,继承/组合在这里没有意义。

(顺便说一下,在第二个解决方案super()中没有做什么作为"父类"在这种情况下是object,而不是Parent。)

答案 1 :(得分:2)

他们肯定不是同一个解决方案。您的第二个示例将调用Childparent_function的定义,这在您的代码中不存在,而您的第一个示例将调用Parent类的定义parent_function,我们认为它存在。

同样在第二个示例中,调用super().__init__()无效,因为Child的唯一超类是object

您好像在询问组合继承之间的区别,这通常是个人偏好的问题,并且通常需要回答"是" vs."有一个"输入问题。有关如何使用组合而不是继承来实现类似功能的更好示例如下所示:

class Child:
    def __init__(self):
        self.parent_obj = Parent()
    def child_function(self):
        return self.parent_obj.parent_function()

答案 2 :(得分:1)

这称为继承与组合。区别在于范围,通过继承,您可以直接访问子类中的每个父属性或方法,而在第二种情况下,您必须明确地为其提供访问权限。有时您可能希望隐藏对象API的某些部分,因此包装(组合)是可行的方法,有时您只想扩展基类,继承是最佳选择。

答案 3 :(得分:1)

使用继承(第一个)和组合(第二个)获得相同的解决方案。我更喜欢第二个。