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

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

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

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

当您用 C++ 编写 GTK GUI 应用程序时,您将从框架窗口类 - gtk.Window 继承 - 并将应用程序的其他 GUI 组件声明为继承的窗口类的公共(public)成员(或在窗口类中使用公共(public)访问方法)。这样它们就可以由窗口 Controller 类进行操作。它通过名称将它们寻址为窗口类的成员。您只需将指向主窗口的指针传递到 Controller 类中,并通过编写 mWindow.MyWidget.text="text" 等来操作其成员。同样,据我所知,大多数 GUI 应用程序的设计都是类似的,无论正在使用的 GUI 框架。

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

我相信 Go 中这个问题的解决方案是声明一个结构/接口(interface),它将用作所有主窗口 GUI 组件的容器。该接口(interface)将发布组件的访问方法,并且可以传递到 GUI Controller 单元以操作其成员。

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

我知道 Go 被设计为一种系统编程语言,并不是真正为前端开发而设计的,但我听说过“每一种好的系统语言最终都会成为现实”用于应用程序”,并且当今没有比 Go 更好的系统语言了 - 证据是许多用于 GUI 框架和其他应用程序任务的 Go 绑定(bind)正在出现。看看 A list of Go projects. 就可以了

我想从这一切中得出的结论是,Go 的设计目的并不是为了让桌面 GUI 应用程序的开发变得容易,这是一个正在消亡的品种

最佳答案

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

只是,您不需要单独的进程来处理 GUI:您可以在 goroutine 中执行此操作,它使用 channel 与应用程序的其余部分进行通信,就像 Gtk 服务器使用套接字/管道/消息队列一样.

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

关于design-patterns - 使用Go,我应该如何访问基于传统继承的GUI框架中的窗口组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23022842/

相关文章:

java - 对具有不同参数的类使用工厂模式

ios - 如何在 Xcode 4 中打开内存浏览器?

go - 不能发布多个文件

user-interface - 如何在没有GUI的情况下运行MATLAB并获得图形结果?

在 Eclipse 中构建 Python GUI?

go - 如何通过运行时获取真实文件名。不同goroutine中匿名函数调用的调用者

web - 通过 websocket 将 kubernetes 日志暴露给浏览器

c# - DTO 的组件也是实体还是 DTO?

c++ - 使用接口(interface)或函数对象进行回调?

php - 使用 Javascript 和 PHP 的设计模式