熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:Delphi自定義部件開發(一)[4]

2022-06-13   來源: Delphi編程 

  下例是一個顯示兩個定義在運行時接口的只讀屬性的例子

  type

  TSampleComponent = class(TComponent)

  private

  FTempCelsius: Integer; { 具體實現是private }

  function GetTempFahrenheit: Integer;

  public

  property TempCelsius: Integer read FTempCelsius; { 屬性是public }

  property TempFahrenheit: Integer read GetTempFahrenheit;

  end;

  function GetTempFahrenheit: Integer;

  begin

  Result := FTempCelsius * div + ;

  end;

  既然用戶在設計時不能改變public部分的屬性的值那麼該類屬性就不能出現在Object Inspector窗口中

  ⑷ 定義設計時接口

  將對象的某部分聲明為published該部分也即為public且產生運行時類型信息但只有published部分定義的屬性可顯示在Object Inspector窗口中對象的published部分定義了對象的設計時接口設計時接口包含了用戶想在設計時定制的一切特征

  下面是一個published屬性的例子因為它是published因此可以出現在Object Inspector窗口

  TSampleComponent = class(TComponent)

  private

  FTemperature: Integer; { 具體實現是 private }

  published

  property Temperature: Integer read FTemperature write FTemperature; { 可寫的 }

  end;

   派送方法

  派送(Dispatch)這個概念是用來描述當調用方法時你的應用程序怎樣決定執行什麼樣的代碼當你編寫調用對象的代碼時看上去與任何其它過程或函數調用沒什麼不同但對象有三種不同的派送方法的方式

  這三種派送方法的類型是

  ● 靜態的

  ● 虛擬的

  ● 動態的

  虛方法和動態方法的工作方式相同但實現不同兩者都與靜態方法相當不同理解各種不同的派送方法對創建部件是很有用的

  ⑴ 靜態方法

  如果沒有特殊聲明所有的對象方法都是靜態的靜態方法的工作方式正如一般的過程和函數調用在編譯時編譯器決定方法地址並與方法聯接

  靜態方法的基本好處是派送相當快因為由編譯器決定方法的臨時地址並直接與方法相聯虛方法和動態方法則相反用間接的方法在運行時查找方法的地址這將花較長的時間

  靜態方法的另一個不同之處是當被另一類型繼承時不做任何改變這就是說如果你聲明了一個包含靜態方法的對象然後從該對象繼承新的對象則該後代對象享有與祖先對象相同的方法地址因此不管實際對象是誰靜態方法都完成相同的工作

  你不能覆蓋靜態方法在後代對象中聲明相同名稱的靜態方法都將取代祖先對象方法

  在下列代碼中第一個部件聲明了兩靜態方法第二個部件聲明了相同名字的方法取代第一個部件的方法

  type

  TFirstComponent = class(TComponent)

  procedure Move;

  procedure Flash;

  end;

  TSecondComponent = class(TFirstComponent)

  procedure Move; { 盡管有相同的聲明但與繼承的方法不同 }

  function Flash(HowOften: Integer) Integer; { 同Move方法一樣 }

  end;

  ⑵ 虛方法

  調用虛方法與調用任何其它方法一樣但派送機制有所不同虛方法支持在後代對象中重定義方法但調用方法完全相同虛方法的地址不是在編譯時決定而是在運行時才查找方法的地址

  為聲明一個新的方法在方法聲明後增加virtual指令方法聲明中的virtual指令在對象虛擬方法表(VMT)中創建一個入口該虛擬方法表保存對象類所有虛有擬方法的地址

  當你從已有對象獲得新的對象新對象得到自己的VMT它包含所有的祖先對象的VMT入口再增加在新對象中聲明的虛擬方法後代對象能覆蓋任何繼承的虛擬方法

  覆蓋一個方法是擴展它而不是取代它後代對象可以重定義和重實現在祖先對象中聲明的任何方法但無法覆蓋一個靜態方法覆蓋一個方法要在方法聲明的結尾增加override指令在下列情況使用override將產生編譯錯誤

  ● 祖先對象中不存在該方法

  ● 祖先對象中相同方法是靜態的

  ● 聲明與祖先對象的(如名字參數)不匹配

  下列代碼演示兩個簡單的部件第一個部件聲明了三個方法每一個使用不同的派送方式第二個部件繼承第一個部件取代了靜態方法覆蓋了虛擬方法和動態方法

  type

  TFirstComponent = class(TCustomControl)

  procedure Move; { 靜態方法 }

  procedure Flash; virtual; { 虛 方 法 }

  procedure Beep; dynamic; { 動態虛擬方法 }

  end;

  TSecondComponent = class(TFirstComponent)

  procedure Move; { 聲明了新的方法 }

  procedure Flash; override; { 覆蓋繼承的方法 }

  procedure Beep; override; { 覆蓋繼承的方法 }

  end;

  ⑶ 動態方法

  動態方法是稍微不同於虛擬方法的派送機制因為動態方法沒有對象VMT的入口它們減少了對象消耗的內存數量派送動態方法比派送一般的虛擬方法慢因此如果方法調用很頻繁你最好將其定義為虛方法

  定義動態方法時在方法聲明後面增加dynamic指令

  與對象虛擬方法創建入口不同的是dynamic給方法賦了一數字並存儲相應代碼的地址動態方法列表只包含新加的和覆蓋的方法入口繼承的動態方法的派送是通過查找每一個祖先的動態方法列表(按與繼承反轉的順序因此動態方法用於處理消息(包括Windows消息)實際上消息處理過程的派送方式與動態方法相同只是定義方法不同

  ⑷ 對象與指針

  在Object Pascal中對象實際上是指針編譯器自動地為程序創建對象指針因此在大多數情況下你不需要考慮對象是指針但當你將對象作為參數傳遞時這就很重要了通常傳遞對象是按值而非按引用也就是說將對象聲明為過程的參數時你不能用var參數理由是對象已經是指針引用了

  返回目錄DELPHI基礎教程

       編輯推薦

       Java程序設計培訓視頻教程

       JEE高級框架實戰培訓視頻教程

  Visual C++音頻/視頻技術開發與實戰

  Oracle索引技術

  ORACLEG數據庫開發優化指南

  Java程序性能優化讓你的Java程序更快更穩定

  C嵌入式編程設計模式

  Android游戲開發實踐指南

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25124.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.