WEB开发网
开发学院软件开发Delphi 非COM环境下的接口编程--问题,技巧,应用(二)... 阅读

非COM环境下的接口编程--问题,技巧,应用(二)

 2006-02-04 13:47:22 来源:WEB开发网   
核心提示:(接上文)代码:现在把全文的代码列举如下,其中有一些上面没有给出的代码,非COM环境下的接口编程--问题,技巧,应用(二),但它们也很重要,列在一起方便大家浏览,举出了一些常见的问题和解决技巧,以及象这样的接口编程的一个可能应用,请仔细查看下面的代码以获得需要的信息,当然本文也仅仅是做为一个简单的例子

(接上文)

代码

现在把全文的代码列举如下,其中有一些上面没有给出的代码,但它们也很重要,列在一起方便大家浏览,请仔细查看下面的代码以获得需要的信息,当然本文也仅仅是做为一个简单的例子,举出了一些常见的问题和解决技巧,以及象这样的接口编程的一个可能应用。

接口:

IFoo = interface;

 

IFooManager = interface

  ['{3A10DC39-4B14-4C61-B657-E445C55408B6}']

  function CreateAFoo:IFoo;

  PRocedure DelAFoo(id:integer);

  function GetFooNum:integer;

  function GetFooByID(id:integer):IFoo;

end;

 

IFoo = interface

  //我们要维护的对象,只实现了一个简单的加法运算做为例子

  ['{22C541AA-0BA4-4092-B0EB-D267AB1FF001}']

  function fooAdd(x,y:integer):integer;

end;

 

TFoo的声明和实现:

TFoo = class(TMyInterfacedObject,IFoo)

  protected

  function fooAdd(x,y:integer):integer;

end;

 

implementation

 

{ TFoo }

function TFoo.fooAdd(x, y: integer):integer;

begin

 result:=x+y;

end;

工厂类的声明和实现:

TFooManager=class(TMyInterfacedObject,IFooManager)

  private

   FList:array of TFoo;

   FooNum:integer;

  protected

   constructor Create;

   function CreateAFoo:IFoo;

   procedure DelAFoo(id:integer);

   function GetFooNum:integer;

   function GetFooByID(id:integer):IFoo;

  public

   destructor Destroy;override;

 end;

 

var

 FooMan:TFooManager;

 

implementation

 

{ TFooManager }

constructor TFooManager.Create;

begin

 FooNum:=0;

end;

 

function TFooManager.CreateAFoo: IFoo;

begin

 inc(FooNum);

 if length(FList)<FooNum then

  setlength(FList,FooNum*2);

 FList[FooNum-1]:=TFoo.Create;

 result:=FList[FooNum-1] as IFoo;

end;

 

procedure TFooManager.DelAFoo(id:integer);

var

 i:integer;

begin

 if FooNum>0 then

 begin

  FList[id].Free;

  for i:=id to FooNum-2 do

  begin

   FList[i]:=FList[i+1];

  end;

  FList[FooNum-1]:=nil;

  Dec(FooNum);

 end;

end;

 

destructor TFooManager.Destroy;

//在释放工厂类前释放所有所维护的对象

var

 i:integer;

begin

  for i:=0 to FooNum-1 do

  begin

  FList[i].Free;

  FList[i]:=nil;

  end;

  Finalize(Flist);

  inherited;

end;

 

function TFooManager.GetFooByID(id: integer): IFoo;

begin

 result:=FList[id] as IFoo;

end;

 

function TFooManager.GetFooNum: integer;

begin

 result:=FooNum;

end;

 

Dll中仅有的两个导出函数:

function GetFooManIntf:IFooManager;stdcall;

begin

 if not assigned(FooMan) then

 begin

  FooMan:=TFooManager.Create;

 end;

 result:=FooMan as IFooManager;

end;

 

procedure FreeLib;stdcall;

//释放工厂类

begin

 if assigned(FooMan) then

 begin

  FooMan.Free;

  FooMan:=nil;

 end;

end;

Tags:COM 环境 接口

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接