vala如何允许在没有默认构造函数的情况下定义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

Vala表明,类可以用构造函数以GObject样式或类似于Java/C#等的样式编写

教程显示,这与类是否继承Glib.GObject完全无关。(编辑:我被教程中在
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#/Java风格的构造函数被转换为GObject风格的构造

至于成员的初始化:如果在Vala代码中不提供初始化,那么生成的构造函数也不会初始化任何东西


所有这些都是使用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
的定义中。私有字段类似,但保存在实例的Private
struct
中。您可以通过玩示例来亲自看到这一点