Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Delphi_2.doc
Скачиваний:
31
Добавлен:
28.03.2015
Размер:
494.59 Кб
Скачать

3.6.3. Перекрытие атрибутов в наследниках

В механизме наследования можно условно выделить три основных момента:

  • наследование полей;

  • наследование свойств;

  • наследование методов.

Наследование полей

1. Любой порожденный класс наследует от родительского все поля данных, поэтому классы Tpolygon и Tellipse автоматически содержат поля Fcolor и FVisible, объявленные в классе TFigure.

2. Доступ к полям предка осуществляется по имени, как если бы они были определены в потомке.

3. В потомках можно определять новые поля, но их имена должны отличаться от имен полей предка.

Наследование свойств и методов имеет свои особенности.

1. Свойство базового класса можно перекрыть (от англ. override) в производном классе, например чтобы добавить ему новый атрибут доступа или связать с другим полем или методом.

2. Метод базового класса тоже можно перекрыть в производном классе, например чтобы изменить логику его работы. Например, в классе Tellipse написать:

Procedure Draw; override;

Procedure Hide; override;

3. В наследнике можно вызвать перекрытый метод предка, указав перед именем метода зарезервированное слово inherited. Когда метод предка полностью совпадает с методом потомка по формату заголовка, то можно использовать более короткую запись. Например:

procedure Tellipse.Draw;

begin

inherited;

//свой код

end;

procedure Tellipse.Hide;

begin

inherited;

//Свой код

end;

4. В конструкторах сначала вызывается конструктор предка, а затем инициализируются дополнительные поля данных. В деструкторах применяется обратная последовательность действий: сначала разрушаются данные, недоступные предку, а затем вызывается унаследованный деструктор.

3.6.4. Совместимость объектов различных классов

Для классов, связанных отношением наследования, вводится новое правило совместимости типов. Вместо объекта базового класса можно подставить объект любого производного класса. Обратное неверно. Например, переменной типа TFigure можно присвоить значение переменной типа Tellipse:

var

Figure: TFigure;

...

Figure := TEllipse.Create;

Объектная переменная Figure формально имеет тип TFigure, а фактически связана с экземпляром класса TEllipse.

Правило совместимости классов чаще всего применяется при передаче объектов в параметрах процедур и функций. Например, если процедура работает с объектом класса TFigure, то вместо него можно передать объект класса TEllipse или TPolygon.

Заметим, что все объекты являются представителями известного вам класса TObject. Поэтому любой объект любого класса можно использовать как объект класса TObject.

3.6.5. Контроль и преобразование типов

Поскольку реальный экземпляр объекта может оказаться наследником класса, указанного при описании объектной переменной или параметра, бывает необходимо проверить, к какому классу принадлежит объект на самом деле. Чтобы программист мог выполнять такого рода проверки, каждый объект хранит информацию о своем классе.

В языке Delphi существуют операторы is и as, с помощью которых выполняется соответственно проверка на тип (type checking) и преобразование к типу (type casting).

Например, чтобы выяснить, принадлежит ли некоторый объект Obj к классу TFigure или его наследнику, следует использовать оператор is:

var

Obj: TObject;

...

if Obj is TFigure then ...

Для преобразования объекта к нужному типу используется оператор as, например

with Obj as TFigure do

Color:= red;

Стоит отметить, что для объектов применим и обычный способ приведения типа:

with TFigure(Obj) do

Color := Red;

Вариант с оператором as лучше, поскольку безопасен. Он генерирует ошибку (точнее исключительную ситуацию при выполнении программы (run-time error)), если реальный экземпляр объекта Obj не совместим с классом TFigure.