10. Наследование

10.1 Наследование классов

Поскольку функциональность является свойством объекта, а сам объект может быть типизован несколькими типами, в ситуации, когда есть единственный объект, типизованный уникальным набором типов, нам не нужен для этого выделенный класс.

Но по сути, создавая массив, перечисляющий типы, которыми типизуется объект, мы уже создаём объект-класс. То, что этот новосозданный класс обладает функциональностью других классов, называется наследованием классов или наследованием функциональности. Давая этому классу имя, мы лишь получаем возможность ссылаться на него, например, при типизации или наследовании.

Таким образом, наследование классов является лишь способом типизации, а также средством, позволяющим расширить функциональность полученного класса. Чаще всего это требуется для того, чтобы устранить несовместимость между типами объекта.

Есть одно отличие между множественной типизацией объекта и наследованием классов. При множественной типизации объект заимствует интерфейсы типов, а при наследовании все интерфейсы и открытые поля требуют переобъявления в новосозданном классе.

ПРИМЕЧАНИЕ

Введением этого правила WYCIWYC расходится с концепцией ООП, согласно которой доступное свойство класса нельзя сделать менее доступным. Это правило порождается тем, что полиморфизм в ООП обеспечивается на уровне классов. В WYCIWYC полиморфизм, как и в объектной модели COM, обеспечивается на уровне интерфейсов, и это правило позволяет, наследуя функциональность, скрывать интерфейсы, которые не должны быть доступны клиентам класса-потомка.

Г-н Страуструп, говоря о наследовании классов, называет наследование отношением is a. В WYCIWYC is a – это типизация, а наследование классов – это more than a. Если речь идёт лишь о множественном is a, то новый класс не нужен, вполне достаточно массива типов.

Речь об этом г-н Страуструп заводит, когда указывает на “ошибку” разработчиков в построении структуры классов: has a они якобы путают с is a. В действительности же сама ошибка кроется в концепции ООП, поскольку закрытое наследование в С++ с точки зрения внешнего объекта ничем не отличается от has a, а само наследование классов – это в первую очередь средство повторного использования кода.

Накладывание ограничений, на мой взгляд – не лучший способ уберечь разработчика от ошибок, и уж совершенно очевидно, что задача средств разработки не в том, чтобы учить его программировать (язык C с “неправильным” goto – тому пример). Программисты – народ упрямый и настойчивый, способный потратить массу времени на поиск способа преодолеть ограничение, накладываемое средствами разработки. Не проще ли дать разработчику возможность совершить ошибку быстро и удобно, чтобы потом также быстро и удобно её исправить?

10.2 Наследование интерфейсов

Расширение существующего интерфейса созданием нового интерфейса называется наследованием интерфейсов.

Наследование интерфейсов обеспечивает полиморфизм при использовании объектов. Интерфейс типизует значение свойства, поэтому для реализации шаблонов необходим некий базовый интерфейс, от которого происходили бы все интерфейсы типа “значение”.

ПРИМЕЧАНИЕ

Типы свойств имеют прикладной характер и их набор зависит от реализации концепции под задачи, определяемые сферой применения. Для WYCIWYC/Web это один набор, в WYCIWYC/Applications – другой, какой-нибудь WYCIWYC/Banking может потребовать третьего.

Автор: Андрей Шаройко <vanyamboe@gmail.com>