1

这是我使用 python 类和子类的第一个示例。这里的一个问题是属性 ParentUI 被覆盖。

class OptUI(object):
def __init__(self, ParentUI):
    self.ParentUI = ParentUI

class ListUI(object):
    def __init__(self, ParentUI):
        self.ParentUI = ParentUI

class Window(OptUI, ListUI):
    MainFrame = "MainFrame"
    TestFrame = "TestFrame"
    def __init__(self):
        OptUI.__init__(self, self.MainFrame)
        ListUI.__init__(self, self.TestFrame)

如果我在 Window 类中使用实例而不是继承,则有一个解决方案。

class Window(object):
    MainFrame = "MainFrame"
    TestFrame = "TestFrame"
    def __init__(self):
        self.OUI = OptUI(self.MainFrame)
        self.LUI = ListUI(self.TestFrame)

在第二种情况下,我有一个属性 ParentUI 的准命名空间。那么这在实践中是一个好方法吗?这是应该如何解决的吗?

4

1 回答 1

2

我认为你需要考虑你的类是如何相互关联的,然后用它来确定代码的结构。

继承意味着两个类之间的 IS-A 关系。也就是说,派生类实例是基类的实例。在您的原始代码中,Window该类试图从两者继承OptUIand ListUI,如果这两者可以以有意义的方式重叠并且一个Window对象可以同时两者,这可能是有意义的。但是,由于基类都希望有一个ParentUI具有不同值的变量,因此同时成为它们可能没有意义(尽管它也可能只是OptUIorListUI类的设计缺陷)。您应该对此得出自己的结论,因为我不知道您的课程的实际含义。

另一方面,包括 UI 类的实例(称为“组合”)并没有说明Window该类应该具有哪些接口。它暗示了一种 HAS-A 关系,因为每个Window实例都有一个OptUI实例和一个ListUI实例。如果这比 IS-A 关系更有意义,那么组合绝对是要走的路。

做其中的一些也可能是有意义的。也就是说,从其中一个 UI 类继承,同时包含另一个的实例。该Window实例可能一个OptUI实例,同时拥有一个ListUI实例。

于 2012-12-10T18:10:04.127 回答