Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник Pascal ABC.doc
Скачиваний:
67
Добавлен:
07.11.2018
Размер:
985.6 Кб
Скачать

Переопределение методов

Метод базового класса может быть переопределен (замещен) в подклассах. Если при этом требуется вызвать метод базового класса, то используется служебное слово inherited (англ.- унаследованный). Например:

type   Person=class     name: string;     age: integer;     constructor Create(nm: string; ag: integer);     begin       name:=nm; age:=ag;     end;     procedure Print;     begin       writeln('Имя: ',name,'  Возраст: ',age);     end;   end;   Student=class(Person)     course, group: integer;     constructor Create(nm: string; ag,c,gr: integer);     begin       inherited Create(nm,ag);       course:=c; group:=gr;       name:=nm; age:=ag;     end;     procedure Print;     begin       inherited Print;       writeln('Курс: ',course,'  Группа: ',group);     end;   end;

Здесь метод Print производного класса Student вызывает вначале метод Print, унаследованный от базового класса Person, с помощью конструкции inherited Print. Аналогично конструктор Create класса Student вызывает вначале конструктор Create базового класса Person, также используя служебное слово inherited. Следует обратить внимание, что конструктор базового класса вызывается в этом случае как процедура, а не как функция, при этом создания нового объекта не происходит.

Приведение типов объектов

Объект производного класса неявно преобразуется к типу базового класса. Например, если у нас имеется класс

type MyClass=class   procedure print; end;

то можно инициализировать переменную класса Object объектом класса MyClass:

var o: Object; ... o:=MyClass.Create;

Теперь в переменной типа Object хранится адрес объекта MyClass. Это можно проверить, вызвав функцию TypeName класса Object:

writeln(o.TypeName); // будет выведено 'MyClass'

Тип классовой переменной, заявленный при описании, принято называть ее статическим типом, а тип объекта, на который ссылается классовая переменная в процессе выполнения программы - ее динамическим типом. Динамический тип может либо совпадать со статическим, либо быть его наследником.

Объект базового класса можно явно преобразовать к типу производного класса. Так, в приведенном выше примере, хотя переменная o ссылается на объект типа MyClass, пользоваться методом print, определенным в классе MyClass, через переменную o нельзя. Чтобы это осуществить, объект базового класса должен быть явно преобразован к объекту производного класса:

var m: MyClass; ... m=MyClass(o);

После этого, разумеется, можно вызывать любые методы производного класса и обращаться к его полям:

m.print;

При выполнении этого преобразования необходимо, чтобы в переменной o находился именно объект класса MyClass или любого производного от него класса. В противном случае произойдет ошибка при выполнении программы. 

Операции is и as

Операция is предназначена для проверки того, имеет ли классовая переменная указанный динамический тип. Операция as позволяет безопасно преобразовать переменную одного классового типа к другому классовому типу (в отличие от явного приведения классового типа).

Если a1 - переменная классового типа, а B - тип класса, то выражение a1 is B возвращает True если переменная a1 имеет динамический тип, совпадающий с B или являющийся одним из его потомков, и False в противном случае. Например:

type   A=class   end;   B=class(A)   end; var a1: A; ... a1:=B.Create; writeln(a1 is B); // True

Если a1 - переменная классового типа, а B - тип класса, то выражение a1 as B возвращает объект класса B, a1 имеет динамический тип B или производный от него и nil в противном случае. Например:

var b1: B; ... b1:=a1 as B;

Фактически последняя строка делает то же, что и следующий фрагмент кода:

if a1 is B then   b1:=B(a1) else b1:=nil;