Как работает стиль GObject? - PullRequest
       65

Как работает стиль GObject?

1 голос
/ 22 января 2020

Я новичок в Вала и пытаюсь понять, как работает язык. Я обычно использую языки сценариев, такие как 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 учебник раздел о конструкции стиля GObject , но до сих пор не понимаю, как работает Object(speed: speed) и для чего нужен construct?

1 Ответ

1 голос
/ 23 января 2020

Vala был разработан как замена для ручного труда, необходимого для написания кода C на основе GLib.

Так как C не имеет классов на основе GLib, 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;
}

Итак, Вала испускает car_construct функция, которая вызывает метод g_object_new (). Это метод GLib, используемый для создания любого класса, основанного на GLib, путем передачи его типа и создания параметров по аргументам имени и значения один за другим, завершается значением NULL.

Когда вы не используете свойства construct, это невозможно передать параметры через g_object_new (), и вам придется вызывать установщик, например:

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: сеттер также автоматически генерируется vala c и не только устанавливает значение свойства, но и уведомляет всех слушателей через g_object_notify () система.

...