我是泛型的新手,需要一些帮助才能构建一个类并实现方法。
我正在尝试使用泛型来序列化任何 TObject
- JSON。而且,我希望能够重用代码。
这是我的问题:
如何创建通用构造函数?我希望能够使用Self
或Default(T)
,但它只返回nil
。
V := Marshal.Marshal(ReturnObject)
- 此方法需要TObject
,但我不知道如何引用传入的当前对象。
如何在方法中使用它?查看下面剪切的代码,标有“问题3 ”。
这是我的代码:
TFileOperationResult = class(TObject)
private
FSuccess: Boolean;
//Error: PException;
FLastError: Integer;
function GetFailure: Boolean;
property Failure: Boolean read GetFailure;
public
property Success: Boolean read FSuccess write FSuccess;
property LastError: Integer read FLastError write FLastError;
end;
TResponseObject<T: class> = class(TObject)
private
FReturnObject: T;
function GetReturnObject: T;
function BaseStringsConverter(Data: TObject): TListOfStrings;
public
constructor Create; overload;
property ReturnObject: T read GetReturnObject;
procedure Serialize;
end;
constructor TResponseObject<T>.Create;
begin
// Question 1 - What should go in here?
end;
function TResponseObject<T>.GetReturnObject: T;
begin
Result := Default(T);// Is this correct?
end;
procedure TResponseObject<T>.Serialize;
var
Marshal: TJSONMarshal;
V: TJSONValue;
begin
Marshal := TJSONMarshal.Create(TJSONConverter.Create);
Marshal.RegisterConverter(TResponseObject<T>, BaseStringsConverter);
V := Marshal.Marshal(ReturnObject); // Question 2 - How Can I refer to 'Self'?
OutPut := V.ToString;
Marshal.Free;
end;
致电代码:
procedure TForm1.Test;
var
FileOperationResult: TResponseObject<TFileOperationResult>;
begin
FileOperationResult := TResponseObject<TFileOperationResult>.Create;
FileOperationResult.Serialize;
end;
问题3:
procedure TForm1.MoveCopyFile<THowNowResponse>(ASource, DDestination: String);
var
FileOperationResult: TFileOperationResult;
begin
FileOperationResult := TFileOperationResult.Create;
// What to do?
end;
非常感谢任何其他评论。
答案 0 :(得分:1)
很难准确说出你在这里想做什么,但我可以猜一猜。对于TResponseObject,您需要一个可以包含另一个对象并对其进行操作的对象。在这种情况下,您可能希望将其传递给构造函数,如下所示:
constructor TResponseObject<T>.Create(value: T);
begin
FReturnObject := value;
end;
同样,如果您创建GetReturnObject方法,它应该返回FReturnObject字段的值。 (或者你可以让属性的读取访问者直接引用FReturnObject。)
function TResponseObject<T>.GetReturnObject: T;
begin
Result := FReturnObject;
end;
我很难回答#3,因为我不知道你要对此做些什么,但希望我对前两个的回答能帮助你回到正轨。请记住,仿制药不必混淆;他们基本上只是类型替换。在非通用例程中使用普通类型的任何地方,您可以将其替换为<T>
以创建通用例程,然后替换适合该特定T
的约束的任何类型。