Gobject: Наследование И Интерфейсы

В комментариях к последняя статья Часто утверждалось, что система GObject не нужна из-за доступности C++ и других языков высокого уровня.

Помимо чисто технических вопросов, которые уже обсуждались в комментариях, хотелось бы затронуть еще один аспект. Вероятно, большинство комментаторов видят смысл существования объектной системы GLib в упорном нежелании ретроградных специалистов воспользоваться благами цивилизации и смириться с неумолимыми темпами прогресса.

Вероятно, так было на заре развития Glib/GTK, зародившегося в мире UNIX-систем, GNU, открытого исходного кода, идей Столлмана и т. д. Большинство хакеров этого поколения действительно предпочитали C, в то время как C++ был относительно молодой и неразвитый, и польза от его использования не казалась столь очевидной.

Сегодня, конечно, для новых проектов большинство из нас предпочтет использовать более удобные, лаконичные и безопасные языки, даже если мы знакомы со всеми нюансами использования GObject. Однако не следует упускать из виду тот факт, что за 20 с лишним лет существования GLib/GTK с их использованием были созданы тысячи приложений и библиотек, многие из которых по сей день активно разрабатываются тысячами программистов со всего мира.

мир.

В них добавляется новый функционал, выявляются ошибки, адаптируются к современным технологиям вроде экранов HiDPI, Wayland, Vulkan и т.д. Чтобы читать (дополнять, исправлять) код таких проектов, необходимо иметь базовые знания объектно-ориентированного программирования.

ориентированные расширения для Си, о которых мы говорим.

Поэтому добро пожаловать под кат. Тренируемся, как обычно, на котах :)

GObject: наследование и интерфейсы



Вся серия о GObject:

GObject: Основы GObject: наследование и интерфейсы GObject: инкапсуляция, создание экземпляров, самоанализ

Наследование от потомков GObject

В общем, GObject подразумевает только одиночное наследование.

Для множественного наследования предполагается использование Java-подобных интерфейсов, о которых мы поговорим во второй части статьи.

Давайте создадим тип Tiger, который будет наследоваться от Cat, который мы описали в предыдущей статье.

На этот раз мы сделаем его конечным объектом и, таким образом, будем считать, что в дальнейшем наследования от него не будет. Давайте создадим файл Animaltiger.h:

  
   

#ifndef _ANIMAL_TIGER_H_ #define _ANIMAL_TIGER_H_ #include "animalcat.h" G_BEGIN_DECLS #define ANIMAL_TYPE_TIGER animal_tiger_get_type() G_DECLARE_FINAL_TYPE (AnimalTiger, animal_tiger, ANIMAL, TIGER, AnimalCat)

Обратите внимание, что мы использовали макрос G_DECLARE_FINAL_TYPE вместо G_DECLARE_DERIVABLE_TYPE для описания конечного объекта и что последним аргументом макроса был родительский объект AnimalCat. Если бы мы предположили дальнейшую цепочку наследования с производным объектом, нам нужно было бы описать класс и создать экземпляр родительского класса в качестве первого поля в нем; в данном случае нам это не нужно.



/* struct _AnimalTigerClass {

Теги: #*nix #разработка Linux #C++ #OOP #GTK #gobject #glib

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.