10.5.2. Создание
наследника 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);