2016-10-08 4 views
1

Я хотел бы использовать ìnstall_style_property() Gtk.Widget на виджет, который я пишу. В документации, этот метод объявлен как static, поэтому мне интересно, почему valac все еще жалуется, что я называю его из статического метода:Valac не позволяет мне «install_style_property» из статического метода

public class MyClass : Gtk.Widget { 

    public static void init() { 
     ParamSpecDouble _the_property = new ParamSpecDouble 
     (
      "dummy", "dummy", "dummy, 
      0, double.MAX, 0, 
      ParamFlags.READWRITE | ParamFlags.STATIC_STRINGS 
     ); 
     install_style_property (_the_property); 
    } 
} 

void main (string? argv) { 
    Gtk.init (ref argv); 
    MyClass.init(); 
} 

сообщение об ошибке:

test.vala:11.9-11.46: error: Access to instance member `Gtk.Widget.install_style_property' denied

Если это делает не работает, каков предпочтительный шаблон для установки пользовательских свойств стиля для пользовательского виджета в Gtk? Лично я бы предпочел не называть init() перед использованием моего виджета, но поскольку добавление свойств стиля выполняется для каждого класса вместо каждого экземпляра, его включение в конструктор тоже кажется неправильным.

ответ

1

install_style_property() не static; это на самом деле метод class. valadoc.org показывает static по какой-либо причине; вам, вероятно, придется сообщить об этом как об ошибке (если она еще не указана).

class методы действуют на самом классе. Классы GObject имеют общие метаданные, и эти методы изменяют эти метаданные. Такие метаданные должны быть изменены только при первом инициализации класса; поэтому методы следует вызывать только в методе GObjectClass.class_init() этого класса. В Вала это метод static construct:

public class MyClass : Gtk.Widget { 

    static construct { 
     ParamSpecDouble _the_property = new ParamSpecDouble 
     (
      "dummy", "dummy", "dummy, 
      0, double.MAX, 0, 
      ParamFlags.READWRITE | ParamFlags.STATIC_STRINGS 
     ); 
     install_style_property (_the_property); 
    } 
} 
+0

Это не помечено как статическое, оно отмечено как класс. См. Https://git.gnome.org/browse/vala/tree/vapi/gtk+-3.0.vapi?id=48ca4e0fc480c3610e3a115376b86a1cee6c68f2#n6782 – nemequ

+0

@nemequ, тогда это проблема valadoc.org (в последнее время у valadoc.org много проблем, кажется ...) – andlabs

+0

Ах, я даже не думал смотреть на valadoc (обычно я просто использую vapis и c docs). Это, вероятно, не новая проблема; методы класса довольно редки, поэтому существует, вероятно, некоторая ошибочная логика, где предполагается, что! instance == static. – nemequ