На этом шаге рассмотрим пример одиночного наследования.
Рассмотрим разные планы выращивания растений в гидропонной теплице. Ранее описана абстракция очень общего плана выращивания растений. Однако разные культуры требуют разных планов выращивания. Например, планы выращивания всех фруктов похожи друг на друга, но отличаются от планов выращивания овощей или цветов. Учитывая эту кластеризацию абстракций, целесообразно определить стандартный план выращивания фруктов, а именно расписание поливов и уборки урожая. План ВЫРАЩИВАНИЯ_ФРУКТОВ (FruitGrowingPlan) является разновидностью ПЛАНА ВЫРАЩИВАНИЯ_РАСТЕНИЙ (GrowingPlan). To же самое можно сказать о планах ВЫРАЩИВАНИЯ_КУСТАРНИКОВ (GrainGrowingPlan) или ВЫРАЩИВАНИЯ_ОВОЩЕЙ (VegetableGrowingPlan). В этом случае класс ПЛАН ВЫРАЩИВАНИЯ (GrowingPlan) является суперклассом, а остальные — подклассами.
По мере эволюции иерархии наследования структура и поведение, общие для разных классов, имеют тенденцию мигрировать в наиболее общий суперкласс. Именно поэтому наследование часто называют иерархией обобщение/специализация. Суперклассы представляют обобщенные абстракции, а подклассы - специализации, в которые добавляются, модифицируются и даже скрываются поля и методы из суперклассов. Наследование позволяет экономить выражения при описании абстракций. Пренебрежение иерархиями "общее/частное" может привести к громоздким проектным решениям.
У любого класса обычно существуют два вида клиентов: объекты, выполняющие операции над экземплярами данного класса, и подклассы, наследующие свойства класса.
В частности, интерфейс класса может состоять из трех частей: закрытой (private), доступной только самому классу; защищенной (protected), в которой объявляются члены, доступные только для класса и его подклассов; и открытую (public), доступную всем клиентам.
На следующем шаге рассмотрим пример множественного наследования.