Полиморфизм
Рассмотрим внимательно следующий пример. Пусть у нас имеются некое обобщенное поле для хранения данных — класс 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 при этом будет вызван? Тот, который соответствует классу фактически переданного объекта. Этот принцип называется полиморфизмом, и он, пожалуй, представляет собой наиболее важный козырь ООП.
Допустим, вы имеете дело с некоторой совокупностью явлений или процессов. Чтобы смоделировать их средствами ООП, нужно выделить их самые общие, типовые черты. Те из них, которые не изменяют своего содержания, должны быть реализованы в виде статических методов. Те же, которые изменяются при переходе от общего к частному, лучше облечь в форму виртуальных методов.