GObject 样式构造如何工作?

How does GObject style construction work?

我是 Vala 的新手,正在尝试了解该语言的工作原理。我通常使用像 Python 或 JavaScript.

这样的脚本语言

所以,我的问题是为什么有三种class构造函数定义方式以及GObject样式构造函数如何工作?

为了最好的理解让我们用python做个类比:

Pythonclass定义

class Car(object):
  speed: int

  def __init__(self, speed): # default constructor
    self.speed = speed # property

和瓦拉

class Car : GLib.Object {
  public int speed { get; construct; }

  // default
  internal Car(int speed) {
    Object(speed: speed)
  }

  construct {} // another way
}

我正在阅读 Vala tutorial section about GObject style construction,但仍然不明白 Object(speed: speed) 的工作原理以及需要 construct 的原因?

开发 Vala 是为了替代手动编写基于 GLib 的 C 代码。

由于 C 在基于 GLib 的 C 代码对象构造中没有 classes,因此以不同于 C# 或 Java.

的方式完成

这是您示例代码的 valac -C car.vala 输出的片段:

Car*
car_construct (GType object_type,
               gint speed)
{
    Car * self = NULL;
    self = (Car*) g_object_new (object_type, "speed", speed, NULL);
    return self;
}

所以 Vala 发出一个 car_construct 函数调用 g_object_new () 方法。这是 GLib 方法,用于创建任何基于 class 的 GLib,通过依次按名称和值参数传递其类型和构造参数,以 NULL 终止。

当您不使用 construct 属性时,将无法通过 g_object_new () 传递参数,您必须调用 setter,例如:

Car*
car_construct (GType object_type,
               gint speed)
{
    Car * self = NULL;
    self = (Car*) g_object_new (object_type, NULL);
    car_set_speed (self, speed);
    return self;
}

此处调用 car_set_speed () 而不是通过 g_object_new () 传递值。

您更喜欢哪一个取决于几个因素。如果您经常与 C 代码进行互操作并且 C 代码使用构造参数,则您希望使用 GObject 样式构造。否则你可能对 C#/Java 风格的构造函数没问题。

PS:setter 也是由 valac 自动生成的,不仅会设置 属性 值,还会通过 g_object_notify () 系统通知所有听众。