Наследование
Вторым "столпом" ООП является
наследование. Этот простой принцип означает, что если
вы хотите создать новый класс, лишь немного отличающийся
от старого, то совершенно нет необходимости в переписывании
заново уже существующих полей и методов. Вы объявляете,
что новый класс TNewObject
TNewObject = class(TOldObject);
является потомком или дочерним классом
старого класса TOldObject, называемого
предком или родительским классом, и добавляете к нему
новые поля, методы и свойства — иными словами, то, что
нужно при переходе от общего к частному.
Примечание
Прекрасный пример, иллюстрирующий
наследование, представляет собой иерархия классов
VCL.
В Object Pascal все классы являются
потомками класса TObject. Поэтому,
если вы создаете дочерний класс прямо от
TObject, то в определении его можно не упоминать.
Следующие два выражения одинаково верны:
TMyObject = class(TObject);
TMyObject = class;
Первый вариант, хотя он и более длинный,
предпочтительнее — для устранения возможных неоднозначностей.
Класс TObject несет очень серьезную
нагрузку и будет рассмотрен отдельно.
Унаследованные от класса-предка поля
и методы доступны в дочернем классе; если имеет место
совпадение имен методов, то говорят, что они перекрываются.
Поведение методов при наследовании,
без преувеличения, является краеугольным камнем объектно-ориентированного
программирования. В зависимости от того, какие действия
происходят при вызове, методы делятся на три группы.
В первую группу отнесем статические методы, во вторую
— виртуальные (virtual) и динамические
(dynamic) и, наконец, в третью
— появившиеся только в Delphi 4 — перегружаемые (overload)
методы.
Методы первой группы полностью перекрываются
в классах-потомках при их переопределении. При этом
можно полностью изменить объявление метода. Методы второй
группы при наследовании должны сохранять наименование
и тип. Перегружаемые методы дополняют механизм наследования
возможностью использовать нужный вариант метода (собственный
или родительский) в зависимости от условий применения.
Подробно все эти методы обсуждаются ниже.
Язык C++ допускает так называемое множественное
наследование. В этом случае новый класс может наследовать
часть своих элементов от одного родительского класса,
а часть — от другого. Это, наряду с удобствами, зачастую
приводит к проблемам. В Object Pascal понятие множественного
наследования отсутствует. Если вы хотите, чтобы новый
класс объединял свойства нескольких, породите классы-предки
один от другого или включите в один класс несколько
полей, соответствующих другим желаемым классам.
|