伙计们,我正在为一个应用程序设计一个GUI,一个用于插入cd的cd容器,目前我不太清楚,我想我需要一些帮助来阐明我对面向对象设计的理解。
因此,首先,我使用观察者模式来构建抽象的Model和View类,以及具体的模型(cd容器)和具体的 View (cd容器 View )。然后,我开始使用wxwidget框架为cd容器和其他GUI控件MainFrame(来自wxFrame)等进行设计和图形化外观或布局(来自wxPanel的CDContainerWidget)。
所以现在我有了三个类:CDContainerModel
(cd容器),CDContainerView
(观察者模式的类)和CDContainerWidget
(gui控件)。
然后我不清楚应该如何处理CDContainerView
和CDContainerWidget
?
我认为CDContainerWidget和CDContainerView都需要CDContainerModel。我考虑了四种方法,但不知道哪种方法合适:
1)。将CDContainerWidget作为成员变量关联到CDContainerView中,然后将CDContainerView作为成员变量放入主机中。
class CDContainerView:
def __init__:
self.gui=CDContainerWidget
class MainFrame:
def __init__:
CDContainerView
2)。 CDContainerView子类CDContainerWidget:
class CDContainerView(CDContainerWidget):
class MainFrame:
def __init__:
CDContainerView
3)。 CDContainerWidget子类CDContainerView:
class CDContainerWidget(CDContainerView):
class MainFrame:
def __init__:
CDContainerWidget
4)。而不是使用CDContainerWidget和CDContainerView,而仅使用单个类CDContainerBig,该类将抽象类View和wxPanel子类化
class CDContainerBig(View, wxPanel)
我的问题是什么是正确的解决方案?我已经阅读了MVC模式的Wiki页面,但是我不太了解它的描述,也不知道该怎么做,也不知道将其应用于我的问题是否合适。
好吧,我提出了一些补充意见。最初,当我开始设计编程时,我并没有考虑太多,只是选择了2)方法。但现在,我认为3)很好。因为将小部件放入小部件(将CDContainerWidget放入MainFrame)是合理的。但我不确定。同样,在观察者模式下,这三个类也扭曲而笨拙。有时,在我看来,这四个人可能是相同的,只是谁包括谁,或者谁向谁发送消息。好吧,我认为我真的需要澄清这一点。
另外,出于实用性考虑,我赞成3).CDContainerWidget实际上包含几个子小组件(按钮,输入框等),如果我们通过子组件小部件更改设置新值的方法,则为1),我们需要CDContainerWidget知道CDContainerView,以便让CDContainerView通知其他 View 。对于2)更糟糕的是,CDContainerWidget必须知道其子级CDContainerView。 3)CDContainerWidget本身就是CDContainerView,所以相当合理。对于4)很好,很容易,但是没有逻辑上的分离。这是我自己的想法,不知道是否正确。
谢谢!!
最佳答案
使您更容易摆脱类之间的耦合的原因是,可以使用Spiff Signal或其他可用的信号/插槽模块之一来实现信号插槽模式。
通过取消通信逻辑的耦合,您可以完全摆脱模块直接对话的需要,而可以使用带有回调的消息传递。
关于python - 面向图形用户界面的面向对象设计问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3838688/