【发布时间】:2020-05-10 20:03:10
【问题描述】:
我是如何从我的previous question、GObject 样式构造中发现的,vala 类定义不需要。但是很多 gtk 应用程序在扩展基本小部件时使用这种方式。例如,elementary os app center 为 Gtk.ApplicationWindow 类执行此操作。
所以我的问题是,我可以在不使用 Object() 构造的情况下扩展任何基础 Gtk 类吗?
【问题讨论】:
我是如何从我的previous question、GObject 样式构造中发现的,vala 类定义不需要。但是很多 gtk 应用程序在扩展基本小部件时使用这种方式。例如,elementary os app center 为 Gtk.ApplicationWindow 类执行此操作。
所以我的问题是,我可以在不使用 Object() 构造的情况下扩展任何基础 Gtk 类吗?
【问题讨论】:
通常你会像这样调用基础构造函数:
public class MainWindow : Gtk.ApplicationWindow {
public MainWindow (Gtk.Application application) {
base (application);
}
}
这不适用于本身使用 GObject 样式构造参数的类。
如您所见,从此类派生的正确方法是:
public class MainWindow : Gtk.ApplicationWindow {
public MainWindow (Gtk.Application application) {
Object (application: application);
}
}
这并没有太大的不同,只是您必须指定每个属性的名称并使用 Object 类(在 C 中是 GObject)而不是指定 base。
PS:在我对您的另一个问题 (How does GObject style construction work?) 的回答中,我的意思是当您编写自己的其他人可以从中派生的类时,您不需要使用 GObject 样式构造。反过来说,Gtk.MainWindow 的设计也迫使你在派生类中使用 GObject 风格的构造。
【讨论】: