2011-01-11 111 views
2

我新的仿制药,并需要一些帮助,以结构类和实现方法 - 德尔福2010结构德尔福泛型

我想使用泛型系列化任何TObject的JSON ...我想成为能够重用代码。

我的问题如下:

  1. 如何创建一个泛型构造函数?我希望能够使用Self或Default(T),但它只返回nil。

  2. 五:= Marshal.Marshal(返回object)...这种方法需要一个TObject的,但我不知道如何引用中传递了当前对象

  3. 另外,我该如何使用。这里面的方法 - 见下面Q3

  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; 
+0

真的很难知道你想要什么......我认为如果你写出不同的问题会更好,因为你似乎有不同的问题,并试图在这里解决它们。对于泛型部分... JSON Marshaler能够编组任何类,所以我不确定是否要创建一个泛型类来使用它作为封装来封送任何仅使用默认TJsonConverter的对象,或者什么(可能TResponseObject类的名称使我不清楚)。 – jachguate 2011-01-11 17:44:05

回答

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

+0

嗨梅森,是否可以通过MSN或Google Talk与您联系? – 2011-01-11 00:54:23