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)

2 番目のケースでは、ParentUI 属性の準名前空間があります。これは実際に良い方法ですか?このように解決すればよいのでしょうか。

4

1 に答える 1

2

クラスが互いにどのように関係しているかを検討し、それを使用してコードをどのように構造化するかを決定する必要があると思います。

継承は、2 つのクラス間の IS-A 関係を意味します。つまり、派生クラスのインスタンスは基本クラスのインスタンスです。元のコードでは、Windowクラスは と の両方から継承しようとしてOptUIいますListUI。これは、これら 2 つが意味のある方法でオーバーラップし、Windowオブジェクトが同時に両方になることができる場合に意味があります。ただし、基本クラスは両方ParentUIとも異なる値を持つ変数を持つ必要があるため、一度に両方になることは意味がない場合があります (ただし、OptUIまたはListUIクラスの設計上の欠陥である可能性もあります)。あなたのクラスが実際に何を意味するのか私にはわからないので、これについてはあなた自身の結論に達する必要があります。

一方、UI クラス (「コンポジション」と呼ばれる) のインスタンスを含めても、Windowクラスが持つべきインターフェイスについては何も説明されません。Window各インスタンスOptUIインスタンスとインスタンスがあるため、HAS-A 関係が示唆されListUIます。それが IS-A 関係よりも理にかなっている場合、構成は間違いなく進むべき道です。

それぞれのいくつかを行うことも意味があるかもしれません。つまり、UI クラスの 1 つを継承しながら、もう 1 つのインスタンスを保持します。インスタンスは、インスタンスを持ちながらインスタンスであるWindow可能性あります。OptUIListUI

于 2012-12-10T18:10:04.127 に答える