COM的理論
以實例來講
COM的接口(Interface)是COM的核心,所有的COM接口都是通過IUnknown派生出來的,它告知客戶那些接口是有效的,即已經被實現類說定義。它定義的一般方式如下:
ISimpleInterface=Interface(IUnknown)
Function GetName:String
Procedure SetName(v_Name:String)
End;
如果在上面的接口中加入這樣一行:
ISimpleInterface=Interface(IUnknown)
V_Name:String;
Function GetName:String
Procedure SetName(v_Name:String)
End;
這樣是不被允許的,因為上面我們說到接口方法就像是一個占位符,需要實現類引出才有實際意義,v_Name:String這一句只是一個數據成員將永遠無任何意義,如果要定義也只能在實現類中定義。
現在舉一個COM的例子,沒有什麼實際用處但至少說明問題:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
ISimpleInterface=Interface(IUnknown)
Procedure SetValue(v_Value:Integer);
Function GetValue:Integer;
End;
TSimpleImple=Class(TInterfacedObject,ISimpleInterface)
Public
Value:Integer;
Procedure SetValue(v_Value:Integer);
Function GetValue:Integer;
End;
var
Form1: TForm1;
v_Obj:TSimpleImple;
implementation
{$R *.dfm}
{ TSimpleImple }
function TSimpleImple.GetValue: Integer;
begin
Result:=Value;
end;
procedure TSimpleImple.SetValue(v_Value: Integer);
begin
Value:=v_Value;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
v_Obj:=TSimpleImple.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
v_Obj.SetValue(StrToInt(Edit1.Text));
Edit1.Clear;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Text:=IntToStr(v_Obj.GetValue);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
v_Obj.Free;
end;
end.
藍色字樣即定義了一個接口,在形式上在ISimpleInterface(接口定義)和TSimpleImple(實現類)幾乎定義都差不多,但是我要強調的是,接口定義是為了實現OLE方式的訪問,而實現類的定義,是接口功能的實現。兩者在功能和實現上都是有區別的。
(待續…)