一个简单的问题,使用接口有什么好处??如何实现一个简单的接口?(200分)

W

www

Unregistered / Unconfirmed
GUEST, unregistred user!
正在为接口困惑。
另外一个问题:Delphi6之前的版本用IUnknown,Delphi6下说用IInterface,为什么
还可以用IUnknown??
如何实现一个简单的接口?
 
我的理解接口就差不多是纯虚类:)
我觉得接口可以帮助程序更面向对象,理解不是很深刻,关注
在Delphi6从入门到精通里面有一些介绍,D5技术手册,D5编程人员指南中也有。
我只是在小的程序终尝试使用过,感觉不错:)
 
在delphi中类没有多重继承,可以使用接口来解决
 
如果做应用程序直接的通讯是不是可以用Com实现?哪位能举个例子呢??谢了。
 
有同样问题,学习
 
接口在delphi下(包括java)是为了多态和多继承。使用接口才是真正的面向对象。
例子:(我的数据访问接口)

unit Udatagateinf;

interface

// *********************************************************************//
type
IThkDataGate = interface
['{3B83D100-EB58-4999-B8C8-2A315E12621A}']
function DG_GetRecords(const sCommandSQL: WideString
var vData: OleVariant): Integer
safecall;
function DG_Execute(const sCommandSQL: WideString
var iErrorCount: Integer): Integer
safecall;
function DG_ApplyUpdate(const sCommandSQL: WideString
const sData: WideString;
var iErrorCount: Integer): Integer
safecall;
end;

type
ThkDataGate=IThkDataGate;

type
CoThkDataGate = class
class function Create: IThkDataGate;
end;
implementation

uses Udmdatagate;

{ CoThkDataGate }

class function CoThkDataGate.Create: IThkDataGate;
begin
Result := TDataGate.Create() as IThkDataGate;
end;
end.

//当然有多种实现(包括com/soap等),如

type
TDataGate=class(TInterfacedObject,IThkDataGate)
private
function Connect:boolean;
procedure Disconnect;
published
function DG_GetRecords(const sCommandSQL: WideString;
var vData: OleVariant): Integer
safecall;
function DG_Execute(const sCommandSQL: WideString;
var iErrorCount: Integer): Integer
safecall;
function DG_ApplyUpdate(const sCommandSQL, sData: WideString;
var iErrorCount: Integer): Integer
safecall;
end;
 
一个好处就是借口不用手工释放内存,相当于c++的smart pointer
 
学习一下
 
似懂非懂[:(]
 
使用接口有利于程序的升级和Bug的修订。
同时开发接口有利于功能的共享。
任何接口必须从INuknown继承,这和Delphi中的VCL类都从TObject 继承类似。
接口是功能(方法)的组合,获得接口就可以调用其功能(方法)。
 
我感觉DELPHI是使用接口来实现多重继承。
>>使用接口有什么好处??
我感觉就是封装的好处。
 
其口最大的好处是可以在不同语方之间共享代码
 
接口的用处方面,楼上的富翁们说得也比较得体了,,下面来谈一下你所说的具体问题。

>>另外一个问题:Delphi6之前的版本用IUnknown,Delphi6下说用IInterface,为什么
>>还可以用IUnknown??
不知你有没有看过 IInterface 的声明:
type
IInterface = interface
['{00000000-0000-0000-C000-000000000046}']
function QueryInterface(const IID: TGUID
out Obj): HResult
stdcall;
function _AddRef: Integer
stdcall;
function _Release: Integer
stdcall;
end;

IUnknown = IInterface;
这是在System中声明的,现在知道这个原因了吧?

>>如何实现一个简单的接口?
实现接口有几种方式:
一是用映射来实现。
举个例子:
// 先申明一个接口

type

IMyInterface = Interface
procedure show;
procedure draw;
end;

//// 申明一个实现类
// 选择 TInterfacedObject 作为祖先类,的原因是:每个接口实现类
// 都必须实现接口中出现过的所有方法……,包括 IUnKnow 的三个方法
// _AddRef、_Release、QueryInterface,这三个方法在
// TInterfacedOjbect已经实现,所以我们一般都选择一个已经有了基本
// 实现的类作为实现类的基类。 :)
// 第二个接口,当然就是要实现的接口了。

TMyClass = class(TInterfacedObject,IMyInterface)
// 如果只是实现单一的interface 则可以不用这样,可以省掉这两句
// 这个过程就是映射,只不过当只有实现一个接口时,如果实现类的方法
// 名称跟接口中声明的完全一样的话(实质上也要求实现类中的声明必须
// 跟接口中的声明完全一样包括参数表和返回值),就可以省掉明显的映射
// 语句,而直接声明后面的实现方法就可以了。
procedure IMyInterface.show = show;
procedure IMyInterface.draw = draw;
////////////////////////////////
procedure show;
procedure draw;
end;
.....
implementation

procedure TMyClass.show;
begin
// 实现过程
end;

procedure TMyClass.draw;
begin
// 实现过程。
end


还有一种实现方式:委托一个特性来实现接口
比如现在我要用一个新的类来实现 IMyInterface ,可以利用已经有的TMyClass实现类,

type
/// 上例中的代码存在。 加入下面的

TOtherClass = class(TInterfacedObject, IMyInterface)
FMyInterface: IMyInterface;
// 定义一个特性,是 IMyInterface 接口类型的。
// 这里就可以不用再写出 IMyInterface 的实现过程了,因为在用TOtherClass 的实例
// 直接给 IMyInterface 赋值(得到实现)之前, FMyInterface 是要先实现的(先被
// 赋值),这时的选择余地比较大,可以选择你需要的实现类,然后达成不同的目的。
// 而给外部的是提供了一个统一的实现类。
// 关于用委托特性的方式来实现接口,究竟有什么样的优点,小弟也不甚清楚,
// 留高手来解释一番。 :)
property MyInterface: IMyInterface read FMyInterface implements IMyInterface;
end;

下面举个应用 TOtherClass 实现类的例子:

var
oc : TOtherClass;
Mi : IMyInterface;
begin
oc := TOtherClass.create;
// 这里当然你就可以随便选择能够实现IMyInterface 的所有实现类了。。。
oc.FMyInterface := TMyClass.Create

///
mi := oc
// 形式上实现了N个实现类的共用。
mi.show;
end


小弟也是初学,有什么不对的地方,敬请各位多多指教。。:)
这只是基本的,更详细的,你可以看看相关的书,《Delphi5高级编程--COM、CORBA与Internet编程》比较好。
 
多人接受答案了。
 
顶部