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);

现在,Delphi 不接受从记录到 TObject 的类型转换,由于 Delphi 的限制,我无法将它们设为类。

任何人都知道一种将不同记录传递给函数并在需要时识别它们的类型的方法,就像我们对类所做的那样:

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

???

4

4 回答 4

4

我不认为您可以将不同的记录传递给单个函数,但您可以创建多个重载函数。像这样:

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

这会解决你的问题吗?

于 2010-03-13T21:44:59.270 回答
4

可以将它们转换为类,您只需使用虚拟“IsEqual”函数对“Equal”运算符进行去混淆处理。它将简化您的问题并极大地阐明您的代码。

于 2010-03-14T00:08:08.463 回答
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);
于 2010-03-13T22:26:17.290 回答
0

如果您使用的是 Delphi 2010,您可能会传递指向这些记录的指针,并使用运行时类型信息来检测实际传递的是哪一个。但这将是非常难看的代码,而且可能也很慢。

转换为类并使用函数调用而不是运算符重载将更具可读性。

于 2010-03-14T20:25:37.610 回答