Delphi的OverRide、OverLoad和Virtual方法

 

1.方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。

如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。

如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱爲方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

 

2. Delphi 的函數覆蓋(Override)與重載(overload)

而Delphi 就是用override 關鍵字來說明函數覆蓋的。被覆蓋的函數必須是虛(virtual)的,或者是動態(dynamic)的,也就是說該函數在聲明時應該包含這兩個指示字中的一個,比如:

procedure Draw; virtual;

在需要覆蓋的時候,只需要在子類中用override 指示字重新聲明一下就可以了。

procedure Draw; override;

 

3.virtual 虛類型

dynamic 動態

overload 重載

override 重寫

 

4.關於方法定義關鍵字的說明:

如果在過程定義聲明時包括了的關鍵字的含義:
    static 表示是靜態方法;靜態方法是方法的缺省類型,不能被覆蓋;
    virtual 表示是虛擬方法;
    dynamic 表示是動態方法;
    這兩類方法的共同點是都可以被覆蓋(override),區別僅在於運行時調用方法時的派發機
制,virtual方法爲執行速度做了優化,而dynamic方法則爲代碼大小做了優化;經常被覆蓋的
方法應該定義爲virtual方法;
    message 表示是消息處理方法;在關鍵字message後面的值指明瞭這個方法要響應的消息;
用消息處理方法來響應Windows的消息,這樣就不用直接來調用它;
    override 表示是覆蓋方法;要求祖先類中必須有該方法的定義,並且參數的順序和類型
及返值的類型必須匹配;用於擴展祖先類中的該方法而不是取代它(如不調用祖先類中的該方
法則等同於取代);
    overload 表示是重載方法;用於一個類中有許多同名的方法帶着不同的參數表的情形;
(屬性的讀寫方法不能被重載);
    abstract 表示是抽象方法;是沒有實現的方法,並且必須是virtual或dynamic方法,即
在abstract前面必須有virtual或dynamic關鍵字,其實現部分在派生類中;如
      procedure DoSomething; virtual; abstract;
    reintroduce表示是重新聲明的方法;用於方法的名稱與祖先類中的某個方法名稱相同的情形;

5.virtual 和 dynamic定義的虛函數,都是爲了子類override用的,只不過它們的實現不一樣。vitrual 佔用的空間大點,但速度快些。dynamci正好相反.

--------------------------------------------------

程序如下:
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方法?

這是message關鍵字的功勞. 所以不需要加override也能調用原先的處理過程
(其實都是替換了wndproc, message中的inherited相當於callwindowproc)

發佈了11 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章