Объекный тип (класс) представляет собой объединение данных и правил их преобразования. Переменные объектного типа называются экземплярами класса или просто объектами. Класс – это тип объекта; объект – это конкретный экземпляр класса.
Полиморфизм (многоформие)
Полиморфизм – положение теории типов, согласно которому имена (например, переменных) могут обозначать объекты разных (но имеющих общего родителя) классов. Следовательно, любой объект, обозначаемый полиморфным именем, может по-своему реагировать на некий общий набор операций.
Одно и то же имя может означать объекты разных типов, но, имея общего предка, все они имеют и общее подмножество операций, которые можно над ними выполнять
var
A : TPoint;
C : TCircle;
…
begin
…
A.Show;
C.Show;
…
end;
Раннее связывание
program primer1; Результат работы программы:
type TA = class TA
procedure out; TB
end;
TB = class(TA) В процессе компиляции будет
procedure out; установлена связь объекта с нужным
end; методом. Такое связывание объектов
var a:TA; называют ранним, а методы
b:TB; статическими.
procedure TA.out;
begin
writeln('TA');
end;
procedure TB.out;
begin
writeln('TB');
end;
begin
a.out;
b.out;
readln;
end.
Другой пример:
program primer2; Результат работы программы:
type TA = class TA
procedure out; TA
function outstr:string; В данном случае метод TB.OutStr
end; не работает. Еще на этапе компиляции
TB = class(TA) произошло связывание объектов и
function outstr:string; методов.
end; Метод TA.Out оказался накрепко связан
var a:TA; с TA.OutStr. Несмотря на то, что он
b:TB; унаследовался для объекта TB, он просто
procedure TA.out; не знает о существовании TB.OutStr.
begin
writeln(outstr);
end;
function TA.outstr:string;
begin
outstr:='TA';
end;
function TB.outstr:string;
begin
outstr:='TB';
end;
begin
a.out;
b.out;
readln;
end.
Пример позднего связывания
program primer3; function TA.outstr:string;
type TA = class begin
constructor Create; outstr:='TA';
procedure out; end;
function outstr:string;virtual; constructor TB.Create;
end; begin
TB = class(TA) end;
constructor Create; function TB.outstr:string;
function outstr:string;virtual; begin
end; outstr:='TB';
var a:TA; end;
b:TB; begin
constructor TA.Create; a := TA.Create;
begin b := TB.Create;
end; a.out;
procedure TA.out; b.out;
begin readln;
writeln(outstr); end.
end;
Результат работы программы:
TA
TB
В данном примере родительский метод TA.Out узнал о существовании виртуального метода TB.OutStr и использовал именно его при обращении B.Out.
Зоны видимости полей и методов
В языке Object Pascal введен механизм доступа к составным частям объекта, определяющий области, где ими можно пользоваться (т. е. области видимости). Поля и методы могут относиться к четырем группам, отличающимся областями сокрытия информации:
public — общие;
private — личные;
protected— защищенные;
published — опубликованные.
Поля, свойства и методы, находящиеся в секции public, не имеют ограничений на видимость. Они доступны из других функций и методов объектов как в данном модуле, так и во всех прочих, ссылающихся на него. Обычно методы данной секции образуют интерфейс между объектного обмена сообщениями в период выполнения программы (run-time).
Поля, свойства и методы, находящиеся в секции private, доступны только в методах класса и функциях, содержащихся в том же модуле, что и описываемый класс. Такая директива позволяет скрыть детали внутренней реализации класса от всех.
Раздел protected комбинирует функциональную нагрузку разделов private и public таким образом, что если вы хотите скрыть внутренние механизмы вашего объекта от конечного пользователя, этот пользователь не сможет в run-time использовать ни одно из объявлений объекта из его protected-области. При этом protected-объявления доступны у любого из наследников класса.
Раздел published оказался необходимым в среде визуальной разработки программ Delphi. Именно published-объявления доступны через Object Inspector, будь это ссылки на свойства или обработчики событий. Во время исполнения приложения раздел объекта published полностью аналогичен public.
32.