Объекный тип (класс) представляет собой объединение данных и правил их преобразования. Переменные объектного типа называются экземплярами класса или просто объектами. Класс – это тип объекта; объект – это конкретный экземпляр класса.
Наследование
Пример:
TMyObject = class(TObject);
TMyObject = class;
type
TFirstObject = class(TObject)
FMyField : extended;
procedure SetData(AValue : extended);
end;
TSecondObject = class(TFirstObject)
FMyField : integer;
procedure SetData(AValue : integer);
end;
…
procedure TFirstObject.SetData(AValue : extended);
begin
FMyField := 1.0;
end;
procedure TSecondObject.SetData(AValue : integer);
begin
FMyField := 1;
inherited SetData(0.99); //вызвали метод TFirstObject
end;
Иерархия классов
Принцип наследования позволяет создавать сложные разветвленные иерархические системы объектов, каждый из которых может иметь одного родителя и несколько потомков.
Такая объектная иерархия позволяет описывать достаточно сложные системы, включающие большое число взаимодействующих элементов разного вида.
Виртуальные и динамические методы
Директива Virtual позволяет методу класса быть заменой так же названным методом в производном классе.
Директива Abstract определяет метод класса, как осуществляемый только в наследуемых классах. В самом классе-родителе метод не реализуется.
Директива Override определяет метод класса как замену так же названного метода в родительском классе.
type
TField = class(Object)
function GetData : string; virtual; abstract;
end;
TStringField = 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;
…
Динамические методы
Директива Dynamic позволяет методу класса быть замененным так же названным методом в производном классе.
Dynamic семантически эквивалентна Virtual. Первый оптимизирован для памяти, последний для скорости.
type
TFirstClass = class(TObject)
FMyField1 : integer;
FMyField2 : LongInt;
procedure StatMethod;
procedure VirtMethod1; virtual;
procedure VirtMethod2; virtual;
procedure DynMethod1; dynamic;
procedure DynMethod2; dynamic;
end;
TSecondClass = class(TFirstClass)
procedure StatMethod;
procedure VirtMethod1; override;
procedure DynMethod1; override;
end;
var
Obj1 : TFirstClass;
Obj2 : TSecondClass;
31.