各位大哥,小弟一object Pascal 的问题恳请帮忙解决:
我定义了这样三个类:
TMyClass1 = class(TObject)
private
{ Private declarations }
protected
procedure fun1(); virtual;
public
{ Public declarations }
end; TMyClass2 = class(TMyClass1)
private
{ Private declarations }
protected
procedure fun1(); override;
public
{ Public declarations }
end; TMyClass3 = class(TMyClass2)
private
{ Private declarations }
protected
procedure fun1(); override;
public
{ Public declarations }
end;procedure TMyClass1.fun1();
begin
showmessage('TMyClass1.fun1() is Called';
end;procedure TMyClass2.fun1();
begin
showmessage('TMyClass2.fun2() is Called';
inherited;
end;procedure TMyClass3.fun1();
begin
showmessage('TMyClass2.fun3() is Called';
inherited;
end; 在我的 TMyClass3.fun1()函数中,inherited语句实际上调用的是
TMyClass2.fun1()函数,但假如我想在我的 TMyClass3.fun1()函数
中直接使用TMyClass1.fun1()这个函数,我该如何处理??? !!!!!!! 急急急急急急急急急急急急急急 !!!!!!!
我定义了这样三个类:
TMyClass1 = class(TObject)
private
{ Private declarations }
protected
procedure fun1(); virtual;
public
{ Public declarations }
end; TMyClass2 = class(TMyClass1)
private
{ Private declarations }
protected
procedure fun1(); override;
public
{ Public declarations }
end; TMyClass3 = class(TMyClass2)
private
{ Private declarations }
protected
procedure fun1(); override;
public
{ Public declarations }
end;procedure TMyClass1.fun1();
begin
showmessage('TMyClass1.fun1() is Called';
end;procedure TMyClass2.fun1();
begin
showmessage('TMyClass2.fun2() is Called';
inherited;
end;procedure TMyClass3.fun1();
begin
showmessage('TMyClass2.fun3() is Called';
inherited;
end; 在我的 TMyClass3.fun1()函数中,inherited语句实际上调用的是
TMyClass2.fun1()函数,但假如我想在我的 TMyClass3.fun1()函数
中直接使用TMyClass1.fun1()这个函数,我该如何处理??? !!!!!!! 急急急急急急急急急急急急急急 !!!!!!!
inherited TMyClass1(Self).fun1;
不知道可不可以!
inherited TMyClass1(Self).fun1;
TMyClass3 = class(TMyClass2)
private
{ Private declarations }
aObj:TMyClass1;
protected
procedure fun1(); override;
public
{ Public declarations }
end;
//实现部分
procedure TMyClass3.fun1();
begin
aObj:=TMyClass1.Create;
aObj.fun1;
aObj.free;
end;
这是Delphi设计的时候专门规定的,已避免继承层次深了以后行为混乱。要是屏蔽功能,可以去比较高的层次的类自己进行派生。
关于改VCL,Borland的建议是,不要在代码上直接修改,可以选择合适的基类,进行派生完成你要的功能。面向对象的复用可不是把代码拷来改改这样复用法的。
var
C3: TMyClass3;
begin
TMyClass1(C3) := TMyClass1.Create();
C3.fun1;
FreeAndNil(C3);
end;
掩耳盗铃罢了