2015-04-26 2 views
2

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

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); 
    } 
} 

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

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

ответ

3

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

+0

Это было отличное объяснение. Поэтому всякий раз, когда я получаю ошибку в цепочке, это будет ** только ** способ ее решения? – RandomGuy

+0

Да. В случае этих конструкторов параметры такие же, как передача их по имени конструктору 'Object', поэтому он не лишен какой-либо функциональности. – apmasell

Смежные вопросы