从InterFace到COM+(Part One)
{
---------从InterFace到COM+(Part One)------------------
一,接口是做什么作的?接口与类有什么关系?
1,说到接口不能不说到类,类是做什么的,它的功能与意义是什么?
One:类是计算机语言面象对象后的产物,(面象对象是程序设计学的概念,它除了是个概念其它
什么都不是,就像.net和JDK他们只是一个软件运行平台(别人叫框架),其它什么都不是)
Two:类(这里指基类)通过泒生来实现类功能的扩充,通过虚拟方法与动态方法实现类的多态,
一般而言,基类中定义对象的基本功能,并实现这些基本功能,如果只知道对象的基本功能名称
而不知道它的实现,那就把功能(也叫方法)定义成动态抽象或虚拟抽象,由它的泒生类去完成.
(在这里说的类与对象是同一个意思,类就是对象,对象就是类.继承和泒生是一个意思,站在基
类的角度上,由基类衍生出来类叫泒生类,站在基类的衍生类角度上,衍生类是基类的继承类,
基类就是父类,泒生类就是继承类就是子类说的都是一个意思,一身而言,泒生类大于基类,还
还有所有书上所说的功能=行为=方法=例程ROUTINE这都是同一个意思,虽然方法分为过程与
函数)
Three:前面说过基类定义对象的基本功能(行为),并实现它,如果只知道基本功能的名称,
不知道如何实现它,那就在功能定义后面把功能指示为动态抽象(Dynamic;Abstract)或
虚拟抽象(Virtual;Abstract),由泒生类去覆盖并实现它们,你也许会说,功能名称我也不
知道,实现方法更不知道,那就失去了定义功能的基本意义了,要定义一个对象的基本功能,
你可以不知道如何实现,但必须知道功能的名称.
2,当你用Delphi工具做了一个功能强大处理特殊事呢的类,在协同开发中,对方是用C++功具
的,这个时候,你有二种选择,把这个强大的类功能做成DLL(动态链接库,动态链接库里面是
可以封装界面的)或在这个类上面做一个接口,封装成COM(COM+的功能比COM强大可以封装
界面),然后安装到Windows操作系统里面,通过接口方式供C++程序员调用,Windows操作平台
本身就提供很多COM++输出 Component->Import Component->Import a Type Library,
ActiveX控件的原理和这个是一样的
3,在实际软件开发过程中,很少使用泒生接口,如基接口已经拥有接口实现实,那么泒生接口
的实现类要重复去实现基接口中的方法,虽然可以通过泒生接口实现类的属性功能委托基接
口实现类去实现基接口中的方法,在这种多种引用中是很复杂的.
4,下面是一个接口的实例,没有什么实际应用价值,只是说明接口的定义与使用
5,接口中的方法,前指示字全是public但不允许用public指示,后指示字全部是Virtual;Abstract
虚拟抽象,同样也不允许指示出来
}
unit U_InterfaceAndCom;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TF_InterfaceAndCom = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
//定义接口
type myInterface = Interface
['{6E029151-2319-4B92-8D9F-E469B36C7FC7}']//接口必须定义GUID
function ReturnAPlusB(A : integer; B : integer):Integer;
end;
type myClass = class (TInterfacedObject,myInterface)
{
定义接口的实现类
这个类为什么要泒生自TInterfacedObject,那是因为TInterfacedObject类
实现在TInterface中的QueryInterface(接口查询方法)_AddRef(接口增加引用计数方法)
_Release(接口释放方法),方法前面加了_表示此方由系统自动调用,无须手工调用.
注意,接口实现类必须实现接口中定义的所有方法!当然一个接口实现类可以实现多个接口
}
public
function ReturnAPlusB(A : integer; B : integer):Integer;
end;
//定义一个泒生接口
type myInterfaceTwo = Interface(myInterface)
['{21628C27-A428-4690-9D97-F4A0B69FC3B2}']
procedure myShowMessage;//新加一个方法进来
end;
//定义一个泒生接口的实现类
type myClassTwo = class (TInterfacedObject, myInterfaceTwo)
private
FBaseInterfaceClass : myClass;//定一个基接口实现类的变量,前面加了个F主要是表明它是类的值域,
public //这个F是可加可不加的F=Field的意思 field=领域,田, 地, 牧场
constructor Create;//这个构造函数必须重写,主要是为基接口实现类变量FBaseInterfaceClass赋值
procedure myShowMessage;
property IBaseInterfaceClass : myClass read FBaseInterfaceClass implements myInterfaceTwo;
//注意泒生接口实现类属性的写法, 属性名称IBaseInterfaceClass为基接口实现类,然后读取基接口实现
//类的实例,作用是实现泒生接口中的方法 注意这里用的是implements(工具)而不是implementation(执行)
end;
var
F_InterfaceAndCom: TF_InterfaceAndCom;
implementation
{$R *.dfm}
{ myClass }
procedure TF_InterfaceAndCom.Button1Click(Sender: TObject); //使用接口
var
theInterface : myInterface;//定义接口变量,其实他是个指针,可以赋nil给它的
begin
theInterface := myInterface(myClass.Create);
{
注意这里的写法:把接口实现类的实例通过接口转换,转换成接口赋给接口变量
(有接口转换当然也有类转换用法一样,前面写的是类或接口定义名称本身,
而不是他们的实例)
}
ShowMessage(IntToStr(theInterface.ReturnAPlusB(12,13)));
end;
{ myClass }
function myClass.ReturnAPlusB(A, B: integer): Integer;
begin
Result := A + B;
end;
{ myClassTwo }
//重写泒生接口实现类的构造方法,为基接口实现类变量赋值
constructor myClassTwo.Create;
begin
FBaseInterfaceClass := myClass.Create;
end;
procedure myClassTwo.myShowMessage;
begin
ShowMessage('Hello Word');
end;
//调用泒生接口中的方法
procedure TF_InterfaceAndCom.Button2Click(Sender: TObject);
var
theInterfaceTwo : myInterfaceTwo; //定义泒生接口变量
begin
theInterfaceTwo := myInterfaceTwo(myClassTwo.Create);//实例化泒生接口
theInterfaceTwo.myShowMessage;//调用泒生接口中的方法
ShowMessage(IntToStr(theInterfaceTwo.ReturnAPlusB(15,13)));//调用泒生接口中委托实现的方法
end;
end.