Методы в Object Pascal. Семенов Н.М. - 16 стр.

UptoLike

Составители: 

16
Остановимся на взаимоотношениях трех классов, определенных в листинге 1. У класса
TBook уже есть конструктор по умолчанию Create. Можно задать вопрос:”Почему классу TBook
нужен свой собственный конструктор, рассчитанный только на TBook, если одна из основных
причин использования иерархии наследования - это стремление повторно использовать уже
написанный код? Почему же нельзя использовать для инициализации представителя класса
TBook уже написанный конструктор Create класса TObject?”
Причина в том, что в классе TBook присутствуют данные, которые специфичны для этого
класса и поэтому должны инициализироваться на его уровне.
Иными словами, TBook, являющийся потомком класса TObject, должен определить свой
конструктор для того, чтобы инициализировать собственные поля. Конструктор Create,
унаследованный от класса TObject, ничего не знает о полях TBook, он лишь инициализирует то,
что должно быть инициализировано на уровне класса TObject.
В случае классов TBook и TTechnicalBook наблюдается очень похожая ситуация. Так как
класс TTechnikalBook вводит новое поле FTechEditor, ему для инициализации этого поля
требуется свой конструктор.
Каким образом TTechnicalBook должен выполнять инициализацию полей,
унаследованных от своего предка TBook? Именно здесь и проявляются преимущества объектно-
ориентированного подхода - повторное использование кода и инкапсуляция. Классу
TTechnicalBook не надо заботиться о деталях реализации TBook, так как об этих деталях уже
позаботился конструктор Create, унаследованный от класса TBook. Вместо того, чтобы
копировать уже имеющийся в TBook.Create код, его можно использовать повторно, вызвав
наследуемый конструктор. Оператор
inherited Create (AnAuthor, ATitle);
в строке 69 листинга 1 делает именно это. Он перекладывает ответственность за инициализацию
полей, принадлежащих объекту - предшественнику, на конструктор этого предшественника.
Резюме. Надо определять конструктор для каждого класса, в котором вводятся новые
поля данных.
Типичная структура конструктора:
constructor Класс.ИмяМетода (<Параметры>);
<Блок локальных объявлений>
begin
inherited ИмяМетода (<Параметры>);
<Инициализация специфических полей>
end;
Пример:
constructor TBook.Create(AuAuthor: TAuthor; ATitle: String);
begin
inherited Create;
FAuthor := AuAuthor;
FTitle := ATitle;
end;
Как правило, вызывать подходящий наследуемый конструктор нужно в первом же
выполняемом операторе блока begin - end конструктора.