面向对象的本质是什么?
什么是面向对象的本质呢?
万物皆对象?No
抽象?No
复用?No
那到底是什么呢?
万物皆对象。问了几位网友,这是答复之一。看到了某个事物就来一个class?显然没有那么简单。至少也要抽象一下呀。
抽象。比如一些文章里说,可以根据猫猫、狗狗抽象出来一个Animal出来,然后定义Cat,继承Animal,在定义Dog,也是继承Animal。抽象就是本质了吗?那么为什么要抽象,而不直接定义Cat、Dog呢?这么“折腾”一下的目的是什么呢?或者说有什么好处?
复用。Cat可以复用Animal里的属性、方法等,Dog也可以复用Animal里的属性方法。这样看来复用好像就是本质了。
哎,说道复用我就比较郁闷。我是从面向过程学过来的,经过漫长艰苦的学习,现在还没有完全转到面向对象。好像跑题了。
面向过程里就解决了复用的问题,定义一个过程(过程、函数)就可以达到复用的目的。别人有的,你也有,那不算什么优势。别人没有的你有,那就是优势了。既然面向过程已经可以服用了,那么在面向对象里面也谈复用,那还有什么优势呢?
面向过程可以达到复用的目的,但是有一个致命的缺点:混乱。定义出来的函数没有层次,没有管理。假设一个项目里有一万个函数,那么这些个函数就会杂乱无章的出现。要管理的话也只能按照页面、窗体等来划分。总之呢,想要管理好面向过程里的众多函数是一件头痛的事情。
我觉得面向对象是有面向过程“进化”过来的,但是有人说面向对象是直接“蹦”出来的,不管他是怎么出来的了,总之他是很好的解决了“管理复用”的问题。
封装(Class):把相关的属性、方法、事件放在一起,化零为整,统一管理。该隐藏的隐藏,该暴露的暴露。这是管理的第一步。
====================
继承:都封装起来了,那么就失去了灵活性。如何保证灵活性呢?继承(还有函数重载等)。也就是多态了。相同的放在父类,不同的放在子类。这是我的理解,当然你可以说这种理解是错误的。Class就好比一个大的家族,父类是根基,子类各有各的特点。正所谓:龙生九子各有不同。
子类可以复用父类里的属性、方法、事件,这就是一种复用的管理方法。
组合(合成):父类、子类、抽象基类,这些都是一个家族里的关系,那么两个家族有如何呢?组合。Has A,一个类里包含另一个类,通过这种方式来实现复用。这又是复用的一种管理方法。
接口:抽象基类是一个很好用的东东,比如DbCommand,用过的兄弟们都会体会到他的方便吧。但是他只能管同一个家族里的,另一个家族的就不行了。如果哪个数据库(比如PostgreSQL)没有继承DbCommand怎么办呢?接口就可以跨越不同的家族。当然接口也有一个致命的弱点,本身不能有任何的实现部分,他只能定义。
面向对象的各种特点都是为了“管理复用”,所以我觉得面向对象的本质就是“管理复用”。至于对象只是一种“表象”。
在多说几句,我是不喜欢被所谓的“对象”所束缚的。以前问过,SQLHelp为什么要写成静态函数的形式,答曰:数据访问是一个对象吗?怎么实例化呢?
我觉得数据库就是一个对象,数据访问也是一个对象。数据访问就是数据库的一个“代言人”。我的数据访问函数库就是以DbCommand为中心人物,用起来非常的方便。
发表于 @ 2010年02月08日 22:06:00 | 评论( 43 ) | 编辑| 举报| 收藏
旧一篇:【自然框架】稳定版beta1的Demo —— 四:角色管理。另外 在线演示 终于搞定了 | 新一篇:刘谦魔术的一个秘密 硬币穿越玻璃的那个。
查看最新精华文章 请访问博客首页相关文章
软件设计/编程的基本技术(附图)java之旅(8)复用类 (续)代码复用的规则代码复用的规则类在继承中的复用[转载]代码重复规则一点感想理解C++基类与派生类bidong77 发表于2010年2月9日 11:10:17 IP:举报回复删除
匿名用户 发表于2010年2月9日 12:09:29 IP:举报回复删除
本质就是相比此前的面向过程编程对项目的完成更方便一些。应用的本质一切一切就在于更好用。除此之外,没什么其他的本质不本质。这也是c语言自问世以来屹立不倒的原因。匿名用户 发表于2010年2月9日 12:36:31 IP:举报回复删除
为了避免在逗宠物狗玩的时候,一不小心逗狠了,那宠物狗吠出一声“喵~~~”。baqiu 发表于2010年2月9日 12:49:01 IP:举报回复删除
嗯easypal 发表于2010年2月9日 12:55:46 IP:举报回复删除
复用从来就有的. 在面向过程的时代, 复用代表着函数; 在面向对象的时代,复用代表着类. 复用是个永恒的编程问题. 呵呵,我在书上看的.healer_kx 发表于2010年2月9日 13:12:26 IP:举报回复删除
可复用性是任何时代的追求,汇编也要讲究复用啊,就算有一天,用自然语言编程了,也会追求复用的。再者,从函数,到类,到模块,到平台,都需要可复用性。所以我支持楼主,面向对象的本质,肯定不能包含可复用性的。匿名用户 发表于2010年2月9日 13:21:37 IP:举报回复删除
看看这篇文章,再谈啥是面向对象: http://blog.csdn.net/hoping/archive/2010/01/09/5164194.aspxLoongson2009 发表于2010年2月9日 13:26:04 IP:举报回复删除
我只对面向对象有较浅的理解匿名用户 发表于2010年2月9日 13:57:14 IP:举报回复删除
楼主和我以前一朋友的观点很像嘛 不过我朋友的话更直接他说面向对象就是"."出来的 哈哈匿名用户 发表于2010年2月9日 13:57:29 IP:举报回复删除
面向对象是一种数据抽象方法,抽象是一种应对软件复杂性的有效手段,仅此而已。yutao051 发表于2010年2月9日 16:23:45 IP:举报回复删除
我老师讲过,面向过程的时代是常量变量化,面向对象的时代是方法变量化,这就是面向对象的本质。wanghl521 发表于2010年2月9日 19:44:43 IP:举报回复删除
匿名用户 发表于2010年2月9日 21:10:45 IP:举报回复删除
面向对象唯一本质就是能让你从更高的知识层面去理解事物的关联,解决更复杂的问题. 匿名用户 发表于2010年2月9日 21:10:47 IP:举报回复删除
从实用的角度简单的说来,Stroustrap先生称发明C++的时候并没有先弄出一个标准,他的目的在于改善已有的C以适合更大规模的编码。显然他是以工业界的问题解决者,而不是从学者的角度提出一个什么理论。匿名用户 发表于2010年2月9日 21:28:32 IP:举报回复删除
回复 匿名用户:美国式的实用主义啊。
sld009 发表于2010年2月9日 21:56:46 IP:举报回复删除
其实编程最重要就是以人为本,我猜“老子”才是编程的高手。。。。呵呵 supermanofChina 发表于2010年2月9日 22:21:05 IP:举报回复删除
S Joinzheng 发表于2010年2月10日 8:40:04 IP:举报回复删除
还是实用为主吧,Officesystem 发表于2010年2月10日 8:48:30 IP:举报回复删除
回复 Joinzheng:比较同意
kaven2762 发表于2010年2月10日 9:03:30 IP:举报回复删除
面向对象的本质就是面向问题,该问题就是程序要描述的东西都是现实世界的东西,现实的东西都被人理解为对象和对象之间的关系。因此面向对象解决的就是这些问题。还有,为了更好的利用电脑,程序员把电脑的软硬件等底层进行了一层一层的封装,最终封装到“对象”一层,就是为了应用级程序员能更好的利用这些以对象为形式的API。因此,如果我们的问题是数据管理,那么就应该使用pl/sql存储过程;如果我们的问题是处理各种文本文件,那么我们就应该使用perl;如果我们主要要做网页行为,那么我们就应该使用javascript。总结来看,我们需要的仅仅是面向问题。问题如果是对象建模,那么我们就需要使用面向对象的语言。wmnothing 发表于2010年2月10日 9:24:58 IP:举报回复删除
我觉得面向对象的结果应该是实用,理论是为实践服务的。 现代工程中遇到的是“变化”,面向对象要能封装变化。lw474580248 发表于2010年2月10日 9:30:38 IP:举报回复删除
匿名用户 发表于2010年2月10日 9:31:44 IP:举报回复删除
我觉得面向对象就是让开发人员能够以用户可以理解的语言描述问题,并能很方便的将这些描述转换为机器能够运行的程序。它只是给最终用户,程序开发者,机器提供一个大家都能理解的语境平台,从而达到需求,设计,实现尽可能的一致。zhangjun460 发表于2010年2月10日 9:50:44 IP:举报回复删除
复用从来就有的. 在面向过程的时代, 复用代表着函数; 在面向对象的时代,复用代表着类. 复用是个永恒的编程问题.sxg1997 发表于2010年2月10日 13:06:30 IP:举报回复删除
面向对象的本质是为了解决更复杂问题而提出的方法。hyqhero 发表于2010年2月10日 13:38:38 IP:举报回复删除
面向对象一个很优秀的特点就是多态,重载,虚函数,继承,就连接口也是为了实现多态这个目的,我觉的万事万物皆对象这个抽象概念的实现手段就是多态。。因为万事万物没有两样是一摸一样的!!拙见。。指教 匿名用户 发表于2010年2月10日 13:45:09 IP:举报回复删除
面向对象只是看问题和考虑问题的一个角度而已,实在不该有这么多废话aokihu 发表于2010年2月10日 15:40:52 IP:举报回复删除
看下人工智能的文章就会知道其实面向对象解决的是人工智能问题,设计者设计好一个个对象,他们有设计好的接口能够相互通讯,对象之间只交互Message而不是调用对方的函数或者是方法,就好像说我要发个邮件,打个电话问下哪家快递能发然后让他把邮件发出去,就是这么简单。说的更通俗的话,对象就像人体的细胞,他们各自完成自己的工作,当收到别的对象发来的消息的时候对其做出响应,其实是为了简化人工智能的开发,因为过程式开发很容易搞混乱。但是软件工程提出后,面向对象就发生了变化,似乎对象就只是一个标准零件的提供者,然后我们的程序员编程了装陪者,写软件就好像装电脑一样,没错,这样的开发模式对商业化软件来说是再好不过了,又能提高效率,又能提高质量,但是已经不能称为面向对象了,JAVA其实就是这样一种语言,表面是面向对象,其本质还是面向过程。之所以面向对象目前不能完全实现,是因面向对象的基础条件是并行运算,每个对象对自己负责,然后处理外来的消息,而现在的线性处理方式只是模拟了并行计算,也就是伪面向对象。 flymaidou 发表于2010年2月11日 13:01:05 IP:举报回复删除
我觉得面向对象就是改变一下我们的思维方式。 面向对象中的接口和抽象类,多态是精髓,就如同C的的指针一样的地位。 精通了设计模式之后就知道面向对象的优势在哪了jyk 发表于2010年2月13日 10:18:59 IP:举报回复删除
大家过年好哇!根据大家的回复,整理一下,再写一次。line_us 发表于2010年2月13日 21:27:32 IP:举报回复删除
面向对象的英文原词为Object Oriented 意思是以对象为主导为中心,是不是可以理解为以对象为关注焦点?具体到编程,我想大家会仁者见仁智者见智匿名用户 发表于2010年2月22日 15:18:52 IP:举报回复删除
面向对象设计最重要的是抽象,抽象是为了忽略一些东西,即把自己不必关注的忽略掉,为了完成这种忽略,抽象需要接口,接口提供了抽象的能力,在C++中,接口体现了类型,有相同接口的类就有同一类类型,也因此同一类型有许多具体类(比如继承同一个基类的子类有同一个类型),这里也看出面向对象程序设计中对接口编程也是对类型编程,一个类也可以展示多个类型(有不同的接口),也因此对于一个类型的指针,它所指向的是一个不确定的具体类,所以说在C++中指针具有多态性(从类型到具体类,也就是不确定性),也因此C++编译器看到指针或引用就引发多态调用,它要决议到具体类。请初学者仔细体会,那些封装,继承,多态等等都是为了完成抽象,不用过多理会语言的语法,在实际运用中比熟练使用设计模式更重要的是抽象的思维方式 lihuinihao6315 发表于2010年2月23日 11:03:59 IP:举报回复删除
各位讲的都很好,希望来个总结帖。N_IThero 发表于2010年2月23日 12:42:30 IP:举报回复删除
为了设计、使用方便。dw247 发表于2010年2月23日 13:19:12 IP:举报回复删除
搞对象highroad 发表于2010年2月24日 8:43:32 IP:举报回复删除
面向对象是为了更好的解决计算机要解决的问题。但不要把解决问题而套上计算机要求的面向对象。ann7788 发表于2010年2月24日 10:36:34 IP:举报回复删除
同意以前很爱追求OO的,但是其实对于小的项目,用面向过程比用面向对象更实用。不过如果是企业级的大案子,还是要选用面向对象的,方便管理,减少开发,扩展性好。匿名用户 发表于2010年2月24日 13:11:39 IP:举报回复删除
shenopkss 发表于2010年2月24日 15:14:07 IP:举报回复删除
高深莫测啊!!感慨,人实在是太聪明了,声明事情都能想到更好方法解决。zhoujk 发表于2010年2月24日 17:34:28 IP:举报回复删除
面对对象就是一种更高级封装,让程序员面对大量的函数时,能进行合理的分割,从而有效的复用和派生。这样才能提高开发效率。langzi8818 发表于2010年2月24日 19:47:44 IP:举报回复删除
我的理解,就是一种思想,一种人类看待问题的方法方式而已。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jyk/archive/2010/02/08/5300402.aspx