2010-03-13 8 views
1

Delphi 제한으로 인해 클래스로 변환 할 수없는 레코드가 있습니다 (모두 클래스 연산자를 사용하여 비교를 구현합니다). 하지만 내가 사용하는 레코드 유형을 모르는 클래스에 저장해야합니다. 이 같은델파이의 한계로 인해 여러 개의 다른 레코드를 함수에 전달하는 방법은 무엇입니까?

뭔가 :

type R1 = record 
begin 
    x :Mytype; 
    class operator Equal(a,b:R1) 
end; 

type R2 = record 
begin 
    y :Mytype; 
    class operator Equal(a,b:R2) 
end; 

type Rn = record 
begin 
    z :Mytype; 
    class operator Equal(a,b:Rn) 
end; 

type TC = class 
begin 
    x : TObject; 
    y : Mytype; 
    function payload (n:TObject) 
end; 

function TC.payload(n:TObject) 
begin 
    x := n; 
end; 

program: 
    c : TC; 
    x : R1; 
    y : R2; 
    ... 
    c := TC.Create(): 
    n:=TOBject(x); 
    c.payload(n); 

지금, 델파이는 TObject의 레코드에서 배역을 허용하지 않으며, 내가 인해 델파이 제한으로 그들에게 수업을 할 수 없습니다. 우리는 클래스와 마찬가지로

사람은, 함수에 다른 기록을 통과하고 필요시 자신의 유형을 인식 할 수있는 방법을 알고 :

if x is TMyClass then TMyClass(x) ... 

을 ???

+1

어떤 델파이 버전입니까? Delphi 2010은 레코드에 대해 RTTI를 지원합니다. –

답변

4

나는 당신이 단일 기능에 다른 기록을 전달할 수 있다고 생각하지 않습니다,하지만 당신은 몇 가지 과부하 기능을 할 수 있습니다. 좋아요 :

type TC = class 
begin 
    x : TObject; 
    y : Mytype; 
    function payload (aRec : R1); overload; 
    function payload (aRec : R2); overload; 
end; 

문제를 해결할 수 있습니까?

2

레코드에는 런타임 형식 정보가 없으므로 유형을 검색해야합니다.

procedure Payload(aType : longint; data : Pointer); 
var 
    pr1 : ^R1; 
    pr2 : ^R2; 
    prN : ^RN; 
begin 
    case aType of 
    0 : pr1 := data; // might require a cast 
    1 : pr2 := data; 
    2 : prN := data; 
    end; 
end; 
Payload(0,@r1); 

또는 당신은이 작업을 수행 할 수 있지만, 비둘기가 울 것 :

과부하 게다가, 당신은 또한 유형을 전달할 수 있습니다, 당신은이 작업을 수행 할 수 있습니다

procedure Payload(aType : longint; var data); 
var 
    r1 : R1 absolute data; 
    r2 : R2 absolute data; 
    rN : RN absolute data; 
begin 
    // just be sure to check type before using the variable 
end; 
Payload(0,r1); 
4

당신은 다음을 변환 할 수 있습니다 클래스에 "가상"IsEqual 함수를 사용하여 "Equal"연산자의 난독 화를 간단하게 수행해야합니다. 그것은 당신의 문제를 단순화하고 코드를 엄청나게 명확하게 할 것입니다.

0

Delphi 2010을 사용하는 경우 이러한 레코드에 대한 포인터를 전달하고 런타임 유형 정보를 사용하여 실제로 전달 된 정보를 검색 할 수 있습니다. 그러나 이것은 매우 추악한 코드 일 것이고 아마도 꽤 느릴 것입니다.

클래스로 변환하고 연산자 오버로드 대신 함수 호출을 사용하면 훨씬 쉽게 읽을 수 있습니다.