C
creation-zy
Unregistered / Unconfirmed
GUEST, unregistred user!
to 5rain6sky:
也许我还没有理解您的意思,不过还是请您看看:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=640050
我通过一个超级基类实现了父类访问子类中的方法。(其实还可以更简单的——用{$M+}
进行方法与方法名的自动绑定。 ^_^ )
注意到在您的应用中,仅仅需要访问子类的一两个固定的方法,没有必要像我的程序那么
复杂,完全可以将这两个方法的入口指针放到基类中去,这样速度也不会有什么损失,只要
在子类Create的时候将这两个方法指针指向自己的处理过程就可以了。
eg:
type
TBase=class
public
DoMain:function (Str:String):Integer of Object;
DoElserocedure (Str:String) of Object;
end;
TA=class(TBase)
private
Count:Integer;
function _DoMain(Str:String):Integer;
procedure _DoElse(Str:String);
public
constructor Create
//当然,如果有必要,还要重载Destroy方法
end;
procedure TForm1.Button1Click(Sender: TObject);
var
A:TA;
Base:TBase;
begin
A:=TA.Create;
Base:=A
//在这个例子中,无所谓什么Clone不Clone了——你既然已经得到了子类的实例
//就完全可以调用DoMain和DoElse方法,不存在什么能不能的问题。
Base.DoMain('asdf');
Base.DoElse('3453');
Base.Free;
end;
{ TA }
constructor TA.Create;
begin
inherited;
DoMain:=_DoMain;
DoElse:=_DoElse;
Count:=0;
end;
procedure TA._DoElse(Str: String);
begin
ShowMessage(IntToStr(Count)+' '+Str);
end;
function TA._DoMain(Str: String): Integer;
begin
Inc(Count);
ShowMessage(Str);
end;
也许我还没有理解您的意思,不过还是请您看看:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=640050
我通过一个超级基类实现了父类访问子类中的方法。(其实还可以更简单的——用{$M+}
进行方法与方法名的自动绑定。 ^_^ )
注意到在您的应用中,仅仅需要访问子类的一两个固定的方法,没有必要像我的程序那么
复杂,完全可以将这两个方法的入口指针放到基类中去,这样速度也不会有什么损失,只要
在子类Create的时候将这两个方法指针指向自己的处理过程就可以了。
eg:
type
TBase=class
public
DoMain:function (Str:String):Integer of Object;
DoElserocedure (Str:String) of Object;
end;
TA=class(TBase)
private
Count:Integer;
function _DoMain(Str:String):Integer;
procedure _DoElse(Str:String);
public
constructor Create
//当然,如果有必要,还要重载Destroy方法
end;
procedure TForm1.Button1Click(Sender: TObject);
var
A:TA;
Base:TBase;
begin
A:=TA.Create;
Base:=A
//在这个例子中,无所谓什么Clone不Clone了——你既然已经得到了子类的实例
//就完全可以调用DoMain和DoElse方法,不存在什么能不能的问题。
Base.DoMain('asdf');
Base.DoElse('3453');
Base.Free;
end;
{ TA }
constructor TA.Create;
begin
inherited;
DoMain:=_DoMain;
DoElse:=_DoElse;
Count:=0;
end;
procedure TA._DoElse(Str: String);
begin
ShowMessage(IntToStr(Count)+' '+Str);
end;
function TA._DoMain(Str: String): Integer;
begin
Inc(Count);
ShowMessage(Str);
end;