2016-12-21 2 views
1

Я пытаюсь реализовать Gtk.StyleProvider в Вала. "Базовый класс" (в C) выглядит следующим образом:Наследующий интерфейс в Vala - несовместим с базовым методом

GtkIconFactory *  gtk_style_provider_get_icon_factory() 
GtkStyleProperties * gtk_style_provider_get_style() 
gboolean    gtk_style_provider_get_style_property() 

и VAPI:

[CCode (cheader_filename = "gtk/gtk.h")] 
public interface StyleProvider { 
    public abstract unowned Gtk.IconFactory get_icon_factory (Gtk.WidgetPath path); 
    public abstract unowned Gtk.StyleProperties get_style (Gtk.WidgetPath path); 
    public abstract bool get_style_property (Gtk.WidgetPath path, Gtk.StateFlags state, GLib.ParamSpec pspec, GLib.Value value); 
} 

Где первые два метода должны возвращать только NULL в соответствии с документацией для GtkStyleProvider.

Таким образом, я написал несколько Вала, как это:

public class DerivedStyleProvider : Gtk.StyleProvider 
{ 
    public Gtk.IconFactory? get_icon_factory (Gtk.WidgetPath path) 
    { 
     return null; 
    } 

    public Gtk.StyleProperties? get_style (Gtk.WidgetPath path) 
    { 
     return null; 
    } 

    bool get_style_property (Gtk.WidgetPath path, 
        Gtk.StateFlags state, 
        GLib.ParamSpec pspec, 
        out GLib.Value value) 
    { 
     return false; //TODO 
    } 
} 

У меня есть проблема с первыми двумя способами. Если я их, как написано здесь (с ?), то я получаю следующее сообщение об ошибке:

error: overriding method `DerivedStyleProvider.get_icon_factory' is incompatible 
with base method `Gtk.StyleProvider.get_icon_factory': Base method expected 
return type `Gtk.IconFactory', but `Gtk.IconFactory?' was provided. 
    public Gtk.IconFactory? get_icon_factory (Gtk.WidgetPath path) 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Метод gtk_style_provider_get_style() тот же.

Если удалить ?, я получаю следующие две ошибки по методу:

error: overriding method `DerivedsStyleProvider.get_icon_factory' 
is incompatible with base method `Gtk.StyleProvider.get_icon_factory': Base 
method expected return type `Gtk.IconFactory', but `Gtk.IconFactory' was provided. 
     public Gtk.IconFactory get_icon_factory (Gtk.WidgetPath path) 
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
src/Preferences.vala:138.3-138.14: warning: `null' incompatible with 
return type `Gtk.IconFactory` 
       return null; 
       ^^^^^^^^^^^ 

Первая ошибка, особенно это немного странно для меня, так как Кончилось это «ошибка: ожидается, TYPE, получил TYPE» !

Добавление unowned к первым двум методам все еще приводит к аналогичным ошибкам.

Как следует использовать интерфейс Gtk.StyleProvider в Вала?

+0

Вы должны определить методы, как 'общественного переопределения Gtk ... '(обратите внимание на ключевое слово override). Кроме того, подпись метода должна точно соответствовать, поэтому вам нужно использовать 'unowned', где родительский метод использует' unowned', и вы не можете просто ввести nullable ('?'), Где родительский метод не использует значение NULL ... –

+0

Даже добавление 'override' и удаление нулевых результатов в' error: PreferencesStyleProvider.get_icon_factory: не найдено подходящего метода для переопределения'. И если я не могу вернуть «null», как выполнить документированные требования? – Inductiveload

+0

Вы можете вернуть значение null, так как Gtk.IconFactory - это тип класса, вы случайно используете экспериментальный ненулевой режим? В любом случае, файл VAPI нуждается в исправлении, он должен быть нулевым в файле vapi. –

ответ

1

компилируется без ошибок и предупреждений на моей системе (Vala 0.32.1):

public class DerivedStyleProvider : GLib.Object, Gtk.StyleProvider 
{ 
    public unowned Gtk.IconFactory get_icon_factory (Gtk.WidgetPath path) 
    { 
     // Evil cast to work around buggy declaration in VAPI file 
     return (Gtk.IconFactory) null; 
    } 

    public Gtk.StyleProperties get_style (Gtk.WidgetPath path) 
    { 
     // Evil cast to work around buggy declaration in VAPI file 
     return (Gtk.StyleProperties) null; 
    } 

    bool get_style_property (Gtk.WidgetPath path, 
        Gtk.StateFlags state, 
        GLib.ParamSpec pspec, 
        out GLib.Value value) 
    { 
     // I just assigned something here to make the compiler happy, you should make sure to use a correct value 
     value = Value (typeof (string)); 
     return false; //TODO 
    } 
} 

я сделал эти изменения:

  • проистекают из GLib.Object в дополнение к интерфейсу.
  • Используйте unowned по первому методу.
  • Удалите значение nullable из возвращаемых типов.
  • Передача нулевого значения в соответствующие типы классов. (Что не очень, но проблема с файлом вапи.)
  • Назначают фиктивное значение для выходного параметра, чтобы сделать компиляции предупреждение бесплатно;)
+0

Похоже, я выбрал неправильный класс для моего первого опыта работы с Vala! – Inductiveload

+0

Спасибо, теперь это работает и для меня! Это ясно объясняет некоторые концепции Валы! – Inductiveload

+0

Добро пожаловать, вот для чего СОСТОЯТСЯ, мы всегда будем рады помочь пользователям с хорошо описанными проблемами/вопросами :). –

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