Цепочка до «Gtk.Box.new» не поддерживается

Я новичок в Vala, и пока что я думаю, что это довольно круто, но у меня проблемы с пониманием наследования. Я прочитал здесь, что должен использовать base() для вызова конструктора родителей. Хорошо, круто, кажется понятным, но это не работает для меня. Я продолжал получать ошибку в заголовке. Вот мой фрагмент, чтобы показать:

public class MyBox : Gtk.Box {
    public MyBox(Gtk.Orientation orientation, int spacing) {
        // I have to this
        this.set_orientation(orientation);
        this.set_spacing(spacing);
        // I want to do this:
        base(orientation, spacing);
        //workaround is this:
        Object(orientation: orientation, spacing: spacing);
    }
}

Пожалуйста, помогите мне понять, почему Object(....) работает, но не работает base(...)

Разве это не должно быть то же самое?


person RandomGuy    schedule 26.04.2015    source источник


Ответы (1)


Это связано с реализацией кода C. Когда Vala генерирует конструктор, он генерирует две функции C: функцию _new, которая выделяет память, и вызывает функцию _construct и функцию _construct, которые инициализируют объект. Когда вы используете базовый конструктор, используя base(), для вызова ему требуется соответствующая функция _construct. Не все классы, написанные на C, имеют это; в файле VAPI вы найдете has_construct_function = false для некоторых конструкторов. Если это так, то никакая цепочка не может быть сделана. База GObject может устанавливать свойства из аргументов, так что это становится единственным способом установить значения по умолчанию в базовом классе.

person apmasell    schedule 26.04.2015
comment
Это было идеальное объяснение. Таким образом, всякий раз, когда я получаю сообщение об ошибке цепочки, это будет единственный способ ее решения? - person RandomGuy; 26.04.2015
comment
Да. В случае этих конструкторов параметры такие же, как и при передаче их по имени конструктору Object, поэтому он не лишен какой-либо функциональности. - person apmasell; 28.04.2015