我来细说不同的 interface
1. Java 中的 Interface
Java 取消了多重继承, 却引入Interface作为基本语言要素来实现类似多重继承的功能.
Java中的Interface是一种没有实现(implementation)的纯虚拟类. 同样拿"组合音响"做例子.
我们可以定义一个组合音响 interface, 然后, 做出索尼音响, 爱华音响, 先锋音响类 ...
组合音响 interface 是虚的, 只有定义: 电源200/50, 输出200w, 5盘CD机 ...
由具体的类如索尼音响来这些功能实现, 实现方法可以各异.
interface 组合音响 {
public void play();
}
class 索尼音响 extends 家电 implements 组合音响 {
public void play() {
// 用索尼6通道环绕系统
......
}
}
2. C++ 中的 Interface
我的印象中 C++ 是没有 Interface 作为基本语言要素的.它有多重继承和 template.
class 组合音响 {
virtual public void play()=0;
}
class 索尼音响 : public 家电, public 组合音响 {
public void play();
}
void 索尼音响:
lay() {
......
}
这里的组合音响必定是个类. C++中没有看到过 :
interface 组合音响 {
}
3. COM 中的 Interface
COM 中的 Interface 概念是独立于 C++ 本身语言概念以外的东西, 是为了方便不同语言
之间相互调用而设立的规范(用IDL来描述的, 存放于所谓typelib中). 看 VC++ 实现
Interface 用了很多 template 和宏来完成.
class C索尼音响: public 家电,
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<C组合音响, &CLSID_组合音响>,
public IDispatchImpl<I组合音响, &IID_I组合音响, &LIBID_组合音响Lib>
{
BEGIN_COM_MAP(C组合音响)
COM_INTERFACE_ENTRY(I组合音响)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY_IID(CLSID_组合音响, C组合音响)
END_COM_MAP()
public:
STDMETHOD(play)();
}
STDMETHODIMP 索尼音响:
lay(){
......
}
您可以看到, 为了这个 COM 的 Interface, VC++ 是如何大动干戈的了.
这么做的目的就是使得 VB 可以很方便地接上去:
Dim 我的音响 as 家电库.索尼音响;
我的音响.play
4. Delphi 中的 Interface
Delphi 1 开始的时候, 没有多重继承, 也没有 Interface, 还挺嘴硬: 多重继承容易出错.
以后为了支持 COM. Delphi 必须按照 MS 的规范实现了 COM Interface.
VC++ 是 C++, 必须遵守基本的 C++ 语法, 所以把 COM Interface 用template和宏来弄累极了.
Object Pascal 是 Borland 独家拥有, 想怎么定义自己觉得好就行. 所以 Delphi 3 的
Object Pascal 中始见如下写法:
type
I组合音响 = interface;
I组合音响 = interface(IDispatch)
['{621D2E6A-E5E5-4919-8230-2E2EAB3CB38x}']
procedure play
safecall;
end;
T索尼音响 = class(TOleServer, I组合音响)
end;
class 后面的括号里可以写几样东西了.以前的 Turbo Pascal, Borland Pascal 可绝对不允许的.
这些东西就是 COM Interface. (导入/import type library 时自动生成)
Delphi 3, Delphi 4, Delphi 5 传了三代. 很多人对 Delphi 中的 Interface 认识仅限于此.
各位看官, 转眼到了 2001, 话说 Delphi 6 推出.我要郑重地告诉大家:
[red]Delphi 6 中的 Interface 已经由单纯支持 COM Interface 的性质转变
到 Java Interface 的性质. 而已经完全是Design Patterns 中所定义的 Interface[/red].
这是一场革命!
所以现在用 Delphi 6 做 COM/DCOM 用 Interface, SOAP 也用 Interface, CORBA 也用
Interface. 已经远不局限于 COM 了 [
]
我写得好累, 几次叉到如何调用 COM 的细节去, 又删掉回到 Interface 的主题.
终于写完了, 如有不妥, 敬请 cheka 等不吝指正.