Создание наследника TCustomVariantType

Тип TCustomVariantType или его ближайшие Наследники TPublishableVariantType и TInvokeableVariantType Содержат методы и свойства, которые в нужный момент вызывают методы и свойства объекта VComplex для осуществления тех или иных преобразований. В модуле varcmpix объявляется такой класс:

type


TComplexVariantType = class(TPublishableVariantType, IVarStreamable)


protected
function LeftPromotion(const V: TVarData;
const Operator: TVarOp;
out RequiredVarType: TVarType): Boolean; override;
function RightPromotion(const V: TVarData;
const Operator: TVarOp;
out RequiredVarType: TVarType): Boolean; override;
function Getlnstance(const V: TVarData): TObject; override;


public
procedure Clear(var V: TVarData);
override;
function IsClear(const V: TVarData): Boolean; override;
procedure Copy(var Dest: TVarData;
const Source: TVarData;
const Indirect: Boolean);
override;
procedure Cast(var Dest: TVarData;
const Source: TVarData); override;


procedure CastTo(var Dest: TVarData;
const Source: TVarData;
const AVarType: TVarType); override;
procedure BinaryOp(var Left: TVarData;
const Right: TVarData;
const Operator: TVarOp); override;
procedure UnaryOp(var Right: TVarData;
const Operator: TVarOp); override;
function CompareOp(const Left: TVarData;
const Right: TVarData;
const Operator: Integer): Boolean; override;
procedure Streamin(var Dest: TVarData;
const Stream: TStream);
procedure StreamOut(const Source: TVarData;
const Stream: TStream);
end;


Обратите внимание: класс TComplexVariantType - интерфейсный (см. п. 9.4.1). Помимо общих для варианта методов он реализует также два метода, специфичных для интерфейса Ivarstreamabie -Streamin и StreamOut, с помощью которых значения нового интерфейса сохраняются в потоке и считываются из него.

Задача этого класса - дать единообразные команды, способные интерпретироваться объектом vcomplex как команды преобразования типа хранящихся данных, их сравнения, реализации над ними тех или иных операций, наконец, записи их в поток и чтения из него. Например, метод cast этого класса вызывается для преобразования других типов значений к комплексному типу, метод castTo - для обратного преобразования, метод BinaryOp реализует бинарную операцию, a Unarydp - унарную и т. д.

Еще раз подчеркну, что основная работа (например, по выполнению бинарных операций) реализуется методами класса TComplex-Data. Класс TCompiexVariantType перекрывает абстрактные методы своего родителя, подключая TComplexData к решению той или иной проблемы.

Поскольку для создания экземпляра нового варианта необходим уже готовый экземпляр (объект) класса TCompiexVariantType, он создается в секции инициализации модуля varcmpix и уничтожается в завершающей секции:

initialization
ComplexVariantType:= TCompiexVariantType.Create;
finalization
FreeAndNil(ComplexVariantType);


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: