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 ()
系统通知所有听众。
我是 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 ()
系统通知所有听众。