vala如何允许在没有默认构造函数的情况下定义GObject?
Vala表明,类可以用构造函数以GObject样式或类似于Java/C#等的样式编写 教程显示,这与类是否继承Glib.GObject完全无关。(编辑:我被教程中在vala如何允许在没有默认构造函数的情况下定义GObject?,vala,gobject,Vala,Gobject,Vala表明,类可以用构造函数以GObject样式或类似于Java/C#等的样式编写 教程显示,这与类是否继承Glib.GObject完全无关。(编辑:我被教程中在Glib.Object和Object之间的切换弄糊涂了。在Vala中有一个隐式的使用Glib,所以两者是相同的) 如果定义Glib.GObject子类时没有默认构造函数(使用Java/C#风格),那么必须为GObject定义一个隐式默认构造函数,假设所有字段都用二进制零填充(根据GObject初始化),我这样想对吗 另请参见让我们用v
Glib.Object
和Object
之间的切换弄糊涂了。在Vala中有一个隐式的使用Glib
,所以两者是相同的)
如果定义Glib.GObject子类时没有默认构造函数(使用Java/C#风格),那么必须为GObject定义一个隐式默认构造函数,假设所有字段都用二进制零填充(根据GObject初始化),我这样想对吗
另请参见让我们用
valac-C
了解一下
示例代码:
class MySuper : Object
{
private int i;
private int j;
public MySuper (int i)
{
this.i = i;
j = 1;
}
}
class MyDerived : MySuper
{
public MyDerived ()
{
base (10);
}
}
生成的C代码(相关部分)如下所示:
MySuper* my_super_construct (GType object_type, gint i) {
MySuper * self = NULL;
gint _tmp0_ = 0;
self = (MySuper*) g_object_new (object_type, NULL);
_tmp0_ = i;
self->priv->i = _tmp0_;
self->priv->j = 1;
return self;
}
MySuper* my_super_new (gint i) {
return my_super_construct (TYPE_MY_SUPER, i);
}
MyDerived* my_derived_construct (GType object_type) {
MyDerived * self = NULL;
self = (MyDerived*) my_super_construct (object_type, 10);
return self;
}
MyDerived* my_derived_new (void) {
return my_derived_construct (TYPE_MY_DERIVED);
}
valac产生的一些数据:
- MySuper和MyDerived都得到一个
和\u构造
函数\u新的
仅调用my\u super\u construct
g\u object\u new
仅调用my_-derived_-construct
(后者依次调用my_-super_-construct
)g_-object\u-new
所有这些都是使用Vala在幕后完成的。您不必担心代码生成的细节,但如果您愿意,您可以始终使用
-C
。Vala将在C代码中自动创建构造函数。这遵循*\u新的命名模式。下面是最简单的示例:
void main () {
new ExampleWithoutExplicitConstructor ();
}
class ExampleWithoutExplicitConstructor {
}
如果您使用valac--ccode example.vala
编译此代码,并查看生成的C代码,您将看到\u vala\u main
调用example\u而不使用显式构造函数\u new()
然后调用example\u而不使用显式构造函数\u构造函数()
示例然后为该类型调用g\u object\u new()
。作为g\u object\u new
创建类型的一部分,它将调用example\u,而不调用显式构造函数\u instance\u init()
,其中可以初始化任何变量
下面是一个更复杂的示例,它继承自对象
,完整的GObject
类也是如此,它有一个带有默认值的字段和一个带有默认值的属性:
void main () {
new ExampleWithoutExplicitConstructor ();
}
class ExampleWithoutExplicitConstructor:Object {
private string example_field = "default";
public string an_object_property { get;
set;
default = "this object properties default string";
}
}
您将从C代码中注意到,\u new
,\u construct
,g\u object\u new
,\u instance\u init
模式是相同的。Vala所做的是设置\u instance\u init
来初始化字段和属性的默认值
没有默认值的公共字段为空。您将看到它们出现在保存实例数据的struct
的定义中。私有字段类似,但保存在实例的Privatestruct
中。您可以通过玩示例来亲自看到这一点