如何区别delphi中override和替换?(50分)

  • 主题发起人 主题发起人 帅义庭
  • 开始时间 开始时间

帅义庭

Unregistered / Unconfirmed
GUEST, unregistred user!
本人有一例程序如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
private
procedure wmCopyData(var AMessage: TMessage);
message WM_COPYDATA;
protected
procedure WndProc(var AMessage: TMessage);
override;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.DFM}
procedure TForm1.WndProc(var AMessage: TMessage);
begin
...
...
...
inherited WndProc(AMessage);
end;

procedure TForm1.wmCopyData(var AMessage: TMessage);
var
pdsData: PCopyDataStruct;
sGot : AnsiString;
begin
inherited;
pdsData := PCopyDataStruct(AMessage.lParam);
sGot := StrPas(pdsData^.lpData);
SendMessage(hPartner, wm_Response, Self.Handle, id_GotData);
end;

end.

在上面程序中各位朋友注意了
过程wmCopyData(var AMessage: TMessage);
message WM_COPYDATA;在声明中未加任何说明即意味着是替换其父类的方法,其父类wnCopyData已不存在。
而过程WndProc(var AMessage: TMessage);
override;在声明中加入了
override超越的说明即意味着是扩展以前的方法也就是保留了父类的方法并在
其基础上增加了某些功能;
按照这样的理解,那么我例中的wmCopyData方法就应该是用现在的
新wmCopyData替换掉父类的wmCopyData方法,而在本例中的wmCopyData的过程中有加入了一句inherited即继承又是何意,是否意味着新的wmCopyData方法并没有替换掉父类的wmCopyData方法?
 
g
TForm1.wmCopyData里面去掉inherited不行吗?
 
这是message关键字的功劳. 所以不需要加override也能调用原先的处理过程
(其实都是替换了wndproc, message中的inherited相当于callwindowproc)
 
Another_eYes:
假如wmCopyData这个过程换成一个其他的普通过程如procedure draw,那么在新类的声明中仍是替换说明,在新类的draw中加入一句inherited,是否意味着draw方法仍然继承了其父类draw的功能。如果是这样,那么替换与override又有何区别呢?
 
cakk:去掉就不能继续执行原来的功能了:-)
另外wmcopydata并不是替换wmcopydata, 而是检测到wm_copydata消息后执行
wmcopydata, 其中的inherited;就是继续发送wm_copydata到程序中去, 如果没有
这条的话, 除非你自己处理, 否则wm_copydata要激发的指令不会执行.
 
>>>那么在新类的声明中仍是替换说明,
什么叫替换说明???
没有override, message等关键字你能用inherited吗?
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
896
SUNSTONE的Delphi笔记
S
S
回复
0
查看
873
SUNSTONE的Delphi笔记
S
后退
顶部