Я нашел вот такую цитату:
https://book.huihoo.com/gtk+-gnome-application-development/cha-gtk.html
All of the _new() routines return a GtkWidget*, even though they allocate a subclass; this is for convenience.
И это действительно так, например gtk_search_bar_new() возвращает не GtkSearchBar* а GtkWidget*:
https://developer.gnome.org/gtk3/stable/GtkSearchBar.html#gtk-search-bar-new
Хотя eсли что-то не наследуется от GtkWidget, getter'ы, «newer'ы» уже возвращают указатель на то, что нужно например:
- https://developer.gnome.org/gtk3/stable/GtkWidget.html#gtk-widget-get-style-c...
- https://developer.gnome.org/gtksourceview/stable/GtkSourceSearchContext.html#...
Далее, глядя на код gedit я вижу, что внутри *Private структур для класс GtkWidget* хранятся редко, чаще конкретные типы.
В коде, с которым я имею дело вообще бардак. Часть *_new() функций возвращает GtkWidget*, часть наследника. Внутри части *Private, часть лежит как GtkWidget* часть как SomethingDerivedFromGtkWidget*.
Я хочу навести в этом порядок, не переча конвенциям Gtk. Отсюда пару вопросов:
- Что за удобство такое возвращать base класс из «конструкторa»?
- Имеет ли смысл в своем коде возвращать GtkWidget* в my_derived_from_gtk_widget_new() или в не библиотечном коде все же лучше вернуть MyDerivedFromGtkWidget*?
- Какое такое удобство хранить widget'ы как GtkWidget* в *Private, это ведь сильно снижает читаемость - непонятно, что там действительно лежит. Отсутствие необходимости кастов когда это что-то передается например в gtk_container_add? Но ведь касты и так приходится добавлять в обратную сторону делая что-то вроде my_code_do_smth_with_my_derived_from_gtk_widget ((MY_DERIVED_FROM_GTK_WIGET_CLASS(widget_pointer)
У меня есть несколько опций: везде возвращать GtkWidget* и хранить как GtkWidget в *Private; везде возвращать GtkWidget* и хранить как Derived* в *Private; и возвращать и хранить Derived*. IMHO третье наиболее логично, несмотря на конценции GTK. Кто-то может прояснить жтот вопрос?