Обычно, классифицируя некоторый объект, мы задаем следующие вопросы: чем этот объект похож на другие объекты общего класса и чем он отличается от других объектов? Каждый конкретный класс имеет свои особенности поведения и характеристик, определяющих этот класс. Например, класс геометрических фигур можно разделить на два подкласса: плоские фигуры и объемные фигуры. Плоские фигуры могут иметь вершины и не иметь их. Плоскими фигурами, не имеющими вершин, являются окружности и эллипсы (рис. 8.1).
Рис. 8.1. Фрагмент графического представления иерархии объектов класса
Задавая себе приведенные вопросы, программист продвигается от вершины иерархического дерева класса и проходит по дочерним подклассам. Наивысший уровень — самый общий, а вопросы здесь самые простые, например, являются ли фигуры плоскими или объемными. Каждый последующий уровень является более специфическим, чем предыдущий, и менее общим. На самом последнем уровне программист определит цвет, стиль заполнения, радиус окружности и другие конкретные детали фигур.
При использовании ООП следует помнить, что если характеристика однажды определена, то все категории, расположенные ниже данного определения, тоже будут содержать эту характеристику. Поэтому, если определена окружность, то нет необходимости узнавать, сколько у нее вершин, так как она относится к подклассу фигур, не имеющих вершин. Объектно-ориентированное программирование является наилучшим инструментом для построения иерархических деревьев структур данных. Одной из важных особенностей, которые объектно-ориентированное программирование добавляет к традиционным языкам типа Pascal, является механизм, с помощью которого типы данных могут наследовать характеристики более простых, то есть более общих типов. Этим механизмом является наследование.
Наследование означает, что любой класс может быть порожден другим классом.
Создать новый класс от некоторого класса-родителя можно при помощи следующего
программного кода:
TNewClass = class(TOldClass)
Замечательной особенностью принципа наследования является то, что порожденный класс автоматически наследует поля, методы и свойства своего родителя и, более того, может дополнять их новыми. В результате программист, используя стандартные классы, имеющиеся в Delphi, может создавать собственные классы и даже целые библиотеки классов.
В Object Pascal все классы являются потомками класса TObject. Этот класс не включает в себя полей и свойств, зато его методы позволяют создавать, поддерживать жизнедеятельность и удалять объекты. Если программист хочет создать класс, являющийся непосредственным потомком класса TObject, то имя класса-родителя в этом случае можно не указывать, т.е. следующие строки являются эквивалентными:
TSecondClass = class(TObject)
TSecondClass = class
Использование принципа наследования в Delphi привело к созданию разветвленного дерева классов. В верхней части этого дерева находятся так называемые абстрактные классы, для которых нельзя создать полноценные работающие объекты. Но вместе с тем абстрактные классы являются родоначальниками больших групп классов, для которых уже создаются реальные объекты.