Самоучитель по Delphi 7 для профессионалов


Полиморфизм



Рассмотрим внимательно следующий пример. Пусть у нас имеются некое обобщенное поле для хранения данных — класс TFieid и три его потомка — для хранения строк, целых и вещественных чисел:

type 

TField = class

function GetData:string; virtual; abstract; 

end;

TStringFieid = class(TField)

FData : string;

function GetData: string; override; 

end;

TIntegerField = class(TField)

FData : Integer;

function GetData: string;override;

  end;

TExtendedField = class(TField)

FData : Extended;

function GetData: string;override; 

end;

function TStringFieid.GetData;

 begin

Result := FData

  end;

function TIntegerField.GetData; 

begin

Result := IntToStr(FData); 

end;

function TExtendedField.GetData; 

begin

  Result:= FloatToStrF(FData, ffFixed, 7, 2);

end ;

procedure ShowData(AField : TField);

 begin

Forml.Label!.Caption := AField.GetData; 

end;

В этом примере классы содержат разнотипные поля данных FData и только-то и "умеют", что сообщить о значении этих данных текстовой строкой (при помощи метода GetData). Внешняя по отношению к ним процедура ShowData получает объект в виде параметра и показывает эту строку.

Правила контроля соответствия типов (typecasting) языка Object Pascal гласят, что объекту как указателю на экземпляр объектного типа может быть

присвоен адрес любого экземпляра любого из дочерних типов. В процедуре showData параметр описан как TFieid — это значит, что в нее можно передавать объекты классов и TStringField,и TIntegerField, и TExtendedField,и любого другого потомка класса TFieid.

Но какой (точнее, чей) метод GetData при этом будет вызван? Тот, который соответствует классу фактически переданного объекта. Этот принцип называется полиморфизмом, и он, пожалуй, представляет собой наиболее важный козырь ООП.

Допустим, вы имеете дело с некоторой совокупностью явлений или процессов. Чтобы смоделировать их средствами ООП, нужно выделить их самые общие, типовые черты. Те из них, которые не изменяют своего содержания, должны быть реализованы в виде статических методов. Те же, которые изменяются при переходе от общего к частному, лучше облечь в форму виртуальных методов.




Начало  Назад  Вперед