Delphi 6 的 Interface(50分)

Y

yysun

Unregistered / Unconfirmed
GUEST, unregistred user!
Interface 是从 D3/D4 就有的,但是到了 D6 已经发展得如火纯青。
在 MS 方案中,Interface 是 COM 对象的基石,
在 Java 中,Interface 是 多重继承的替代品。

在 Delphi 中,Interface 是上述两者的结合。是用来开发和调用 COM 的手段,
也可以用来增强 Object Pascal 的语言功能。使得 Object Pascal 如 Java 一样可以
用 Interface 来实现多重继承的功能。
 
more please
 
本人是163用户,整整两个月没能上DFW.
connect www.delphibbs.com 就等至超时.
请问有没有代理之类的,能解决的办法....

出现这样的问题的恐怕不只本人一个.
我希望DFW管理员能重视.
期待早日在DFW上见.

对于发表的言论与问题无关,表示歉意.

 
这两天,我家的网费直线升高,为什么,因为大富翁好使了.真矛盾呀.
 
孙老师能否详细说说COM 的开发和调用
 
Delphi 6 的一个趋势是对 Interface 的应用. 现在 COM/DCOM 用 Interface, SOAP 也用,
CORBA 也用, 不同的协议最后都能统一到 Delphi 的 Object Pascal. 也就是说您用 OP 的 class + Interface
来开发您的 business logic, 通过不同的 Module - WebModule, COMModule, SOAPModule, CORBAModule
就能发布 CGI/ISAPI, COM/DCOM, SOAP Web Servie, CORBA ...
 
孙老师可不可以介绍写d6的使用资料,我现在想用d6开发b/s的校园网软件,
可是苦于找不到资料。

谢谢了
 
今天读 Design Patterns 文章的时候, 发现 interface 竟是 Design Patterns 理论
所推崇的第一大应用的原则:
Program to an interface and not to an implementation.

The idea behind design patterns is simple-- write down and catalog common interactions
between objects that programmers have frequently found useful.
 
more please
 
孙老师,是什么Design Pattern的书,能不能共享一下?
我的Mail:deadcandance_1@sohu.com
 
奇怪 ! 像 yysun 这等高人 怎么到现在来 了解interface 和 Delphi的关系?

interface 和 Delphi 的结合 是很早的事情了
 
deadcandance: 我找到书叫 DESIGN PATTERNS JAVA COMPANION, 1998, by James W. Cooper
这里下载: http://www.seforum.net/design/designpatternjava.zip

lha:提此问题, 是因为 D6 中 interface 的作用大大不同了.
戴帽子的 Dr. Bob 厉害不厉害? 他还没有全部弄清怎么回事呢.
http://www.drbob42.com/Delphi5/examin19.htm
我可从来不敢自称高人.
 
以前我在 CSDN 里 Java 版参与的接口讨论:

在<<thinking in Java>>中,Interface 是和Inner Classes 放在一起说的,
两者关系很紧密(并非是说Inerface只能指向Inner Classes的类).

建议好好看看该书的第8章的例子,如果你也曾读过<<VC++技术内幕>>(第四版)
中模拟COM的C++代码,会发现两者Interface(C++中表现为一个纯虚类)的使用
方法如出一辙.

我个人感觉接口在应用概念上与基类是有差别的,比方说有一个组合音响类,
那么"家电"是它的基类,而"CD机","功放"则是它的接口,如果一个用户只想使用
"CD机",那么他可以仅仅与"CD机"这一接口打交道(当然一定会存在整个音响的
对象实例,但对用户是透明的),这也是COM的基本原理.
 

补充,我认为接口和纯虚拟基类在技术实现上并没有差别
 
我来细说不同的 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 索尼音响::play() {
......
}
这里的组合音响必定是个类. C++中没有看到过 :
interface 组合音响 {
}

3. COM 中的 Interface
COM 中的 Interface 概念是独立于 C++ 本身语言概念以外的东西, 是为了方便不同语言
之间相互调用而设立的规范(用IDL来描述的, 存放于所谓typelib中). 看 VC++ 实现
Interface 用了很多 template 和宏来完成.
class C索尼音响: public 家电,
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<C组合音响, &amp;CLSID_组合音响>,
public IDispatchImpl<I组合音响, &amp;IID_I组合音响, &amp;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 索尼音响::play(){
......
}

您可以看到, 为了这个 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 等不吝指正.
 
大开眼界,谢谢孙老师讲的如此清楚
 
市面上有一本专门讲设计模式的书,不涉及具体语言,很值得一看
 
LeeChange: 那个帖子是我贴的。呵呵。
看完YYSUN讲的,清楚了不少。
1 类似与抽象类的作用。
2 可以实现类似与多重继承的功能。
3 INTERFACE的实现必须要有类来实现他的接口。
不知道理解的对不对?
另:在非COM程序里,接口方法要不要加safecall标志?
 
顶部