|
阅读:1063回复:0
一个C++程序员的Delphi学习笔记
一个C++程序员的Delphi学习笔记
说心里话,站在一个C++程序员的立场,是有那么一点看不上用Delphi的开发者的。就几周前,我还撰文维护过C++的尊严。种种原因,今天我却须学习Delphi、熟悉Delphi,不由兴起人生无常的感慨。 我给了自己十五天的时间,不知够否掌握一门语言?我选择了Marco cantu的《Delphi从入门到精通》及《Delphi高级开发指南》作为学习用书。第一本书名叫《从入门到精通》,但如果你不熟悉一门OOP语言,那这本书不合适你。对我,则正合适。二书总厚度共一千五百页,嗯,一天一百页就差不多了,希望自己能做到吧。 我决定如实记下自己的思考与困惑,做为自己进军新领域的记念,也希望能为后行的同路者提供一点帮助。 一 环境 "工欲善其事,必先利其器",对开发环境的熟悉是非常重要的。不同于VC的MDI界面,Delphi采用了多个独立窗体设计。这是否预示Borland更提倡组件间进行对等的交互?我暗暗猜测着。 1.Desktop设置是可以与Project分离的,而且Desktop设置优先于Project设置。 2.To-Do列表无论是用于提醒自己还是别人,都是好工具。 3.AppBrowser感觉上很相似于VC的主界面。也提供了符号提示,Code Completiont等功能。嗯,还有VC所没有的Class Completion,可以在声明和实现间双向自动补完。 4.Project Group的概念,有点像.net平台中的Solution,不过.net是多语言协作的。 二 语言 Delphi的核心是VCL库,其基础是Object Pascal。《从入门到精通》用两章的篇幅细说"Object",却只字没有提到"Pascal"。嗯,还好,我隐隐记得。 1.Use用于引用外部单元。与头文件不同,Use没有传递性。 2.Delphi使用引用对象模型,对象变量只持有对象引用,不再持有对象本身,所有对象手动自堆中分配。 3.Delphi的封装很奇怪,类成员访问权限的设定,只对单元外部起作用。在单元内,可以自对象外部任意访问类私有成员。朋友解释说相当于C++的友元,细想其实差异很大--友谊一定是双向的吗?(将Unit方式用作友元,A能访问B,B一定能访问A)友谊有传递性吗?(将Unit方式用作友元,A能访问B,B能访问C,A一定能访问C)。在我看来,这和友员的概念是不相容的。希望某天我能明白Delphi如此设计的考量。 4.在声明对象变量后,Delphi对象的实际生成需调用构造器。构造器是特殊的类方法,自TObject继承并可重载。不使用关键字而用类方法构造对象,我认为这是单根继承的特有用法。 5.书中有一段动态创建TButton的例子,使用Creat创建了对象,却没用Free显式的释放 。我疑心会发生内存泄漏,细细想来,该是由持有TButton的容器TForm来负责释放,朋友证实了我的想法。Delphi以此避免了手动释放内存的麻烦。 6.Delphi的关键字很烦,长而多,要键入的地方也多。好处是能为编译器提供更多的信息,用以查错和加快编译速度。 7.因着引用对象模型,不再有C++中直接对象访问无多态,只在指针和引用下多态机制才起作用的问题。 8.用message直接指出方法可以处理的事件,唉,让我想起OWL时Borland对C++语言的相似扩展,真是怀念。 9.大量使用动态类型转换,该是Pascal本就具有的特点吧? 10.窗体继承,好像连控件的属性都可以继承呢。 11.很奇怪的设计。有类方法,却不提供类变量,需用Unit级的变量来模拟。 12.如果我的猜想不错,控件的Events应该就是"对象方法指针"。 13.极强有力的机制:类引用,可用相同的形式动态建立不同的数据类型。C++中相似的能力,怕要用Builder模式才行。 14.参数对象按引用传递,按引用赋值,只有部分类提供Assign方法复制对像。唉,C++的值语意,好怀念。 15.Finally块!解决了C++中好些需高度技巧的资源释放问题。但为什么不能和except一起使用?不太明白。 16.属性和事件??真是为VCL量身定制的语言啊。其实属性和事件并非面向对象的必要元素。 17.我想VCL事件处理的委托模型,该是与JAVA相似的。只是Java的Listener可以处理多 个Listener的存在,Delphi的事件属性好像只能处理一个吧?不过处理速度上要快多了。 18.a)从TComponent类继承,b)新构造程序,c)例行的Register,d)安装。VCL组件创建的方便,真让人感动。 19.书上说VCL优于ActiveX,因为ActiveX没有完全的继承机制,我不敢苟同。聚合该是先于继承选用的机制。 20.Interface,丑死了!!我甚至怀疑这是否Hejlsberg的设计。完全像是为Com支持临时拼凑的语言成份,与整体毫不协调,像个外来户。接口本身是强大的东西,但糟糕的设计会让它的使用成为一种痛苦。除了COM和多重继承没有选择外,我想是没人愿意用它的。 整个来说,Object pascal给我很深的映象。接下来就该学习VCL了,且看Borland是如何将这种种语言的成份,组装成为开发的利器。(续待) -------------------------------------------------------------------------------------------------- 对该文的评论 zzlyfirst ( 2001-9-19 12:56:37 ) 工具或是语言不是绝对的,关键还是使用者的能力, 精通一门语言就够了,但delphi不会让你失望的,你漫漫回知道, 他的优势在生产效率 k2 ( 2001-9-19 11:03:53 ) 听课来了。 IAmKylix ( 2001-9-19 9:16:09 ) 我是学了Delphi之后学的C++,觉得差不多,说实话学C++的时间比Delphi的时间少得多,不是因为C++简单,而是Object Pascal和C++在本质上没什么太大的区别。 现在我不用Delphi了,但我觉得工具或是语言不是绝对的,关键还是使用者的能力。 edd ( 2001-9-19 0:49:56 ) 需要这么认真学吗?我到一个新公司,叫我用c++builder(和dephi大同小异),我以前就用过vc和gcc,不一样的作吗,根本一本书都不看,就看帮助和到这里提问,叫我做的东西,我不比那些一直用c++builder开发的人慢多少,15天我觉得时间还多了。 Borland_Delphi ( 2001-9-18 22:17:03 ) 16.属性和事件??真是为VCL量身定制的语言啊。其实属性和事件并非面向对象的必要元素 - 不敢苟同,呵呵 Dream_soft ( 2001-9-18 21:59:30 ) 这么多朋友关心,实在让人感动啊。谢了,各位。 其实十五天是自己给自己订下的时间,看来是完不成了。这不,都四天了,才学到窗体:)。我是一边学习一边写笔记的,所以会有很多理解上的问题。请懂的朋友指出来啊,我会学下去,也会写下去的。 to qinghou: 的确,聚合不可能完全代替继承,但在两者同时适用的条件下,应该选择耦合较为松散、封装更为完全的聚合。 to sas: 只是表达一种理解,没有说Delphi学Java的意思。如果你要看到我前几周写的比较文章,那还不给气歪了(开个玩笑,不过可以在我的站点www.hisee.net看到。) 其实InterFace作为一种语言本身的特征,是不应该同所支持的技术相混杂的。如果Delphi只支持Com,可以这样设计,没问题,因为用的人都知道QuaryInterface是什么。但如果是Corba程序员,是不是也得知道Relese和引用记数?? 我个人认为,做为通用特征的语言,如果过多同所支持的某种技术相混杂,对语言本身的纯一性是有影响的。对某一特定技术的便利,不是导致对相异技术支持的笨拙,就是因重复支持而导致复杂性。 我想,这种权衡应该存在所有工程领域,不单单限于程序设计。在数学上来说,这就是不美。爱因斯坦追求大一统,也是为了避免混杂的丑啊。 linghuye ( 2001-9-18 20:07:12 ) 我也是学了VC后再学Delphi的,Delphi确实不错,就是帮助文件太差劲了,而且老爱弹出红叉框来吓我。 由于不熟悉Delphi自身的函数,我在Delphi里频繁调用API,这种感觉有点怪。:) 还有,VC与Delphi的调试,设断点 F5,F9 刚好相反,脑筋换不过来。:) sas ( 2001-9-18 20:03:55 ) 继续评论: 1、Java的Package和Object Pascal的unit可以说概念上面完全相同。但是你要想一想,Turbo pascal4.0,是什么时候,Turbo pascal4.0->5.0->5.50->6.0 -> Borland Pascal(7.0) -> Delphi1(8.0),到Delphi1出来的时候才有Java。 2、定义Interface不需要IIID,使用Interface ID的目的一个是使用QueryInterface,另外一个目的是为COM。但是如果你的应用和COm无关,那么完全可以不定义Interface ID。 3、Object Pascal的Interface也用在Cobar。 4、使用Interface的时候,一般使用引用计数的形式管理对象生命周期,引用计数为0的时候,对象被自动释放。Delphi可以自动对interface引用计数。另外也可以不使用引用计数的形式管理对象生命周期,有兴趣的可以看看online help。 5、To-Do 在Delphi5增加。 6、unit里面不限制访问,很方便,比友元的形式简单多了。 Focus ( 2001-9-18 18:07:02 ) 确实不错 绝对高手 admire 我学了好久 只是会用而已 没有上升到这么高的理论高度 也许是因为书看得少吧 rocks_lee ( 2001-9-18 13:47:16 ) to-do是Delphi6的新特性好像。 我也正在学习Delphi,不过我C++肯定没有诸位的娴熟了,但java我是很拿手的,看起Delphi来也觉得很亲切,只是Pascal的语法快忘光了,老得查帮助,真衰:( handsome1234 ( 2001-9-18 13:03:05 ) 请问“To-Do列表”是什么啊,我在delphi里没看到啊 wantme ( 2001-9-18 10:33:22 ) C++程序员学DELPHI,就象大学生去学算数一样简单 wk_knife ( 2001-9-18 9:54:45 ) 我刚明白,是倒着看那 wk_knife ( 2001-9-18 9:32:26 ) Delphi中就没有“友元”这个概念,为什么非要把C++的一套完整的照搬呢?仔细看书的就会明白,Macro Cantu 也只是打了个比方。 wk_knife ( 2001-9-18 9:25:13 ) 前些日子,有心学习VC,借本书来看,看到DDV(好象有这么个东西吧)传递对话框的内容,照例子输好后,运行,满意之余,想给Static Text的值也照搬一把,结果无论如何也不行了。后来另翻一本书。哦,好不容易翻到个Updatawindows(如果错了不要介意,你明白就行)才搞定, 我是很笨,VC似乎天生就不是让笨蛋来学的。所以就不学他了。 我是初学者,很有幸也得以找到Dream_soft 所说的两本书。对于CProgramer 和Dream_soft关于友元的问题,我想如果仔细阅读了Macro Cantu的《Delphi高级开发指南》并不会有此疑问吧。更何况Delphi中就不存在友元的概念,Macro Cantu之所以如此说,不过是为了让C++程序员们比较容易理解。 wao ( 2001-9-18 8:41:22 ) 12.如果我的猜想不错,控件的Events应该就是"对象方法指针"。 错了。event实际上是一个闭包指针(closure).就是说这个指针包括:对象指针和方法指针。 Phoenix2000 ( 2001-9-18 8:03:59 ) 不管 Interface 是不是为 COM 而特意设计的,不得不承认 Interface 确实是个好的设计,它对 COM 有着天生的良好的支持,但并不仅仅局限于在 COM 中使用。我真希望 C++ 里也能有这样的新的扩展。 lslxch ( 2001-9-18 2:47:57 ) 我是从C开始学Delphi的,刚好这两本书也是我的入门教材。 Delphi的封装刚开始也觉得奇怪,但是用得多了也习惯了。其实接口部分是对整个程序公开的,包括class中的一部分和var部分,实现部分在同一个UNIT中都可访问。这种封装很方便,只是命名空间太大,需要仔细选择符号名称。在类中可以申明类变量。 type Tuser = class(TObject) b: TButton; private i: integer; end; 3nt ( 2001-9-18 1:09:53 ) unit是从ada学来的。 programhunter ( 2001-9-18 0:35:44 ) Delphi,那C++ BUILD又是如何去评价它呢。它们都是出于同一个娘胎的,而且有双生兄弟的说法。 shiqinglangzi ( 2001-9-17 23:41:56 ) 厉害!厉害!这么短的时间能学成这样不愧是个高手,,我学了一年的delphi 数据库还是那样菜!!不知道大家有什么捷径可走啊??请指点喔!!谢谢!!! kundeng ( 2001-9-17 22:56:22 ) 没错没错,Delphi 1.0的主设计师就是Hejlsberg,他同时也参与了对SUN JDK1.0的设计。 Internet开发群体均承认JDK 1.0是Borland为主写的,SUN的工作是在Borland编译器工程师 的指导下写外围库。其实这个工作后来又被IBM做了一遍,他们写的库比SUN工程师要好多了。 据李维说,Borland的工程师许多来自北欧,是公认的最有创意的一个开发群体。我非常 认同这个说法。 alias ( 2001-9-17 22:28:52 ) 我也来凑凑热闹,delphi已经用了挺长时间,但和各位比起来还是不行。我是由delphi开始学编程的,应该谢谢它的好用和上手快的特点。当然其副作用是容易给人一种精通的错觉,但用它做小的MIS真是方便。现在我正在学VC,它让我对编程的认识又深入了一层,又感到头大,太多的类像蜘蛛网一样。哪位大虾能告诉我如何在VC中实现DELPHI中DBGRID+TABLE+DATASOURCE的功能。我想说:DELPHI一定要用,VC一定要学。也希望大家多多指点。谢谢! 我的信箱:[email protected] qinghou ( 2001-9-17 21:31:17 ) 3、我觉得这是Delphi里的一个败笔。在论坛上讨论过,有人说Borland这样做也是有原因的,但我至今不知道什么原因。 12、你猜得没错: type TNotifyEvent = procedure (Sender: TObject) of object; 13、然也。:-) 15、很多人提出过这个了,但在Delphi6中仍然没有改进,让大家都失望了。:-( 19、聚合该是先于继承选用的机制。为何?我觉得聚合是不可以取代继承的。 20、我不觉得Interface有何不便啊。你说的那些确实也没错,是有很重的COM的痕迹。据说D6中对Interface有很大的改进,我还没仔细学习。 “C里面为了禁止头文件被包含两次进行的很龌龊的宏定义”,说得好,说得好:-) 有这么一种说法,说Delphi和Java的主设计师为同一人,Sun其实是在Borland的帮助下设计出Java的。不知是真是假,不过感觉Delphi和Java确实很象。 Dream_soft ( 2001-9-17 20:42:14 ) 谢谢sas:) 其实我知道Interface与com无关。但在语言设计时将[234234-1234-1234]这样的形式引入,在Creat一个Interface时不用Free方法这些设计,明显是为Com与设计,所以我说他设计的不好,与整体毫不协调。 其实unit有点Java的package的味道,不是吗? budw ( 2001-9-17 20:29:53 ) 呵呵, 用得越多,你就越会爱上她 当然记得到时常怀念C++;) sas ( 2001-9-17 19:42:27 ) 1、Delphi的Interface和COM无关,可以完全独立开来。在Kylix(Delphi for linux)上面也有。 建议你多看看Interface方面的说明 2、在相同unit里面访问类元素的域(field)和方法是没有限制的,简化了复杂的定义。一个unit里面的各个类在逻辑上应该是高内聚的。毫无关系或者关系不大的类,没必要放在一起。在概念上面和友元相似,但是使用简单。 3、pascal的关键字本身就比C多,体现的是易读的感觉,相对而言,C的风格喜欢使用符号,一个程序块block,pascal使用begin end, c 使用 {};与运算,pascal使用and,c使用&&。 4、仔细体会一下unit的概念,这是很多年前从turbo pascal开始有的,很漂亮,清晰的声明部分、实现部分、初始化部分的划分。从某种意义上单元和类的概念相同,不过层次更高。比C使用包含文件#include好了很多。大家想一想C里面为了禁止头文件被包含两次进行的很龌龊的宏定义。下面来自微软的windows.h: #ifndef _WINDOWS_ #define _WINDOWS_ .... #endif /* _WINDOWS_ */ foxnt ( 2001-9-17 19:27:14 ) 好极,一个C++程序员能在15天学到这样,的确是很认真。阁下水平确实不错,值得敬佩! CProgramer ( 2001-9-17 18:35:02 ) 3.Delphi的封装很奇怪,类成员访问权限的设定,只对单元外部起作用。在单元内,可以自对象外部任意访问类私有成员。朋友解释说相当于C++的友元,细想其实差异很大--友谊一定是双向的吗?(将Unit方式用作友元,A能访问B,B一定能访问A)友谊有传递性吗?(将Unit方式用作友元,A能访问B,B能访问C,A一定能访问C)。在我看来,这和友员的概念是不相容的。希望某天我能明白Delphi如此设计的考量 我也不明白,当初我看书怎么看也不明白! classfactory ( 2001-9-17 14:41:01 ) Interface可是个好东西。 fly_lee ( 2001-9-17 14:33:16 ) 这才是会学语言的人! EdwinYeah ( 2001-9-17 14:23:30 ) >>15.Finally块!解决了C++中好些需高度技巧的资源释放问题。但为什么不能和except一起使用?不太明白。 就是就是! Nizvoo ( 2001-9-17 13:25:15 ) 我想这位兄弟为什么要来delphi实在搞不懂。 _______________________________________________________________ 多多交流 共同进步 [email protected] http://nizvoo.myrice.com _______________________________________________________________ 转载于[a]http://www.csdn.net[/a] [ 2001-9-19 14:40:10 Admin 修改 ] |
|
|