用 Lazarus 開發 OPC Client 3 (關於介面/Interface)

来源:http://www.cnblogs.com/hieroly/archive/2017/01/20/6322920.html
-Advertisement-
Play Games

Delphi/Lazarus 裡面有個概念就是介面,這個概念在很多語言裡面也都存在,而且發揚,dot Net 就是這樣。 提到介面自然而然就想到COM、DCOM、OLE、ActiveX等相關知識,不錯,確實可以應用於這些環境,而且Delphi/Lazarus中的Interface功能強大到不僅實現微... ...


Delphi/Lazarus 裡面有個概念就是介面,這個概念在很多語言裡面也都存在,而且發揚,dot Net 就是這樣。

提到介面自然而然就想到COM、DCOM、OLE、ActiveX等相關知識,不錯,確實可以應用於這些環境,而且Delphi/Lazarus中的Interface功能強大到不僅實現微軟基於COM的技術,在Linux或其他系統下Interface的設計理念和方法一樣可用。這裡我們僅僅記錄一下在Windows下的心得。

Delphi/Lazarus下麵向對象設計中多態、繼承、封裝利用Interface的方法和Class的方法一般會有所區別,很早有本書中就提到“在設計初期就必須明確,用介面開發,還是Class開發”。那麼介面到底是什麼呢?在高級語言中我們可能會比較模糊,與純抽象類有毛線區別啊,都是“方法定義嘛”!這個就要從其內部結構說說了。

其實Interface在電腦記憶體中就是一片連續的方法說明,整個很關鍵哦,也就是為什麼介面定義了,就不可以再隨意更改了。必須重新定義新的介面,就算加一個功能也是如此。尤其是多個程式、多中語言進行溝通更是如此。按這個邏輯推導方法的順序也不可以隨意調整哦。

Delphi/Lazarus中介面很多我們大多會繼承自IUnknown /IInterface,對它們是等價的。他們其中的3個方法也是COM的基礎。

該代碼是 FPC 下的,所以定義了很多條件編譯開關
IUnknown = interface
  ['{00000000-0000-0000-C000-000000000046}']
  function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;
out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; end; IInterface = IUnknown;

而我們在使用中也往往會繼承 TInterfacedObject,作為實現的父類,它畢竟幫我們實現了最基本的釋放功能。也就是引用記數到0就釋放資源。這樣問題也就來了。也就是實現了資源的自動管理,這和dotNet不是一樣嗎,當然不同了,dotNet畢竟是後起之秀,晚好多年咧,都是安德森設計的所以資源控制上更厲害,但萬事萬物都有其兩面性,我有時就是不想讓它自動釋放!“明明是智能釋放哪裡會有這樣的情況發生為什麼不用呢,記數到0就該釋放”要解釋這個情況不能從簡單Class來解釋,需要用比較複查的結構來描敘。

Type
  TGroup=class;

  IGroup=interface(IUnknown)
      procedure K1;
  end;

  IClient=interface(IUnknown)
      procedure K2;
  end;

  TClient=class(TInterfacedObject,IClient)
     public FGroup:IGroup;
       procedure K1;
  end;

  TGroup=class(TInterfacedObject,IGroup)
    public  FClient:IClient;
    procedure K2;
  end;

var
  _ClientObj:TClient;
  _GroupObj:TGroup;

  _Client_IF:IClient;
  _Group_IF:IGroup;
. . .
begin
  _ClientObj:=TClient.Create;
  _GroupObj:=TGroup.Create;
  _ClientObj.FGroup:=_GroupObj;
  _GroupObj.FClient:=_ClientObj;

  _Client_IF:=_ClientObj;
  _Group_IF:=_GroupObj;

  _Client_IF:=nil;  // OK
  _Group_IF:=nil;  // Error
end.

(dotNet也是自動釋放,後面章節也會提到如何使用dotNet而不自動釋放),在Delphi/Lazarus中這時可以選擇繼承來自TComponent,它也實現了IUnknown 但不會釋放自身。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 更新內容:宿主的唯一編號和名稱可以輸入符號"."日誌文本框增加滾動條,並且總是顯示文本末端增加啟動方式選擇:1.手動啟動 2.跟隨系統啟動 最新下載地址: http://pan.baidu.com/s/1dEAs3Vr 密碼:8d9t 使用說明: http://www.cnblogs.com/Myt ...
  • 採用單位矩陣行列式變換求逆矩陣,源碼展示: public static double[,] Inverse(double [,] Array) { int m = 0; int n = 0; m = Array.GetLength(0); n = Array.GetLength(1);... ...
  • 前言 上一篇介紹了擴展類庫的功能簡介,通過json文件配置sql語句 和 sql語句的直接執行,這篇開始說明sql配置的策略模塊:策略管理器與各種策略的配置。 類庫源碼:github:https://github.com/skigs/EFCoreExtend 引用類庫:nuget:https://w ...
  • 閱讀博客http://jonskeet.uk/csharp/memory.html的筆記(個人水平有限,如若翻譯、記錄有誤,請提,謝謝~) 誤區:引用類型保持在堆中,值類型保持在棧中。 問題:前半句正確,後半句“值類型保持在棧中”不正確。 值類型的存儲位置: 1.局部變數都存於棧中,另外引用類型的變 ...
  • 聯繫QQ:250742613 ...
  • 最近兩天在學習MongoDB,強大的文檔資料庫。給我最大的感覺就是相比於SQL或者MSQ等傳統的關係型資料庫,在使用和配置上真的是簡化了很多。無論是在集群的配置還是故障轉移方面,都省去了許多繁瑣的步驟,但最重要是的什麼呢?是效率,它的出現解決了傳統關係型資料庫的IO瓶頸,極大的提高了工作效率,適合海 ...
  • 以前一直沒註意actionresult都能返回哪些類型的類型值(一直用的公司的內部工具類初始化進行返回的),今天跟大家分享一下(也是轉載的別人的日誌qaq)。 首先我們瞭解一下對action的要求: 1.必須是一個public方法 2.必須是實例方法 3.不能被重載 4.必須返回ActionResu ...
  • 接觸SourceCode公司的工作流產品K2.NET 2003有一段時間了,想把一些心得分享出來,和各位共同探討一下,拋磚引玉,希望能對相關人士以啟發。 K2.Net 2003是基於微軟.Net Framework技術框架之上的工作流平臺,能夠實現企事業內部人與人、人與部門、以及人與系統間的流程自動 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...