在博客园我曾经发过这么一个随笔,得到不少的相应,同样希望能听到java朋友们的高见
wayfarer在他的随笔中谈到了面试别人时的一个问题. 你是如何理解多态的.
我想每个人的理解都不同,那么我们就来集思广义吧.
你可以从概念层 实现层,各个层面谈谈你对它的理解.角度越多,越能加深我们对它的理解.
不过有个小要求,就是用一两句话把你的意思表达出来.越是精练的语言,越能反应问题的实质.
我们不要求全面但是要有内容.比如sumtec的面向对象就是面向接口.
不过这里不要求一定是自己的见解,也可以是别的大家的看法.
毕竟我们的目的是理解多态!
我先抛砖引玉:
多态就是实现将接口(不特指关键字interface)与实现分离的技术.
评论:
# re: 多态? 你的理解是什么? 2005-03-06 23:38 | alittlefish
在实际操作中,多态可以让我不用关心某个对象到底是什么具体类型,就可以使用该对象的某些方法,而这些方法通过一个抽象类或者接口来实现。
从下往上看的话,多态实际上是多个对象的抽象,对它们进行通用编码。
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 08:41 | 一切从.NET开始
没有多态,工厂方法模式的效果就大打折扣,或者可以说不可能实现 :)
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 08:47 | 小诈
对于相同的事件(不指一般我们说的那些事件),不同的对象表现出不同的行为(特征)。
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 09:22 | KingofSC
多态给我的感觉就是提供父类调用子类代码的一个手段而已
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 09:29 | idior
很好,继续,希望看到更多更新的观点。
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 10:08 | age0
继承的目的是复用,继承复用包括两方面的复用:抽象(接口)复用,实现(过程)复用。
多态的目的就是要将抽象复用及实现复用剥离开来,子类虽然拥有和父类一样的抽象接口,但实现过程却未必一样,多态的引入就是要在继承的基础上实现变异的可能性。当然子类继承也不一定会产生实现差异,所以多态允许在产生差异的时候override父类接口,没有产生差异的时候直接继承。
interface则是另一种复用方式,interface只允许抽象复用,而禁止实现复用,所以interface比继承显得更轻量,但实际上系统中的实现复用必须由其他机制来保证。
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 10:15 | age0
To idior,想用一两句话来解释清楚一个深奥的概念是不是有点不切实际。
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 10:53 | rIPPER
一时 找不到sun 的 oo-226课程了,里面应该有比较简单明确的定义
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 10:59 | sysword
我的理解,一个问题一般会表现在多个层面上,各个层面上抽象程度不同,多态正是思考问题过程中跨越各层的桥梁。
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 11:09 | dudu
我觉得多态是在对象的基础上更高级的抽象, 它描述了一组具有共性的对象。
Allen Lee的《今天你多态了吗?》值得一读: http://www.cnblogs.com/allenlooplee/archive/2004/11/02/59519.html
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 12:38 | 生活、工作
运行时,才明确具体是指那个对象,这给client代码,带来了很大的灵活性。使依赖注入、针对抽象与接口编程、同一行代码操作不同类的对象(用接口)等等成为可能。
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 12:50 | idior
我比较喜欢 “生活、工作”的描述
◎age0
如果概念解释是很难用一两句话说清。
但是就像“生活、工作”这样的描述就能有意义。
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 17:43 | 班门弄斧
多态是多个对象UpCast的过程
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 19:56 | 丁丁
用人来表示基对象,多态就是对于不同种类的人(情圣或者情盲),拍MM马屁虽然目的相同,但是效果很不相同,情圣说“你好漂亮”就抱得MM归,而情盲拍得话,可能就被锯
删除评论
# re: 多态? 你的理解是什么? 2005-03-07 22:57 | Neter
我比较同意小诈的观点,多态就是具有相似功能的对象,有着不同的表现方法和行为。
删除评论
# re: 多态? 你的理解是什么? 2005-03-08 01:32 | NickLedson
我的观点是大大增强代码的复用性,使得项目架构更加清晰,松耦合.
比如在实际应用中我可以轻松继承一个System.Window.Forms.Control命名空间下的类比如Button打造属于自己的NixButton类而当一些原有系统的方法参数要求的传入的参数类型是Button时,我不必修改原有代码而直接把NixButton的实例对象传进去依然可用.
从而达到代码复用和架构松耦合的效果
子类继承了父类的所有接口,包括invoke handler/object对应表然后按继承关系和invoke handler不同而调用不同的实现代码!
删除评论
# re: 多态? 你的理解是什么? 2005-03-08 09:44 | idior
小诈的观点确实比较简明的说出了多态的表现.
希望看到更加深刻透彻的观点.
删除评论 修改评论
# re: 多态? 你的理解是什么? 2005-03-11 16:15 | myx
一位司机在公共汽车上,有可能是乘客,有可能是司机,就就是多态吧^_^
删除评论
# re: 多态? 你的理解是什么? 2005-03-13 06:21 | MindScape
和小作的差不多,多态的本质根本是语义相同。
多态是指,不同对象对应于同一动作语义具有不同的实际行为。
删除评论
# re: 多态? 你的理解是什么? 2005-03-13 18:10 | 龙蛰(NeoLee)
呵,我也常在面试中提到对“多态”的理解,我的理解是:
接口是面象对象的实现,多态是面象接口的应用!
BTW:不太认同sumtec的面向对象就是面向接口. 面象对象更多的是一种开发思想,接口更多的是实现技术,用“就是”来表达不确切,但这么形容也道出接口是面象对象开发中实现抽象最主要的手段!
删除评论
# re: 多态? 你的理解是什么? 2005-03-13 21:56 | idior
sumtec的那句话当然”不对“,关键是道出很本质的东西。
我觉得多态是面向接口的保证,支持。 而不是应用,关系反了吧。
由于多态的支持才能面向接口。
删除评论
# re: 多态? 你的理解是什么? 2005-03-14 00:32 | 龙蛰(NeoLee)
句中的“应用”有两重含义:
其一,多态是接口的特性。其二,就是对接口的应用,如在子类中override父类接口。
删除评论
# re: 多态? 你的理解是什么? 2005-03-26 23:09 | jsports
我认为多态,首先蕴含有decorator 的味道---------->一样的接口,但是功能上增强了。
另外一方面,多太表明实现多态的class是一族的,
对外部(外人)来讲,只要知道有这个方法(标签),
具体运行时你是这个系列(族)的谁,我不关心,我只关心你能给我进行这个服务就行。
删除评论
# re: 多态? 你的理解是什么? 2005-03-27 08:30 | 生活、工作
通俗的说,先说明一项功能或动作,风马牛不相及的东西去实现它。
对服务器段代码而言:
订下这个功能的设计时间较长,但写时一下了就完成了,用1%的时间,但风马牛不相及的东西去实现它时,耗时就多了,用99%的时间。
对客户端代码而言:
从使用的角度说:好处还是我上面所说的。
从学院派的角度说:就是小诈的说法“对于相同的事件(不指一般我们说的那些事件),不同的对象表现出不同的行为”。
删除评论
# re: 多态? 你的理解是什么? 2005-03-27 11:41 | idior
jsports和生活、工作的观点都不错 :)
删除评论 修改评论
# re: 多态? 你的理解是什么? 2005-04-01 13:54 | ttyp
多态是和继承相反的概念
多态是父类调子类的实现,继承是子类调父类的实现,由于多态时不知道会被哪个子类继承,所以定义的东西都是虚函数,当你执行这个虚函数时,首先找到该虚函数代表的实体子类,并执行子类中的相关代码
删除评论
# re: 多态? 你的理解是什么? 2005-04-01 14:08 | idior
@ttyp
多态是和继承相反的概念 interesting idea!
删除评论 修改评论
# re: 多态? 你的理解是什么? 2005-04-09 13:24 | huangyi
我从客户和服务的角度来理解 就是
服务可以由许多人来提供。
而客户只管使用服务,不需要知道服务的来源更不需要知道服务是如何实现的。另外,客户也许还会有小秘,专门帮客户选择服务的。
哎 多态让客户太舒服了啊 呵呵