5
5rain6sky
Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个基类TA,里面有一个纯虚的公有方法Show;子类TB重载了该方法。
二者的定义及实现大致如下——
{ TA }
TA = class
public
procedure Show
virtual
abstract;
end;
{ TB }
TB = class(TA)
private
Content: TStrings;
public
constructor Create;
destructor Destroy
override;
procedure Show
override;
end;
constructor TB.Create;
begin
inherited;
Content := TStringList.Create;
Content.Add('B');
end;
destructor TB.Destroy;
begin
Content.Free;
inherited;
end;
procedure TB.Show;
begin
ShowMessage(Content[0]);
end;
现在由于某种客观原因,我的一个程序不知道有TB这个类,它只知道TA;
它有一个公有方法接收一个TB类的实例(用一个TA类型的变量接收),
又出于某种原因,该程序不能直接调用该实例的Show方法,
而必须重新创建一个本地的TB实例,然后再调用它的Show,怎么做?
附带先说说我目前的进展情况——
为了简化测试,我把TA、TB都写在同一个Form文件的pas单元里,
然后用Form上一个Button的OnClick事件来代替那个公有方法。
Form1的主体代码如下(略去TA和TB的声明和实现部分)——
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure Clone(X: TA
var V);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
A: TA;
B: TB;
begin
B := TB.Create;
Clone(B, A);
try
A.Show;//报错!
finally
A.Free;
B.Free;
end;
end;
procedure TForm1.Clone(X: TA
var V);
var
A: TA;
begin
A := TA(X.ClassType.NewInstance);
TA(V) := A;
A.Create;
end;
——这样写法在执行A.Show;的时候可以跟进TB的Show中去,
但关键是A在创建的时候没有执行TB的构造函数,即它的Content是nil,
所以在执行那句ShowMessage的时候会报错。
因此我觉得问题就是如何完整地复制一个B出来?
即这个Clone函数到底应该怎么写?
二者的定义及实现大致如下——
{ TA }
TA = class
public
procedure Show
virtual
abstract;
end;
{ TB }
TB = class(TA)
private
Content: TStrings;
public
constructor Create;
destructor Destroy
override;
procedure Show
override;
end;
constructor TB.Create;
begin
inherited;
Content := TStringList.Create;
Content.Add('B');
end;
destructor TB.Destroy;
begin
Content.Free;
inherited;
end;
procedure TB.Show;
begin
ShowMessage(Content[0]);
end;
现在由于某种客观原因,我的一个程序不知道有TB这个类,它只知道TA;
它有一个公有方法接收一个TB类的实例(用一个TA类型的变量接收),
又出于某种原因,该程序不能直接调用该实例的Show方法,
而必须重新创建一个本地的TB实例,然后再调用它的Show,怎么做?
附带先说说我目前的进展情况——
为了简化测试,我把TA、TB都写在同一个Form文件的pas单元里,
然后用Form上一个Button的OnClick事件来代替那个公有方法。
Form1的主体代码如下(略去TA和TB的声明和实现部分)——
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure Clone(X: TA
var V);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
A: TA;
B: TB;
begin
B := TB.Create;
Clone(B, A);
try
A.Show;//报错!
finally
A.Free;
B.Free;
end;
end;
procedure TForm1.Clone(X: TA
var V);
var
A: TA;
begin
A := TA(X.ClassType.NewInstance);
TA(V) := A;
A.Create;
end;
——这样写法在执行A.Show;的时候可以跟进TB的Show中去,
但关键是A在创建的时候没有执行TB的构造函数,即它的Content是nil,
所以在执行那句ShowMessage的时候会报错。
因此我觉得问题就是如何完整地复制一个B出来?
即这个Clone函数到底应该怎么写?