关于面向对象的一个问题(50分)

  • 主题发起人 主题发起人 hyesheng
  • 开始时间 开始时间
H

hyesheng

Unregistered / Unconfirmed
GUEST, unregistred user!
假如有一基类TA,该类有一虚拟方法MSG,现在从TA派生一子类TB,并重载方法MSG,
再从TB泒生子类TC,也重载方法MSG,此时,我想在TC的方法MSG中继承TA.MSG的代码,
但不想继承TB.MSG的代码,这条语句应该怎么写呢??
 
好像不行
 
在TB中设置一flag,在MSG中通过flag的值来决定具体处理;然后,在TC中设置其
ParentClass TB中的flag,...
 
把TA和TB都作为TC的父类
 
不可能,但可以把TB做成interface
 
是这个意思么?

TA = class(TObject)
public
procedure x
virtual;
end;

TB = class(TA)
public
procedure x
override;
end;

TC = class(TB)
public
procedure x;override;
end;

implementation

procedure ta.x;
begin
showmessage('TA.X');
end;

procedure tb.x;
begin
inherited;
showmessage('TB.X');
end;

procedure tc.x;
var
t : ta;
begin
t := ta.Create;
t.x;
t.Free;
showmessage('tc.x');
end;
 
hehe
ta class
{
public:
void virtual msg(void){ShowMessage("ta");}
};
tb class:public ta
{
public:
void virtaul msg(void){ShowMessage("tb");}
};
tc class:public tb
{
public:
void virtaul msg(void)
{
ta:msg();
~~~~~~~~~~`这是c++的搞法,delphi中有办法没有就不知道了,
是不是一定要用楼上同志所说的呢?(无疑这是一种方法)
ShowMessage("tc");
}
};
 
C++是可以的,就如楼上的所讲,Delphi嘛,偶帮你试试再告诉你
 

TA = class(TObject)
public
procedure x(Caller: TObject)
virtual;
end;

TB = class(TA)
public
procedure x(Caller: TObject)
override;
end;

TC = class(TB)
public
procedure x(Caller: TObject);override;
end;
implementation

procedure ta.x(Caller: TObject);
begin
showmessage('TA.X');
end;

procedure tb.x(Caller: TObject);
begin
if Caller is TC then inherited x(nil)
else showmessage('TB.X');
end;

procedure tc.x(Caller: TObject);;
begin
inherited x(self);
showmessage('tc.x');
end;
 
TA = class(TObject)
public
procedure x(Caller: TObject)
virtual;
end;

TB = class(TA)
public
procedure x(Caller: TObject)
override;
end;

TC = class(TB)
public
procedure x(Caller: TObject);override;
end;
implementation

procedure ta.x(Caller: TObject);
begin
showmessage('TA.X');
end;

procedure tb.x(Caller: TObject);
begin
showmessage('TB.X');
end;

procedure tc.x(Caller: TObject);;
begin
TA(Caller).x;
///直接调用TA.x方法!
showmessage('tc.x');
end;
 
procedue TC.Proc;
begin
TA(Self).Proc;
DoSomething ..........
end;
试验了,看来不行,虚方法表已经修改了,
如果这样调用,最后还是会从TA的虚方法表中找对应,找到的还是TC.PROC
倘若这样,是否就没有简单方法能够搞定了?
 
衷心衷心地感谢大家的解答,其实我一直在考虑的方法就是aizb的方法,只不过怎么写就
不知道了。不过aizb的方法还是不行的,我记得在VCL中有一个例子,让我再去找一找,找
到了再贴出来。
 
后退
顶部