2017-07-04 19 views
3

私の最初のオブジェクトはTGoodFairy(TObject)であり、それ自身の子供FChildren(TList)があります。 Assignプロシージャは、TGoodFairyとその子のコピーを作成します。与えられたインスタンスのコンストラクタを呼び出す方法は?

第2のオブジェクトは、TGoodFairyの子孫であるTBadFairyです。

TBadFairyの子を作成するためにTBadFairyのAssignメソッドを使用する方法を苦労しています。

type 
    TFairy = class(TObject) 
    private 
    FChildren: TObjectList; 
    FName: string; 
    public 
    constructor Create; virtual; 
    destructor Destroy; override; 
    procedure Assign(Source: TFairy); virtual; 
    published 
    property Name: string read FName write FName; 
    end; 

    TFairyClass = class of TFairy; 

    TGoodFairy = class(TFairy) 
    end; 

    TBadFairy = class(TFairy) 
    end; 

constructor TFairy.Create; 
begin 
    inherited; 
    FChildren := TObjectList.Create(True); 
end; 

destructor TFairy.Destroy; 
begin 
    FChildren.Free; 
    inherited; 
end; 

procedure TFairy.Assign(Source: TFairy); 
var 
    i: integer; 
    f, child: TFairy; 
begin 
    FName := Source.Name; 
    FChildren.Clear; 
    for i := 0 to Source.FChildren.Count-1 do 
    begin 
    child := TFairy(Source.FChildren[i]); 
    f := TFairyClass(child.ClassType).Create; 
    try 
     f.Assign(child); 
     FChildren.Add(f); 
    except 
     f.Free; 
     raise; 
    end; 
    end; 
end; 
+0

「である:私はもっとこのような何かを試してみてください

TGoodFairy = class (TObject) private FChildren:TList; FName:string; public constructor Create; destructor Destroy; override; procedure Assign(Source:TGoodFairy); published property Name:string read FName write FName; end; TBadFairy = class (TGoodFairy) procedure Assign(Source:TBadFairy); end; ------------------------ constructor TGoodFairy.Create; begin inherited; FChildren:=TList.Create; end; destructor TGoodFairy.Destroy; var i:integer; begin for i:=0 to FChildren.Count-1 do TGoodFairy(FChildren[i]).Free; FChildren.Clear; FChildren.Free; inherited; end; procedure TGoodFairy.Assign(Source:TGoodFairy); var i:integer; f:TGoodFairy; C:TClass; begin FName:=Source.Name; for i:=0 to Source.FChildren.Count-1 do begin //C := Source.ClassType; //f := C.Create; f := TGoodFairy.Create; //<-- this should be parametrized somehow f.Assign(Source.FChildren[i]); FChildren.Add(f); end; end; procedure TBadFairy.Assign(Source:TBadFairy); begin inherited Assign(Source); end; 
MartynA

+0

あなたは正しいです...修正された... thanx ... – lyborko

答えて

5

(今のところ唯一のTGoodFairyの子が作成されます)TBadFairyのための右の子を作成するために、作成に関連してのClassTypeを使用したいです祖先 "あなたは"子孫 "を意味する、と思う。
+1

はい...それは動作します:-)あなたは王様です。 – lyborko

関連する問題