Я пытаюсь реализовать Gtk.StyleProvider
в Vala. «Базовый класс» (в C) выглядит так:
GtkIconFactory * gtk_style_provider_get_icon_factory ()
GtkStyleProperties * gtk_style_provider_get_style ()
gboolean gtk_style_provider_get_style_property ()
и в ВАПИ:
[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;
^^^^^^^^^^^
Первая ошибка особенно мне кажется немного странной, так как результат "ошибка: ожидал ТИП, получил ТИП"!
Добавление unowned
к первым двум методам по-прежнему приводит к аналогичным ошибкам.
Как мне реализовать интерфейс Gtk.StyleProvider
в Vala?
public override Gtk...
(обратите внимание на ключевое слово override). Также сигнатура метода должна точно совпадать, поэтому вы должны использоватьunowned
там, где родительский метод используетunowned
, и вы не можете просто ввести nullable (?
), где родительский метод не использует nullable... - person Jens Mühlenhoff   schedule 21.12.2016override
и удаление значений, допускающих значение NULL, приводит кerror: PreferencesStyleProvider.get_icon_factory: no suitable method found to override
. И если я не могу вернутьnull
, как выполнить документированные требования? - person Inductiveload   schedule 21.12.2016override
AFAIK не нужен. - person Jens Mühlenhoff   schedule 21.12.2016--enable-experimental-non-null
в командеvalac
. - person Inductiveload   schedule 21.12.2016