Я пытаюсь реализовать 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
в Вала?
Вы должны определить методы, как 'общественного переопределения Gtk ... '(обратите внимание на ключевое слово override). Кроме того, подпись метода должна точно соответствовать, поэтому вам нужно использовать 'unowned', где родительский метод использует' unowned', и вы не можете просто ввести nullable ('?'), Где родительский метод не использует значение NULL ... –
Даже добавление 'override' и удаление нулевых результатов в' error: PreferencesStyleProvider.get_icon_factory: не найдено подходящего метода для переопределения'. И если я не могу вернуть «null», как выполнить документированные требования? – Inductiveload
Вы можете вернуть значение null, так как Gtk.IconFactory - это тип класса, вы случайно используете экспериментальный ненулевой режим? В любом случае, файл VAPI нуждается в исправлении, он должен быть нулевым в файле vapi. –