程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 基於Delphi的接口編程入門(2)

基於Delphi的接口編程入門(2)

編輯:Delphi

3、獲取接口

a. 使用類型轉換。 如:

var aIntf: IMyInterface;
begin
 aObj := TIntfClass.Create;
try
 aIntf := (IMyInterface(aObj);
 ...

b. 利用Delphi編譯器內建機制。 如:aIntf := aObj。

c. 利用對象的QueryInterface方法。如OleCheck(aObj.QueryInterface(IID, aIntf)); 只能存取有GUID的COM接口。

d. 利用as操作符。

使用as操作符必須符合下面條件:

1.接口必須明確地指定是從IInterface接口繼承下來。

2.必須擁有GUID值

在Delphi7中接口的實現類還必須是從TInterfacedObject繼承下來才行,如:

TIntfClass = class(TInterfacedObject, IMyInterface)

4、接口和對象生命期

因為Delphi會自行檢查接口如果在使用後沒有釋放而在生成的程序裡加上釋放代碼,但也因這樣帶來了問題,如下面代碼:

var
 i: Integer;
 aObj: TIntfClass;
 aIntf: IMyInterface;
begin
 aObj := TIntfclass.Create;
 try
  aIntf := aObj;
  aIntf.GetName...
 finally
  aIntf := nil;
  FreeAndNil(aObj);
end;

上面的代碼執行的話會產生存取違規錯誤,是因為對接口置nil時已釋放接口,而FreeAndNil(aObj)會再釋放aIntf一次,而在對aIntf置

nil時已釋放了該對象。解決這個問題只要不讓接口干擾對象的生命期就可以了,在Release中只需減引用計數而不做釋放的動作。

function TIntfClass._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
end;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved