gpt4 book ai didi

delphi - Delphi 泛型类的结构

转载 作者:行者123 更新时间:2023-12-02 09:49:20 25 4
gpt4 key购买 nike

我是泛型新手,需要一些帮助来构建类和实现方法。

我正在尝试使用泛型来序列化任何 TObject-JSON。此外,我希望能够重用代码。

这些是我的问题:

  1. 如何创建通用构造函数?我希望能够使用 SelfDefault(T),但它仅返回 nil

  2. V := Marshal.Marshal(ReturnObject) - 此方法需要一个 TObject,但我不知道如何引用当前传递的对象中。

  3. 如何在方法中使用它?请看下面的代码片段,标记为“问题 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;

非常感谢任何其他评论。

最佳答案

很难准确说出你想在这里做什么,但我可以猜测。对于 TResponseObject,您需要一个可以包含另一个对象并对其进行操作的对象。在这种情况下,您可能希望将其传递给构造函数,如下所示:

constructor TResponseObject<T>.Create(value: T);
begin
FReturnObject := value;
end;

同样,如果您创建 GetReturnObject 方法,它可能应该返回 FReturnObject 字段的值。 (或者您可以使属性的read访问器直接引用FReturnObject。)

function TResponseObject<T>.GetReturnObject: T;
begin
Result := FReturnObject;
end;

很难回答第三个问题,因为我不知道你想用这个做什么,但希望我对前两个问题的回答能帮助你回到正轨。请记住,泛型不必令人困惑;它们基本上只是类型替换。无论您在非泛型例程中使用普通类型,都可以将其替换为 <T>创建一个通用例程,然后替换任何适合该特定 T 约束的类型.

关于delphi - Delphi 泛型类的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4652987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com