unit Myc.Data.Types.Float; interface uses Myc.Data.Types; type TDataValueHelper = record helper for TDataValue public function AsFloat: IDataFloatValue; end; TDataTypeHelper = record helper for TDataType public function AsFloat: IDataFloatType; end; // Public factory for creating float values. TFloatType = record public class function CreateValue(Init: Double): IDataFloatValue; static; end; implementation uses System.SysUtils; type // Implements the float data value. TImplDataFloatValue = class(TInterfacedObject, IDataValue, IDataFloatValue) private FValue: Double; public constructor Create(const AValue: Double); // IDataValue function GetDataType: IDataType; // IDataFloatValue function GetValue: Double; end; // Implements the float data type. TImplDataFloatType = class(TInterfacedObject, IDataType, IDataFloatType) strict private class var FSingleton: IDataFloatType; class constructor CreateClass; public function GetName: String; function CreateValue(Init: Double): IDataFloatValue; class property Singleton: IDataFloatType read FSingleton; end; { TImplDataFloatValue } constructor TImplDataFloatValue.Create(const AValue: Double); begin inherited Create; FValue := AValue; end; function TImplDataFloatValue.GetDataType: IDataType; begin Result := TImplDataFloatType.Singleton; end; function TImplDataFloatValue.GetValue: Double; begin Result := FValue; end; { TImplDataFloatType } class constructor TImplDataFloatType.CreateClass; begin FSingleton := TImplDataFloatType.Create; end; function TImplDataFloatType.GetName: String; begin Result := 'Float'; end; function TImplDataFloatType.CreateValue(Init: Double): IDataFloatValue; begin Result := TImplDataFloatValue.Create(Init); end; { TFloatType } class function TFloatType.CreateValue(Init: Double): IDataFloatValue; begin Result := TImplDataFloatType.Singleton.CreateValue(Init); end; { TDataValueHelper } function TDataValueHelper.AsFloat: IDataFloatValue; begin Result := Self.DataValue as IDataFloatValue; end; { TDataTypeHelper } function TDataTypeHelper.AsFloat: IDataFloatType; begin Result := Self.DataType as IDataFloatType; end; end.