接口把类给包装了。类是应用程序功能的实现,所以必然会导致大而全,而接口是简单的,看看各个接口及其方法,都是很少的。
类喜欢采用深层继承关系,这样一来改变一个父类属性将导致一堆子类属性的更新,但是接口可以申明而不实现,接口是不推荐深层继承的。
我觉得MS对COM的说明是正确的,我们用了接口后可以在对用户隐藏内部实现的情况下面同时保护老功能还能使用,这也是光用类难以达到的。因为类就意
味着要实现新功能,更改老功能,中间没有用户界面层,这样不利于用户调用与程序内部实现的隐蔽性(不对用户公开内部实现)。
COM, VCL与ActiveX都是现代OOP编程的产物。它们的目的总的来说都是为了代码复用与程序开发与维护的方便。
VCL是Inprise用来包装WinAPI的。我们用可视化的方法把一个又一个的VCL控件放在窗口上面就可以以类的调用格式来调用它的方法,设置它的属性,并利用它的消息响应
来进行面向用户响应的开发了。但是VCL只能在Delphi与BCB中间使用,虽然我个人很喜欢它。
COM与其说是一个具体的对象,不如说是一个技术方案。它提供的是一个简单易用的用户界面层的概念,那就是接口(Interface)的概念。一个用户能够从
一个COM对象得到的只有接口。接口内部的类的实现是对用户隐蔽的。把实现与对外接口分开是一个对程序员和用户来说都不错的方案。对程序员来说他可以
完全不管用户会看到什么和希望看到什么(用户要求),因为这部分与他无关只与接口有关,他可以以任何自己方式来实现任何一个功能。用户看到的则永远是一个又
一个简单的接口(看看windows中的接口,每个都不是特别复杂,方便使用)。
要注意的是接口是不能继承的,虽然在很多编程语言中(如VC和Delphi等),一个接口被说成是从另一个继承的。而且在程序中间也是与其它类的继承简单的写成一样的形式如:
IMyInterface2 = class(IMyInterface1, Txxxx)
...
但是接口的继承只是表面上的,一切的功能实现还要类来!
继承在原来的意义上是要继承代码的实现以进行代码复用的,接口是没有实现的,因此接口的“继承”是假继承。
ActiveX控件是COM技术的一个具体实现。
作为一个ActiveX控件它要支持与实现一系列接口如IDispatch等等,一个正确的实现了MS对ActiveX控件要求的那些接口的COM
对象就是一个ActiveX控件。ActiveX控件是二进制兼容的,windows系统都支持,一般的编程语言都能在其中使用它。比VCL当然要用的广啦。
COM接口当然没有构造函数啦,只有COM接口的实现类有构造函数.
但是在Delphi里面你要用CreateComObject来创建接口的实现类.
要创建一个COM对象的实例最好在dpr文件中间调用,只有这样COM对象才能正确的初始化.
假设有一接口 : ITest = interface
[XXXX-XXXX-XX-XX]
procedure Test1 ;
procedure Test2 ;
end ;
另有一个类实现现了ITest接口
TTest =class (TInterfacedObject , ITest )
procedure Test1 ;
procedure Test2 ;
end;
在客户端:
var
o :TTest ;
inf :ITest ;
begin
o := TTest.create ;
inf := o as ITest ;//或 o.getinterface (ITest,inf);
inf.Test1 ;
inf.Test2 ;
end ;
我想问的是Interface inf是如何触发TTest.Test1 和Test2的 ?是靠名字吗,我猜应该不是,是靠位置吗 ?
delphi7编译器通过VMT,在机器码中产生从对象取得接口,然后再指定给接口变量的代码
这种使用方法容易出错,
在客户端:
var
o :TTest ;
inf :ITest ;
begin
o := TTest.create ;
inf := o as ITest ;//或 o.getinterface (ITest,inf);
inf.Test1 ;
inf.Test2 ;
end ;
而且不合接口与实现分离原则
你需要另外设计一个工厂,返回这个ITest接口对象供客户使用