2011-01-11 3 views
2

Я новичок в дженериков, и нуждаются в помощи, чтобы структурировать класс и методы, реализующие - Delphi 2010.Структура Delphi Обобщения Класс

Я пытаюсь использовать генерики сериализовать ЛЮБУЮ TObject JSON ... Я хочу быть способный повторно использовать код.

Мои вопросы заключаются в следующем:

  1. Как создать конструктор дженериков? Я хочу иметь возможность использовать Self или Default (T), но он просто возвращает nil.

  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; 

// ВОПРОС 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

ответ

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? –

+0

@Phillip: Я бы предпочел, если бы у вас были дополнительные вопросы, что вы публикуете их здесь. Таким образом, кто-то, кто сталкивается с подобными проблемами в будущем, также может воспользоваться ответами. –

+0

Thanks Mason, Без использования дженериков у меня есть следующий код, который преобразует объект в JSON: procedure Serialize; 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: = Маршал. Маршал (FileResult); OutPut: = V.ToString; FileResult.Free; Marshal.Free; конец; –

Смежные вопросы