2011-01-11 2 views
2

私はジェネリックに新しいです、といくつかのクラスを構造化する助けとメソッドを実装する必要がある - デルファイ2010構造デルファイジェネリッククラス

私はTObjectのJSONをシリアル化するためにジェネリックを使用しようとしています...私はなりたいですコードを再利用することができます。次のように

私の質問は以下のとおりです。

  1. どのように私は、ジェネリックコンストラクタを作成するのですか?私は自己、またはデフォルト(T)を使用できるようにしたいが、それは単にゼロを返す。

  2. V:= Marshal.Marshal(ReturnObject)は...このメソッドは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; 

// QUESTION 3

procedure TForm1.MoveCopyFile<THowNowResponse>(ASource, DDestination: String); 
var 
    FileOperationResult: TFileOperationResult; 
begin 
    FileOperationResult := TFileOperationResult.Create; 
    // What to do? 
end; 
+0

あなたが望むものを知ることは本当に難しいです...あなたは別の問題を抱えていると思われるので、別の質問を書く方が良いと思います。 JSONマーシャラーはどのクラスもマーシャリングすることができるので、ジェネリッククラスを作成して、デフォルトのTJsonConverterだけを使用してオブジェクトをマーシャリングするためのラッパーとして使用するかどうかはわかりません。私にとってはTResponseObjectクラス名が不明瞭です)。 – jachguate

答えて

1

あなたがここでやろうとしていることを正確に伝えるのは難しいですが、私は推測することができます。 TResponseObjectでは、別のオブジェクトを格納して操作できるオブジェクトが必要です。その場合、あなたはおそらくそうのように、コンストラクタにそれを渡したい:あなたはGetReturnObjectメソッドを作る場合

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

同様に、それはおそらくFReturnObjectフィールドの値を返す必要があります。

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

私はあなたがこれを行うにしようとしているのかわからないので、それは#3に答えることは本当に難しい(それとも、がちょうど直接FReturnObjectを参照します。プロパティのアクセサを読んで作ることができる)が、うまくいけば、最初の2つに私の答えは、あなたがトラックに戻るのに役立ちます。ジェネリックスが混乱する必要はないことを覚えておいてください。彼らは基本的に型の置換だけです。非汎用ルーチンで通常の型を使用する場合は、<T>に置き換えて汎用ルーチンを作成し、その特定の型の制約に適合するすべての型を代入することができます(T)。

+0

こんにちはメーソン、MSNやGoogleトークで連絡することは可能ですか? –

+0

@ Philips:さらなる質問があれば、ここに投稿することをお勧めします。そうすれば、将来同様の問題に遭遇する他の誰もが回答から恩恵を受けることができます。 –

+0

Thanks Mason、 ジェネリックを使用せずに、オブジェクトをJSONに変換する次のコードがあります。 プロシージャをシリアル化します。 var マーシャル:TJSONMarshal; FileResult:TFileOperationResult; V:TJSONValue; begin FileResult:= TFileOperationResult.Create; FileResult.Success:= True; FileResult.LastError:= 100; マーシャル:= TJSONMarshal.Create(TJSONConverter.Create); //Marshal.RegisterConverter(TFileOperationResult、BaseStringsConverter); V:= Marshal.Marshal(FileResult); OutPut:= V.ToString; FileResult.Free; Marshal.Free; end; –