2010-03-13 2 views
1

У меня есть ряд записей, которые я не могу преобразовать в классы из-за ограничения Delphi (все они используют операторы класса для реализации сравнений). Но я должен пройти, чтобы сохранить их в классе, не зная, какой тип записи я использую.Как передать несколько разных записей (не класс из-за ограничений 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); 

Теперь Delphi не принимают приведение типа от записи к TObject, и я не могу сделать их классы из-за ограничений Delphi.

Любой знает способ передать различные записи в функцию и распознать их тип, когда это необходимо, как и мы с классом:

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

???

+1

Какая версия Delphi? 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». Это упростит вашу проблему и значительно упростит ваш код.

0

Если вы используете Delphi 2010, вы можете, вероятно, передать указатели на эти записи и использовать информацию типа времени выполнения, чтобы определить, какой из них был фактически передан. Но это был бы очень уродливый код и, вероятно, довольно медленный.

Преобразование в классы и использование вызовов функций, а не перегрузка оператора, было бы более читаемым.

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

  • Нет связанных вопросов^_^