class 关键字对 Vala 中的方法有什么作用?

问题描述 投票:0回答:1

我注意到

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
,它将类作为参数。我该怎么做?

我找不到有关此类方法的任何文档。此功能的名称是什么?有可用的文档吗?有人可以详细解释一下这个功能吗?

vala gobject
1个回答
0
投票

有关此的一些信息可以在此答案中找到: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
的一个特殊的极端情况。

© www.soinside.com 2019 - 2024. All rights reserved.