结构Delphi泛型类

时间:2011-01-11 00:17:15

标签: delphi generics delphi-2010

我是泛型的新手,需要一些帮助才能构建一个类并实现方法。

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

这是我的问题:

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

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

  3. 如何在方法中使用它?查看下面剪切的代码,标有“问题3 ”。

  4. 这是我的代码:

    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;
    

    非常感谢任何其他评论。

1 个答案:

答案 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的约束的任何类型。