继承方法问题!!!!!(50分)

  • 主题发起人 主题发起人 WilliamGui
  • 开始时间 开始时间
W

WilliamGui

Unregistered / Unconfirmed
GUEST, unregistred user!
A类有方法
procedure abc
virtual;
B类继承A类有方法
procedure abc
override;
begin
inherited;
....
end;
C类继承B类有方法
procedure abc
override;
begin
请问这里怎样写,我想继承A的代码,但不想执行B的代码,
但又不能直接从A中继承,因为B类有很多方法代码可以用
end;
 
跨级继承不太容易吧!
1。把A的procedure abc;的代码复制到C的procedure abc;中来吧,简单一些!
2。或者从A继承一个类AA,它包含B、C共用的一些功能代码,然后,B和C都从AA继承!
 
你没看明白吗? B类的代码中用到了inherited;继承A类的代码,所以,你怎么把B类的代码复制到C类中用?

A类,B类是VCL的类,不能更改! 重新写,那太大了。
 
C好像支持隔代继承,pascal我不知道行不行
 
你没看明白吗? B类的代码中用到了inherited;继承A类的代码,所以,你怎么把B类的代码复制到C类中用?--我说的复制是指Ctrl+C,Ctrl+V,我以为ABC都是你自己写的类呢!

A类,B类是VCL的类,不能更改! 重新写,那太大了。--抱歉了,自己继承一个新的类吧!

不过你可以说说你要实现什么样的功能,也许可以采用别的方式实现呢!
 
你没看明白吗? B类的代码中用到了inherited;继承A类的代码,所以,你怎么把B类的代码复制到C类中用?

A类,B类是VCL的类,不能更改! 重新写,那太大了。
 
TwgADODataSet => TADODataSet => TCustomerADODataSet => TDataSet;

我想在TwgADODataSet实现InternalPost方法,但不执行TCustomerADODataSet.InternalPost的代码,只执行TDataSet.InternalPost的代码
 
procedure TwgADODataSet.InternalPost;
begin
//inherited;
(Self as TDataset).InternalPost;
end;
 
编译能够通过,不过好像死循环了!!!
再帮我看看吧!

还有,请问一下,
(Self as TDataset).InternalPost;与TDataset(Self).InternalPost;
有什么不同,为什么后面的就不能通过。

谢谢。
 
1。这个方法是我刚刚发现的,可能不是很成熟!
2。死循环我也是刚刚做测试代码的时候发现的!可能是因为多态的原因:多态就是父类虚方法,调用子类的实际的代码;而我们的子类却反过来调用父类的过程,所以死循环了!
3。一般情况下,(Self as TDataset)与TDataset(Self)的功能是一样的,都是做强制类型转换。
 
原因找出来了,
(Self as TDataset).InternalPost;这样的写法,还是调用Self.InternalPost;
所以死循环。并不是调用TDataset.InternalPost;
 
如果可以 QQ 上聊,
我的QQ: 4980688
 
搞定! 原来这么简单:)

type
TFoo1=class
protected
FA:Integer;
FB:Integer;
public
property A:Integer read FA;
property B:Integer read FB;
procedure DoFoo
virtual;
end;
TFoo2=class(TFoo1)
public
procedure DoFoo
override;
end;
TFoo3=class(TFoo2)
public
procedure DoFoo
override;
end;

{ TFoo1 }

procedure TFoo1.DoFoo;
begin
FA:=0;
end;

{ TFoo2 }

procedure TFoo2.DoFoo;
begin
inherited;
FB:=10;
end;

{ TFoo3 }

procedure TFoo3.DoFoo
//跳过TFoo2.DoFoo
begin
//inherited;
asm
call TFoo1.DoFoo //Just call the method of TFoo1.
end;
FA:=FA+1;
FB:=FB+2;
end;



procedure TForm1.Button1Click(Sender: TObject)
//Jump Test
var
MyFoo:TFoo1;
begin
MyFoo:=TFoo3.Create;
MyFoo.DoFoo;
Caption:=IntToStr(MyFoo.B);
MyFoo.Free;
end;

procedure TForm1.Button2Click(Sender: TObject)
//Call Foo2
var
MyFoo:TFoo1;
begin
MyFoo:=TFoo2.Create;
MyFoo.DoFoo;
Caption:=IntToStr(MyFoo.B);
MyFoo.Free;
end;

虽然如此,还是不建议用这类技术——因为它违反了面向对象的策略。
另一个可行的方案是:对父类方法中多余的操作进行反向的操作加以抵消——如果可以抵
消的话。 :)
 
高,佩服啊,
不知兄弟怎么想出这样的方法? 还请指教思路,这样的同行不结不行,QQ联系我吧,我们可以交流。
我的QQ:4980688 晚上,请说明来意
 
creation-zy真高
直接跳到相应的地址
因为虚函数都是通过地址表找的
这个方法真的不错
 
你的问题只是变量的作用域问题,很简单的.
比如说:
A.pas中有Funx函数,B.pas中也有Funx函数,且B.pas引用了A.pas.
则在B.pas中直接调用Funx函数时,调用的是B.pas中定义的Funx函数.
如果加上限定,如这样调用A.Funx,则调用的是A.pas中的Funx函数.
 
怎么想出来的?Ctrl+Alt+C进入CPU调试模式,看看正常的inherited的实现代码——也就
是 call 父类.对应方法 而已——改成 call 祖父类.对应方法 就OK了。(中间我走了好多
弯路,为了不贻笑大方,就不说了:P
理论上,这样的技巧适用于所有具有相同参数表的对象方法的调用——如果您自己填写寄
存器的值,不同参数的方法应该也可以调用——扯远了。 :)
 
creation-zy高手。。。
 
太好了
隔代继承,我一直以为这是不可能的
 
確實值得借鑒。
 
后退
顶部