关于Object Pascal中的对象和接口技术——BY CJ(200分)

  • 主题发起人 主题发起人 CJ
  • 开始时间 开始时间
C

CJ

Unregistered / Unconfirmed
GUEST, unregistred user!
Hello dear:

今天在看《Delphi4技术内幕》(Delphi4 Unleashed)一书的COM部分
由于对COM感冒,这是第四遍看COM了(不同的书),其中谈到了接口技术
的优点(Interface)。

的确是本好书,缺点更为明显——翻译质量不高(比CJ翻的好不少了)
也许是我理解能力的问题吧,始终不能理解接口其优越之处。

我理解本节(13.3.1,P433)的基本内容是要说明:接口为定义一组
对象提供了比传统OOP更好的方法。并且举例:
为一组机械风筝写程序,假定风筝有以下方法:

TKite = Class(TObject)
procedure Launch;
procedure Land;
procedure LetOutString;
procedure ReelInString;
procedure Swoop(Direction:TDirection);
procedure UnTangleString;
procedure FreeStringFromTelephoneWire;//faint:-)
end;

由于风筝设计实现不同,我们可以定义一个接口,从而不提供任何实现:

IKite = Interface
procedure Launch;
procedure Land;
procedure LetOutString;
procedure ReelInString;
procedure Swoop(Direction:TDirection);
procedure UnTangleString;
procedure FreeStringFromTelephoneWire;//faint:-)
end;

然后把它给程序员以实现,从而产生许多以相似方式运转且完全兼容的
对象,且表明:“接口是使“肤浅层次结构对象”文档化和进行设计的
简单方法”。

如果需要重用代码,可以使用中间类。

后来又开始阐述所谓“肤浅层次结构对象”的优越性:

TKite=Class;
TChineseKite=Class(TKite);
TVultureKite=Class(TChineseKite);//秃鹰风筝?
TTwoStringedVultureKite=Class(TVultureKite);

如果你负责实现TTwoStringedVultureKite类的Launch方法,你需要决
定<b><u>调用哪个版本的祖先方法,是TKite,TChineseKite,
TVultureKite还是TTwoStringedVultureKite?</b></u>,如果不进行有效
的猜测和实验,或看大量的源代码是无法知道的。

最后又强调了简洁易懂代码要比有趣的性能要重要和更容易学习。

问题:

1、以上黑体字部分,如何调用不同版本的祖先类的方法?请以本例,用
代码说明。

2、我还是不明白接口技术相对于OOP的优越处,我完全可以在祖先类中不
实现这些方法,而让子类继承并实现之,这不但灵活,而且提供了强大的
代码重用。请详细阐明接口技术在此类应用中的优点。


yours CJ
 
1.第一个问题试验如下:
但好像没有在子类内部判断调用哪一个祖先方法的,
一般者都是在外部完成的

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TKite=Class;
TChineseKite=Class;
TVultureKite=Class;//秃鹰风筝?
TTwoStringedVultureKite=Class;
TDirection= integer;

TKite = Class(TObject)
procedure Launch;
{ procedure Land;
procedure LetOutString;
procedure ReelInString;
procedure Swoop(Direction:TDirection);
procedure UnTangleString;
procedure FreeStringFromTelephoneWire;//faint:-)}
end;

TChineseKite=Class(TKite)
procedure Launch;
end;

TVultureKite=Class(TChineseKite)
procedure Launch;
end;//秃鹰风筝?

TTwoStringedVultureKite=Class(TVultureKite)
procedure Launch;
end;

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
var
flag:integer;

procedure TKite.Launch;
begin
showmessage('TKite');
end;
procedure TChineseKite.Launch;
begin
showmessage('TChineseKite');
end;
procedure TVultureKite.Launch;//秃鹰风筝?
begin
showmessage('TVultureKite');
end;
procedure TTwoStringedVultureKite.Launch;
begin
case flag of
1 : inherited;
2 : TChineseKite(Self).Launch;
3 : TKite(Self).Launch;
else showmessage('TTwoStringedVultureKite');
end;
end;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var tsvk:TTwoStringedVultureKite;
begin
flag:=0;
tsvk:=TTwoStringedVultureKite.Create;
tsvk.Launch;
tsvk.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var tsvk:TTwoStringedVultureKite;
begin
flag:=1;
tsvk:=TTwoStringedVultureKite.Create;
tsvk.Launch;
tsvk.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
var tsvk:TTwoStringedVultureKite;
begin
flag:=2;
tsvk:=TTwoStringedVultureKite.Create;
tsvk.Launch;
tsvk.Free;
end;

procedure TForm1.Button4Click(Sender: TObject);
var tsvk:TTwoStringedVultureKite;
begin
flag:=3;
tsvk:=TTwoStringedVultureKite.Create;
tsvk.Launch;
tsvk.Free;
end;

end.
 
thanx she,
你至少得到了50分//我怎么没想到这个?
17个人看了,就一人回答?过分了吧?
 
呵呵,你是智者千虑啊,难免难免
不过我觉得我的方法很土耶
对于接口技术我也很糊涂,不知谁来指点迷经?
 
谁叫你是CJ,
(瞪大了眼睛,向上看,作崇拜桩;)
想到了都不敢答!

(私下里问一个小问题:Faint是什么意思?是晕到吗?)
 
接口只是提供外界访问类的一种方法而已.
主要优点是不必知道该类的定义.
继承的话至少您得有原类的全部protected, public, published的定义.
 
崇拜?是虫白吧:-)

答呀答呀,faint==晕,别怕,EYES见多了。
eYes:难道接口的优点是:比抽象类更抽象?
 
com可以查询提供的接口, 所以您可以在根本不知道那个类是什么的情况下使用它.
继承的话您至少还得知道抽象类的定义吧?
 
我知道COM该那么用,我的意思是书上说不是COM用这个也有优越性。见上文
 
我觉得也就是M$发明的COM,因为是Windows的厂商,所以能和系统整合在一起
别的软件开发商那里有这个便利呀.
反正我觉得COM实在不是个东西,但还是不得不学它用它.
 
多人开发, 不知道别人类的定义. 或者过去的代码遗失了.
 
不知道类也要知道接口那不一样?代码遗失总要补呀
 
amo:这个问题你一定知道——100
我一看到这个,就想起了我想做的一个东西,要即插即用
也就是,我提供一个环境,其中具体实现有许多模块,功能一样,针对对象不同
如果用COM,能插上吗?如何搜索?
 
记得哪一种语言有个关键字super,指向自己的父类.
大概是VC ?
 
Java should has it
 
2、我还是不明白接口技术相对于OOP的优越处,我完全可以在祖先类中不
实现这些方法,而让子类继承并实现之,这不但灵活,而且提供了强大的
代码重用。请详细阐明接口技术在此类应用中的优点。

其实接口最大的优点在于简单,"接口是使“肤浅层次结构对象”文档化和进行
设计的简单方法", 所以如果你不需要进行扩展应用的话, 接口比类方法更简单,
代码量低, 程序更简洁.
个人观点.
 
接口实际上是一种二进制标准, 提供一种语言无关的组件开发方法.
用接口的 OLE Inplace edit, IDataObject, ICopyHook, IContexMenu,
跨网络, 跨平台等等
都体现了这一点. 这些都无法用简单的OOP实现.
 
接口把类给包装了。类是应用程序功能的实现,所以必然会导致大而全,而
接口是简单的,看看各个接口及其方法,都是很少的。
类喜欢采用深层继承关系,这样一来改变一个父类属性将导致一堆子类属性
的更新,但是接口可以申明而不实现,接口是不推荐深层继承的。
我觉得MS对COM的说明是正确的,我们用了接口后可以在对用户隐藏内部实现
的情况下面同时保护老功能还能使用,这也是光用类难以达到的。因为类就意
味着要实现新功能,更改老功能,中间没有用户界面层,这样不利于用户调用
与程序内部实现的隐蔽性(不对用户公开内部实现)。
 
COM里面包含了老的接口,又不断有新的接口加入,长此以往
也会变的大而全,不知各位对此有何看法
 
最近看报(计算机世界),北京工业大学的陈文博等是高手,认识的请通知一声!
 
后退
顶部