当前位置:主页>销售管理软件> 列表

继承方法问题!!!!! 找生产管理软件免费版

进销存软件版1楼: A类有方法
procedure abc; virtual;
B类继承A类有方法
procedure abc; override;
begin
inherited;
....
end;
C类继承B类有方法
procedure abc; override;
begin
请问这里怎样写,我想继承A的代码,但不想执行B的代码,
但又不能直接从A中继承,因为B类有很多方法代码可以用
end;

2楼: 跨级继承不太容易吧!
1。把A的procedure abc;的代码复制到C的procedure abc;中来吧,简单一些!
2。或者从A继承一个类AA,它包含B、C共用的一些功能代码,然后,B和C都从AA继承! 如财务软件免费下载

3楼: 你没看明白吗? B类的代码中用到了inherited;继承A类的代码,所以,你怎么把B类的代码复制到C类中用?

A类,B类是VCL的类,不能更改! 重新写,那太大了。

4楼: C好像支持隔代继承,pascal我不知道行不行

5楼: 你没看明白吗? B类的代码中用到了inherited;继承A类的代码,所以,你怎么把B类的代码复制到C类中用?--我说的复制是指Ctrl+C,Ctrl+V,我以为ABC都是你自己写的类呢!

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

不过你可以说说你要实现什么样的功能,也许可以采用别的方式实现呢!

6楼: 你没看明白吗? B类的代码中用到了inherited;继承A类的代码,所以,你怎么把B类的代码复制到C类中用?

A类,B类是VCL的类,不能更改! 重新写,那太大了。

进销存软件版7楼: TwgADODataSet => TADODataSet => TCustomerADODataSet => TDataSet;

我想在TwgADODataSet实现InternalPost方法,但不执行TCustomerADODataSet.InternalPost的代码,只执行TDataSet.InternalPost的代码

8楼: procedure TwgADODataSet.InternalPost;
begin
//inherited;
(Self as TDataset).InternalPost;
end;

9楼: 编译能够通过,不过好像死循环了!!!
再帮我看看吧!

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

谢谢。

10楼: 1。这个方法是我刚刚发现的,可能不是很成熟!
2。死循环我也是刚刚做测试代码的时候发现的!可能是因为多态的原因:多态就是父类虚方法,调用子类的实际的代码;而我们的子类却反过来调用父类的过程,所以死循环了!
3。一般情况下,(Self as TDataset)与TDataset(Self)的功能是一样的,都是做强制类型转换。

11楼: 原因找出来了,
(Self as TDataset).InternalPost;这样的写法,还是调用Self.InternalPost;
所以死循环。并不是调用TDataset.InternalPost;

12楼: 如果可以 QQ 上聊,
我的QQ: 4980688 如服装店销售软件

13楼: 搞定! 原来这么简单:)

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;

虽然如此,还是不建议用这类技术——因为它违反了面向对象的策略。
另一个可行的方案是:对父类方法中多余的操作进行反向的操作加以抵消——如果可以抵
消的话。 :)

进销存软件版14楼: 高,佩服啊,
不知兄弟怎么想出这样的方法? 还请指教思路,这样的同行不结不行,QQ联系我吧,我们可以交流。
我的QQ:4980688 晚上,请说明来意

15楼: creation-zy真高
直接跳到相应的地址
因为虚函数都是通过地址表找的
这个方法真的不错

16楼: 你的问题只是变量的作用域问题,很简单的.


比如说:
A.pas中有Funx函数,B.pas中也有Funx函数,且B.pas引用了A.pas.
则在B.pas中直接调用Funx函数时,调用的是B.pas中定义的Funx函数.
如果加上限定,如这样调用A.Funx,则调用的是A.pas中的Funx函数.

17楼: 怎么想出来的?Ctrl+Alt+C进入CPU调试模式,看看正常的inherited的实现代码——也就
是 call 父类.对应方法 而已——改成 call 祖父类.对应方法 就OK了。(中间我走了好多
弯路,为了不贻笑大方,就不说了:P)
理论上,这样的技巧适用于所有具有相同参数表的对象方法的调用——如果您自己填写寄
存器的值,不同参数的方法应该也可以调用——扯远了。 :)

18楼: creation-zy高手。。。

19楼: 太好了
隔代继承,我一直以为这是不可能的

20楼: 確實值得借鑒。

进销存软件版21楼: 多多谢谢各位啦!

22楼: procedure TwgADODataSet.InternalPost;
begin
//inherited;
(Self as TDataset).InternalPost;
end;
其实把inherited;取消掉可以了,但要复制格代的代码
我最近正好用到,呵呵 如生产管理软件免费版

23楼: 好像不能再加分,大家别嫌少。

24楼: 如果需要分, creation-zy 和 royal1442-25 请到下面的贴子领取


http://www.delphibbs.com/delphibbs/dispq.asp?lid=3256059