使用Go,我应该如何在传统的基于继承的GUI框架中访问窗口组件?

时间:2014-04-11 21:24:10

标签: design-patterns user-interface go gtk go-gtk

我正在使用GTK bindings for Go进行一些实验性工作。

与大多数GUI框架一样,GTK GUI应用程序通常会生成一个主窗口,应用程序的工作在该窗口的上下文中完成。

当您使用C ++编写GTK GUI应用程序时,您将继承框架窗口类 - gtk.Window - 并将您应用程序的其他GUI组件声明为您继承的窗口类的公共成员(或使用公共访问方法)在你的窗口类)。这样它们就可以被窗口控制器类操纵。它通过名称作为窗口类的成员来处理它们。您只需将指向主窗口的指针传递到控制器类并通过编写mWindow.MyWidget.text="text"等来操纵其成员。再次,AFAIK,大多数GUI应用程序的设计都类似,无论使用何种GUI框架。

但是,由于Go不支持继承,因此无法使用此选项:当您在Go-Gtk窗口中实例化其他GUI组件时,它们是自立变量,而不是父窗口类的成员 - 它们不是t"生活"在容器类中。这意味着您的GUI控制器类必须单独访问主窗口中的每个组件,没有内聚结构或单引用引用。这会影响可读性和良好的代码组织,IMO - 迫使您的代码结构有点糟糕。

我相信Go中这个问题的解决方案是声明一个struct / interface,它将作为所有主窗口GUI组件的容器。该接口将发布组件的访问方法,并可以传递给GUI控制器单元以操纵其成员。

我需要知道是否存在针对此类任务的标准惯用Go设计模式,或者使用Go来解决此问题的正确方法。

我知道Go旨在成为一种系统编程语言,并不是真正考虑到前端开发而设计的,但我听说它会说#34;每一个好的系统语言都会结束用于应用程序",并且今天没有比Go更好的系统语言 - 证据是GUI框架和其他应用程序任务的许多Go绑定正在浮出水面。只需A list of Go projects.

即可

我想从这一切中得到的结论是Go并不是为了让开发桌面GUI应用程序变得容易,而这些应用程序是一种濒临死亡的品种 。< / em>的

2 个答案:

答案 0 :(得分:2)

如果我必须在Go中编写带有GUI的应用程序,我会完全将GUI部分与应用程序部分分离。这种方法的一个例子是GTK Server

只是,您不需要单独的流程来处理GUI:您可以在goroutine中执行此操作,使用通道与应用程序的其余部分进行通信,与Gtk Server使用套接字/管道/的方式相同消息队列。

我不知道有谁使用过这种方法,而且我自己只在玩具程序中使用它来构建一个简单的Tk GUI(使用Tk因为有一个内置的解释器并且不知道但是gtk-server)。但这对我来说是在Go中构建GUI应用程序的惯用方法。

答案 1 :(得分:1)

您正在询问如何将一组内容组合到一个集合中,以便控制器可以访问所有这些内容。您注意到在C ++中,可以使此集合成为gtk.Window的子类。在go中,没有类或类型层次结构,但解决方案类似。

解决方案就是定义一个结构。也许是这样的:

type MainWindow struct {
    Win         *gtk.Window
    RedButton   *gtk.Widget
    GreenButton *gtk.Widget
}

窗口的控制器可以访问任何字段,无需其他方法或访问器:

type MainController struct {
    W *MainWindow
    other fields...
}

func (mc *MainController) DoSomething() {
    mc.W.RedButton.MakeVisible(true)
    mc.W.GreenButton.MakeVisible(false)
}

这里的方法显然只是为了说明。