Delphi在属性中创建子类运行时

时间:2013-03-28 11:54:52

标签: delphi oop properties subclass rtti

你好我有一个问题可能我在Delphi中创建子类的循环吗?我看到了一些关于RTTI但我无法找到如何在运行时在属性中创建一个类

为例

谢谢

Type
  TclassX = class
  private
  public
     X1 : integer;
     X2 : String;
end;

Type

  TRecord = class
     ID : TClassX;
     NAME : TClassX;
  private
  public
     contructor Create();
     property ID : TClassX read FY1 write SetY1;
     property NAME : TClassX read FY2 write SetY2;
end;

implementation

constructor TRecord.Create;
begin
   ///HERE I WHANT MAKE A LOOP AND DON'T MAKE ONE BY ONE
   // property[0] := ID;
   // property[1] := NAME;
   // FOR I:= 0 TO 1 DO BEGIN
   // ***PROPERTY[i] := TClassX.Create; ---*** not correct just exemple
   // END; 

   ID := TClassY.Create;  
   NAME := TClassY.Create;  
end;

1 个答案:

答案 0 :(得分:1)

我会将类引用存储在数组中。然后为了语法简单,使用indexed property

type
  TMyClass = class
  private
    FY: array [1..2] of TClassX;
    function GetY(Index: Integer): TClassX;
    procedure SetY(Index: Integer; const Value: TClassX);
  public
    constructor Create;
    property Y1: TClassX index 1 read GetY write SetY;
    property Y2: TClassX index 2 read GetY write SetY;
  end;

function TMyClass.GetY(Index: Integer): TClassX;
begin
  Result := FY[Index];
end;

procedure TMyClass.SetY(Index: Integer; const Value: TClassX);
begin
  FY[Index] := Value;
end;

然后你可以简单地遍历FY来实例化对象。

constructor TMyClass.Create;
var
  i: Integer;
begin
  inherited;
  for i := low(FY) to high(FY) do begin
    FY[i] := TClassY.Create;
  end;
end;

说了这么多,所有这些脚手架真的是必要的。使用array property会不会更容易?

type
  TMyClass = class
  private
    FY: array [1..2] of TClassX;
    function GetY(Index: Integer): TClassX;
    procedure SetY(Index: Integer; const Value: TClassX);
  public
    constructor Create;
    property Y[Index: Integer]: TClassX read GetY write SetY;
  end;

然后,你写Y1而不是写Y[1]。使用数组属性可以为您提供更大的灵活性,因为您可以使用变量对它们进行索引,因此在运行时决定而不是编译您指的是哪个对象。