【问题标题】:How does GObject style construction work?GObject 样式构造如何工作?
【发布时间】:2020-01-22 06:45:12
【问题描述】:

我是 Vala 的新手,并试图了解该语言的工作原理。我通常使用 Python 或 JavaScript 等脚本语言。

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

为了更好地理解,让我们用 python 做一个类比:

Python 类定义

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 的用途?

【问题讨论】:

标签: glib vala


【解决方案1】:

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

由于 C 在基于 GLib 的 C 代码中没有类,因此 C 代码对象的构建方式与 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 发出一个调用 g_object_new () 方法的 car_construct 函数。这是用于创建任何基于 GLib 的类的 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 () 系统通知任何侦听器。

【讨论】:

  • 感谢您的回答!我怎么看,gtk(和围绕这个的生态系统)库需要 gobject 风格的方式,对吗?对于另一种情况,我可以使用 C#/java 构造样式
  • 不,您几乎总是可以使用 C#/Java 风格的构造函数。只有当你想提供一个库供其他用户使用时,你才可以考虑使用 GObject 样式,尽管即使在那里也不是绝对必要的。
  • 在这种情况下,如何在不调用 Object(application: application) 的情况下扩展 Gtk.ApplicationWIndow 类?
  • 这是一个不同的问题。这个问题是关于 GObject 样式构造如何工作的。请创建一个新的 StackOverflow 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
相关资源
最近更新 更多