Gtk.Widget.set_css_name
被声明为 public class void set_css_name (string name)
这是有道理的,因为在 C 中参数是 GtkWidgetClass*
而不是 GtkWidget*
。这意味着您可以在派生自 set_css_name
的类中的 static construct
块内调用 Gtk.Widget
:
static construct {
set_css_name ("foobar");
}
我还注意到你可以定义自己的类方法:
public class void foobar () {
}
但是,您不能在这样的方法中访问
this
:
error: This access invalid outside of instance methods
this;
^^^^
这让我想知道:如何在类方法中实际访问 GObjectClass?假设我想调用
Gtk.BindingSet.by_class
,它将类作为参数。我该怎么做?
我找不到有关此类方法的任何文档。此功能的名称是什么?有可用的文档吗?有人可以详细解释一下这个功能吗?
有关此的一些信息可以在此答案中找到:https://stackoverflow.com/a/40068901/547270。
简而言之,成员声明(字段或方法)中使用的
class
关键字使之成为“类”成员,而不是“实例”和“静态”成员。在大多数 OOP 语言中都存在,“类”成员有些不寻常。
正如上面链接的答案中所解释的,“类”和“静态”成员之间的区别对于字段来说很重要,而对于方法来说,我认为,可以肯定地说它们的行为与实例方法完全相同。因此,例如:
public class Test {
public class int class_method(int a, int b) {
return a + b;
}
}
您需要有一个实例才能调用此方法:
var test = new Test();
var u = test.class_method(2, 3);
我认为类方法是
GObject
的一个特殊的极端情况。