Иерархия
Иерархия – это упорядочение абстракций, расположение их по уровням.
Абстракция – вещь полезная, но всегда, кроме самых простых ситуаций, число абстракций в системе намного превышает наши умственные возможности. Инкапсуляция позволяет в какой-то степени устранить это препятствие, убрав из поля зрения внутреннее содержание абстракций. Модульность также упрощает задачу, объединяя логически связанные абстракции в группы. Но этого оказывается недостаточно.
Значительное упрощение в понимании сложных задач достигается за счет образования из абстракций иерархической структуры. Основными видами иерархических структур применительно к сложным системам являются структура классов (иерархия "is a") и структура объектов (иерархия "part of").
Основным видом иерархии "is a" является наследование – такое отношение между классами, когда один класс заимствует структурную и функциональную часть одного или нескольких других классов (соответственно, одиночное и множественное наследование). Часто подкласс дополняет или изменяет элементы вышестоящего класса. В отсутствие наследования каждый класс становится самостоятельным блоком и должен разрабатываться "с нуля".
Наследование порождает иерархию "обобщение-специализация", в которой подкласс представляет собой специализированный частный случай своего суперкласса. Множественным наследованием часто злоупотребляют, используя его вместо агрегации. "Лакмусовая бумажка" наследования – обратная проверка; так, если B не есть A, то B не стоит производить от A. Множественное наследование усложняет реализацию языков программирования, поэтому многие языки ее не поддерживают (Delphi) или поддерживают частично (Java).
В иерархии "part of" класс находится на более высоком уровне абстракции, чем любой из использовавшихся при его реализации.
Агрегация есть во всех языках, использующих структуры, состоящие из разнотипных данных. Но в объектно-ориентированном программировании она обретает новую мощь: агрегация позволяет физически сгруппировать логически связанные структуры, а наследование с легкостью копирует эти общие группы в различные абстракции. При уничтожении объекта главного класса должны быть уничтожены все объекты, являющиеся его частями, т.е. объект является владельцем своих составляющих.