我的面向对象程序观 )面向对象概念的一些误解 面向对象是一个如今被人叫烂的词汇就像去年人们都喜欢把自己的公司打上的标记一样其实有多少人能真正理解这个词汇呢很难说我喜欢这样来比喻人们对对象一词的滥用对象就好比人们经常说的酷和爽很多人并不仔细考虑这两个词的差别在很多情况下他们是通用的酷和爽通常表达心情不错的意思你可以在你玩的高兴的时候大声的叫嚷太酷了太爽了这个时候两个词汇是通用的但是你可以说这个人很酷啊但是你不能说这个人很爽啊人们对对象这个词汇的滥用就发生在这里面向对象和基于对象就好比酷和爽这是两个不同的概念但是人们通常将这两个词汇混为一谈一律用面向对象来表达常见的错误可以在此列举一些 )有个人兴高采烈的和你说我不喜欢 flash 的脚本语言flash 版本的 action script 采用了新的面向对象的语法写起来很舒服我现在一直用 flash 来做东西(同样的话语也发生在 director 的 lingo 脚本语言中) )visual basic 采用了面向对象的属性和方法比起过去的 basic 语言有了很大的提高 )javascript 是面向对象的 等等 通常听到类似的话你都要认真审视说话之人分析他说的话可以肯定一点他并非真正懂得什么是面向对象的思想很多人没有区分面向对象和基于对象两个不同的概念面向对象的三大特点(封装继承多态)却一不可通常基于对象使用对象但是无法利用现有的对象模板产生新的对象类型继而产生新的对象也就是说基于对象没有继承的特点而多态是表示为父类类型的子类对象实例没有了继承的概念也就无从谈论多态现在的很多流行技术都是基于对象的它们使用一些封装好的对象调用对象的方法设置对象的属性但是它们无法让程序员派生新对象类型他们只能使用现有对象的方法和属性所以当你判断一个新的技术是否是面向对象的时候通常可以使用后两个特性来加以判断面向对象和基于对象都实现了封装的概念但是面向对象实现了继承和多态而基于对象没有实现这些的确很饶口 )java 比 C++在贯彻面向对象的思想方面更加彻底 我最近上的学习班的老师对我说C++ 是打着面向对象的幌子干着过程编程的勾当这句话我非常的赞同而且我一直以来也是这么认为的但是仔细听他讲解后我才发现我是只是理解了这句话前两层的意思但是还有一层意思我没有理解你可能要问难道 C++ 不是面向对象的吗?事实上 C++ 是真正的面向对象编程语言但是它也是过程编程语言为什么怎么说呢 C++ 的产生不但考虑了面向对象的特性而且也更多的考虑了对 C 语言的向后兼容使得 C++ 这种杂合语言表现出过程和对象编程的双重性你通常既可以继续用 C++ 编译器来编写传统的 C 程序也可以使用 C ++ 的类库或者编写自己的类来作面向对象编程这种两面性使得人们可以继续保留原有的 C 代码同时也阻碍了面向对象思想的推广 举个简单的例子 年的时候我开始学习 C++ 当时是学习 turbo C++ 自己带的一个叫作 turbo vision 的类库来做项目我的同学也用 turbo C++ 但是他一点也没有学习过 C++ 这个语言他只是用 turbo c++ 编译器来重新编译他以前用 turbo c 写的程序然后他自豪的对我说瞧我用 c++ 做的东西好像意思是说我用 c++ 开发项目了在那个 c 比 pascal 高档 pascal 比 foxbase 高档的年代里 C++ 的标签绝对是个很酷的标志我其实很清楚他的行为这就是C++ 是打着面向对象的幌子干着过程编程的勾当的第一重意思也就是说 C++ 编译器对 C 程序的兼容性造成了最底层的过程勾当在国内有很长一段时间人们都是在用 C++ 编译器做 C 编程 我当时在想比起我那个同学我才是真正懂得面向对象的人 我学习了 C++ 语言我懂得封装继承和多态我学习了 turbo vision 的类库我派生了 turbo vision 的类库并编写了自己的类所以我是懂得面向对象的从某种意义上说我这么想是对的但是从面向对象程序员的分类来说我又不完全懂得面向对象的思想从事面向对象编程的人按照分工来说可以分为类库的创建者和类库的使用者通常创建类库的人才是真正懂得面向对象思想的人他们创建类库供给那些客户程序员来使用他们从头开始制作类库他们进行面向对象的分析设计实现的全过程当学习完 C++ 后我的第一个感觉是从头创建一个类库真是很麻烦的事情通常用 C 过程编程很容易实现的功能你必须按照类的思想来从新建立对象但是一旦类库建立好后使用类库和派生类以及维护代码都是非常舒服的事情使用类库的人并不都是具备了面向对象思想的人通常知道如何继承和派生新对象就可以使用类库了然而我们的思维并没有真正的转过来使用类库只是在形式上是面向对象而实质上只是库函数的一种扩展这就是我理解的C++ 是打着面向对象的幌子干着过程编程的勾当的第二重意思实际上用 C++ 编程的人大部分不自己创建类而是使用类库这样就造成了他们把类库作为一种高级的库函数库来理解并没有真正理解面向对象的思想 C++ 的面向对象的思想推广很慢直到 MFC OWL VCL 这样的类库出来以后人们才渐渐的接受了一些面向对象的思想为什么这条面向对象的道路那么难走?我的答案是因为 C++ 给了我们第二条道路去走过程编程当然原因是为了考虑兼容 C 语言然而正是由于有了第二条老路才使得使得我们不会再去考虑新的面向对象编程思维方式 直到出现了 Java 才真正迎来了面向对象的曙光Java 真正是革命性的东西吗?不是所有现有的 java 的思想都是继承自其他的语言和技术没有什么革命的地方虚拟机的概念早在 年前的 UCSD pascal 中就采用了只是当时的机器速度太慢虚拟机仿真造成的性能降低对于当时的硬件来说是相当严重的java 本身的很多东西也借鑒了 C++ 语言连它的创始人也说java 是 C++ 也就是说 java 去除了 C++ 的一些不太好的地方所以说 Java 本质上没有什么革命的东西所以那些对 Java 的赞美之词都是 Sun 公司的宣传伎俩没有一种语言会长久的存在下去你很难说你的孩子在二十年后还会继续使用 C++ 或 java所以我们要抛开这些浮华词汇的背后找寻真正我们需要学习的东西否则今天我们大家都是微软的傀儡明天 Sun 公司起来了我们就都是 Sun 的傀儡仔细研究美国电脑技术发展的历史美国人一向喜欢象第三世界兜售他们的过时技术而他们始终可以自豪的说我们将永远领先你们第三世界国家二十年我们始终在跟在美国人的后面学习他们的东西这的确让人担忧我说着说着又跑题了 Java 虽然没有什么真正的革命性的东西但是 Java 在真正推动面向对象编程思想方面是功不可末的使用 Java 编程你无需考虑到向后兼容什么语言的问题它是重新建立的语言你在掌握这门语言之前你必须将自己的编程思想由过程编程彻底转向面向对象编程因为 每个 Java 程序本身就是一个类你编写任何 java 程序你都不自觉的在构造一个对象模板没有第二条道路只能是面向对象编程( 我非常喜欢 java 将所有类定义和类声明放在一个文件中而不是象 C++ 那样cpp 和 h 文件是分开的通常刚刚开始学习 java 的人不习惯不过学习一段时间你就会体会到它的好处了) 使用 java 编写程序(我更喜欢说编写类而不是程序)的时候你会必须从一个对象的角度来考虑问题因为你的程序就是一个类你必须考虑把哪些东西作为成员变量哪些作为方法要生成几个类哪些变量是成员变量哪些是静态的变量和方法等等通常做完一个项目你就已经将面向对象的思想运用其中了之所以说 Java 在面向对象的贯彻方面要比 C++ 彻底就是因为你只能使用面向对象的方式来编写 java 程序而 C++ 却可以采用另外一条非面向对象的方式来编写程序Java 并没有什么真正革命性的东西它最大的贡献当然是推广面向对象的思想了 Java 总的来说是降低了继续过程编程的可能性但是并没有完全消除它面向对象是一种思想是我们考虑事情的方法通常表现为为我们是将问题的解决按照过程方式来解决呢还是将问题抽象为一个对象来解决它很多情况下我们会不知不觉的按照过程方式来解决它因为我们通常习惯于考虑解决问题的方法而不是考虑将要解决问题抽象为对象去解决它很多新的技术使我们更加趋向于过程而非对象的思想最明显的就是 RAD (快速应用程序开发)可视技术的出现人们可以通过设置属性和编写事件函数来快速开发应用程序编写事件函数就是典型的按照过程编程的思想(至少我是这么认为的)试问有多少人能区分VB 和 delphi c++ builder java 的事件函数编写有什么本质的区别 后三者都采用了 Delegation (委托模型)在 java 中是通过 anonymous 类(无名类)或者 Adapter 类来实现Delegation这是一种面向对象的构想但是 VB 不是所以这底层的区别都被上层的相似性所抹杀了使用 jbuilder 编程的时候我们如果没有仔细研究 java 的 awtevent 编程方式的话通常也是把它当作普普通通的类 VB的编写方式来写程序而实际分析它在后台所生成的代码你才能明白这些代码是真正的面向对象的但是如果你只是简单的把它当作可视编程工具你是永远不会明白什么是委托模型什么是面向对象编程的这是我理解的 C++ 是打着面向对象的幌子干着过程编程的勾当第三重 |