多态? 你的理解是什么? - 享受代码,享受人生 - 博客园

来源:百度文库 编辑:神马文学网 时间:2024/05/23 17:32:45

多态? 你的理解是什么?

Posted on 2005-03-06 22:06 idior 阅读(11919) 评论(75)  编辑 收藏 网摘 所属分类: Design wayfarer在他的随笔中谈到了面试别人时的一个问题. 你是如何理解多态的.

我想每个人的理解都不同,那么我们就来集思广义吧.
你可以从概念层 实现层,各个层面谈谈你对它的理解.角度越多,越能加深我们对它的理解.

不过有个小要求,就是用一两句话把你的意思表达出来.  越是精练的语言,越能反应问题的实质.
我们不要求全面但是要有内容.比如sumtec的面向对象就是面向接口.

不过这里不要求一定是自己的见解,也可以是别的大家的看法.
毕竟我们的目的是理解多态!

我先抛砖引玉:
多态就是实现将接口(不特指关键字interface)与实现分离的技术.

btw 如果效果好,以后可以多采用这种方式 加深大家对某些概念的理解.0 0 0(请您对文章做出评价)« 上一篇:多态小quiz
» 下一篇:ProperyGrid 的原理试探

Feedback

#1楼   回复  引用  查看    

2005-03-06 23:38 by alittlefish       在实际操作中,多态可以让我不用关心某个对象到底是什么具体类型,就可以使用该对象的某些方法,而这些方法通过一个抽象类或者接口来实现。
从下往上看的话,多态实际上是多个对象的抽象,对它们进行通用编码。

#2楼   回复  引用  查看    

2005-03-07 08:41 by 一切从.NET开始       没有多态,工厂方法模式的效果就大打折扣,或者可以说不可能实现 :)

#3楼   回复  引用  查看    

2005-03-07 08:47 by 小诈       对于相同的事件(不指一般我们说的那些事件),不同的对象表现出不同的行为(特征)。

#4楼   回复  引用    

2005-03-07 09:22 by KingofSC 多态给我的感觉就是提供父类调用子类代码的一个手段而已

#5楼   回复  引用    

2005-03-07 09:29 by idior 很好,继续,希望看到更多更新的观点。

#6楼   回复  引用    

2005-03-07 10:08 by age0 继承的目的是复用,继承复用包括两方面的复用:抽象(接口)复用,实现(过程)复用。

多态的目的就是要将抽象复用及实现复用剥离开来,子类虽然拥有和父类一样的抽象接口,但实现过程却未必一样,多态的引入就是要在继承的基础上实现变异的可能性。当然子类继承也不一定会产生实现差异,所以多态允许在产生差异的时候override父类接口,没有产生差异的时候直接继承。

interface则是另一种复用方式,interface只允许抽象复用,而禁止实现复用,所以interface比继承显得更轻量,但实际上系统中的实现复用必须由其他机制来保证。

#7楼   回复  引用    

2005-03-07 10:15 by age0 To idior,想用一两句话来解释清楚一个深奥的概念是不是有点不切实际。

#8楼   回复  引用    

2005-03-07 10:53 by rIPPER 一时 找不到sun 的 oo-226课程了,里面应该有比较简单明确的定义

#9楼   回复  引用    

2005-03-07 10:59 by sysword 我的理解,一个问题一般会表现在多个层面上,各个层面上抽象程度不同,多态正是思考问题过程中跨越各层的桥梁。

#10楼   回复  引用  查看    

2005-03-07 11:09 by dudu       我觉得多态是在对象的基础上更高级的抽象, 它描述了一组具有共性的对象。
Allen Lee的《今天你多态了吗?》值得一读: http://www.cnblogs.com/allenlooplee/archive/2004/11/02/59519.html

#11楼   回复  引用  查看    

2005-03-07 12:38 by 生活、工作       运行时,才明确具体是指那个对象,这给client代码,带来了很大的灵活性。使依赖注入、针对抽象与接口编程、同一行代码操作不同类的对象(用接口)等等成为可能。

#12楼   回复  引用    

2005-03-07 12:50 by idior 我比较喜欢 “生活、工作”的描述
◎age0
如果概念解释是很难用一两句话说清。
但是就像“生活、工作”这样的描述就能有意义。

#13楼   回复  引用    

2005-03-07 17:43 by 班门弄斧 多态是多个对象UpCast的过程

#14楼   回复  引用  查看    

2005-03-07 19:56 by 丁丁       用人来表示基对象,多态就是对于不同种类的人(情圣或者情盲),拍MM马屁虽然目的相同,但是效果很不相同,情圣说“你好漂亮”就抱得MM归,而情盲拍得话,可能就被锯

#15楼   回复  引用  查看    

2005-03-07 22:57 by Neter       我比较同意小诈的观点,多态就是具有相似功能的对象,有着不同的表现方法和行为。

#16楼   回复  引用    

2005-03-08 01:32 by NickLedson[未注册用户] 我的观点是大大增强代码的复用性,使得项目架构更加清晰,松耦合.
比如在实际应用中我可以轻松继承一个System.Window.Forms.Control命名空间下的类比如Button打造属于自己的NixButton类而当一些原有系统的方法参数要求的传入的参数类型是Button时,我不必修改原有代码而直接把NixButton的实例对象传进去依然可用.

从而达到代码复用和架构松耦合的效果

子类继承了父类的所有接口,包括invoke handler/object对应表然后按继承关系和invoke handler不同而调用不同的实现代码!

#17楼[楼主]   回复  引用  查看    

2005-03-08 09:44 by idior       小诈的观点确实比较简明的说出了多态的表现.
希望看到更加深刻透彻的观点.

#18楼   回复  引用    

2005-03-11 16:15 by myx 一位司机在公共汽车上,有可能是乘客,有可能是司机,就就是多态吧^_^

#19楼   回复  引用    

2005-03-13 06:21 by MindScape 和小作的差不多,多态的本质根本是语义相同。

多态是指,不同对象对应于同一动作语义具有不同的实际行为。

#20楼   回复  引用  查看    

2005-03-13 18:10 by 龙蛰(NeoLee)       呵,我也常在面试中提到对“多态”的理解,我的理解是:

接口是面象对象的实现,多态是面象接口的应用!

BTW:不太认同sumtec的面向对象就是面向接口. 面象对象更多的是一种开发思想,接口更多的是实现技术,用“就是”来表达不确切,但这么形容也道出接口是面象对象开发中实现抽象最主要的手段!

#21楼   回复  引用    

2005-03-13 21:56 by idior sumtec的那句话当然”不对“,关键是道出很本质的东西。

我觉得多态是面向接口的保证,支持。 而不是应用,关系反了吧。
由于多态的支持才能面向接口。

#22楼   回复  引用  查看    

2005-03-14 00:32 by 龙蛰(NeoLee)       句中的“应用”有两重含义:
其一,多态是接口的特性。其二,就是对接口的应用,如在子类中override父类接口。

#23楼   回复  引用    

2005-03-26 23:09 by jsports[未注册用户] 我认为多态,首先蕴含有decorator 的味道---------->一样的接口,但是功能上增强了。

另外一方面,多太表明实现多态的class是一族的,
对外部(外人)来讲,只要知道有这个方法(标签),
具体运行时你是这个系列(族)的谁,我不关心,我只关心你能给我进行这个服务就行。




#24楼   回复  引用  查看    

2005-03-27 08:30 by 生活、工作       通俗的说,先说明一项功能或动作,风马牛不相及的东西去实现它。

对服务器段代码而言:
订下这个功能的设计时间较长,但写时一下了就完成了,用1%的时间,但风马牛不相及的东西去实现它时,耗时就多了,用99%的时间。

对客户端代码而言:
从使用的角度说:好处还是我上面所说的。
从学院派的角度说:就是小诈的说法“对于相同的事件(不指一般我们说的那些事件),不同的对象表现出不同的行为”。

#25楼[楼主]   回复  引用  查看    

2005-03-27 11:41 by idior       jsports和生活、工作的观点都不错 :)

#26楼   回复  引用  查看    

2005-04-01 13:54 by ttyp       多态是和继承相反的概念
多态是父类调子类的实现,继承是子类调父类的实现,由于多态时不知道会被哪个子类继承,所以定义的东西都是虚函数,当你执行这个虚函数时,首先找到该虚函数代表的实体子类,并执行子类中的相关代码

#27楼[楼主]   回复  引用  查看    

2005-04-01 14:08 by idior       @ttyp
多态是和继承相反的概念 interesting idea!

#28楼   回复  引用    

2005-04-01 21:39 by FS 我今天晚上或者明天上午会在我的Blog上贴出我对多态的理解,地址如下:
www.cnblogs.com/framesniper

#29楼   回复  引用  查看    

2005-04-09 13:24 by huangyi       我从客户和服务的角度来理解 就是

服务可以由许多人来提供。
而客户只管使用服务,不需要知道服务的来源更不需要知道服务是如何实现的。另外,客户也许还会有小秘,专门帮客户选择服务的。

哎 多态让客户太舒服了啊 呵呵

#30楼   回复  引用  查看    

2005-06-30 17:02 by buaaytt       我只是很疑惑:为什么人可以在运行之前就知道会调用哪个类型的方法,而编译器就只能在运行时才能确定调用哪个类型的方法呢?编译器也是人写的啊

#31楼   回复  引用  查看    

2005-06-30 20:04 by huangyi       Function(BaseClass classa)
{
classa.aVisualFunction();
}

不到运行时,人也没法确定究竟会调用到哪个方法啊

#32楼   回复  引用    

2005-07-01 09:53 by buaaytt 嗯,对,是我理解错了,多谢回复

#33楼   回复  引用    

2005-10-19 23:19 by 0123[未注册用户] 我从客户和服务的角度来理解 就是

服务可以由许多人来提供。
而客户只管使用服务,不需要知道服务的来源更不需要知道服务是如何实现的。另外,客户也许还会有小秘,专门帮客户选择服务的。

哎 多态让客户太舒服了啊 呵呵

==================
你说的应该是“封装”这个概念吧?

#34楼   回复  引用  查看    

2005-10-21 18:39 by QuitGame       简单的说 就是 猫叫和狗叫 是不一样的

#35楼   回复  引用  查看    

2005-11-17 00:06 by 生活、工作       今天突然又看到了这篇文章,呵呵,再回复一下:
站在OOA、OOD、OOP的角度,
对于系统(项目)而言,横向解析可以分离出许多企业对象,这些企业对象相互协作完成相应的功能。横向解析完毕后再纵向解析运用继承技术,可以达到代码的复用,使顶层类站在基类层次的肩膀上,一步一步实现复杂功能,就像很高的楼一步难以迈上去,但一个一个台阶就能爬上去(比喻的有点不确切)。
对于系统的实现而言,服务器端代码会用到继承来实现很多类,这是显而易见的,同时为多态的消费打好基础。有了服务器端的类,客户端代码就消费这些类,消费(享受)多态带来的好处。

#36楼   回复  引用  查看    

2005-11-20 18:54 by 横刀天笑       曾经在哪本书看到过 作者对多态的理解
“多态赋予了老代码调用新代码的能力”
我觉得很有道理
有了多态 加上继承 使面向对象的代码复用思想更全面
有了多态代码更加丰富多彩 有了多态从事高层设计的程序员不会被许许多多的接口而晕头转向

#37楼[楼主]   回复  引用  查看    

2005-11-20 22:02 by idior       多态+继承 使面向对象的代码复用思想更全面

继承负责共性的部分 多态负责不同的部分 各自为重用做了贡献.

#38楼   回复  引用    

2006-01-05 09:59 by 阿布[未注册用户] 多态就是让同一个类别中的不同实体按自己的方式实现同一个动作。比如,交通工具中有汽车火车飞机,对他们都可以实现驾驶这个动作。但是我们不用去关心驾驶这个动作是如何实现的。只要使用 实例.驾驶 他就可以往前走了

#39楼   回复  引用    

2006-01-05 10:04 by 阿布[未注册用户] age0:但是我觉得多态可以实现的继承也可以实现,多态和继承有什么区别?或者多态就是继承的一个方面?override可以覆盖父类中实现某个动作的方法,继承中的new也覆盖了父类中的方法。所以我区分不开 -_-!

#40楼   回复  引用    

2006-01-05 12:16 by demo[未注册用户] Function(BaseClass classa)
{
classa.aVisualFunction();
}


看看这个用new 和override会有什么区别

#41楼   回复  引用  查看    

2006-01-11 15:14 by neoragex2002       一日300多人一起打扫卫生,不懂多态的领导发号施令道:a去扫地、b去擦窗户、c去打水......话未毕,累倒当场,立仆。

上级随即派来一懂得多态的领导,不愧青年才俊,他只发布了一道命令:大家都去干活。于是各司其职,不一会事毕.....

#42楼   回复  引用  查看    

2006-03-26 02:13 by 梁广永       通过引用调用类,让类完成它该完成的工作

#43楼   回复  引用  查看    

2006-04-11 14:10 by 可逆       在遵守契约前提下的抽象与具体

#44楼   回复  引用  查看    

2006-04-15 13:05 by ----Lico.H.W       一生二,二生三,三生万象.
此乃,多态.

#45楼   回复  引用    

2006-05-21 13:44 by flyingchen 多态就是生活,虽然都在一天天的过,却有着孑然不同的味道.
多态就是占位符,一个地方,有同性质的object都可以去填充.

#46楼   回复  引用    

2006-06-08 17:23 by happy555[未注册用户] 最近又在看《C++编程思想》,对多态的定义就是不断upcast的过程。让我说对多态的理解,和上面一位兄弟的观点差不多,就是多态和继承是一组相反的调用过程,多态是父类调子类的方法,继承是子类调父类的过程

#47楼   回复  引用  查看    

2006-06-20 15:10 by 肖鹏       当你向不同的人问同一个问题的时候,就运用了多态。对wayfarer来说所有的人都是求职者(interface),同时每个人又是一个特定的区别与其他人的。多态不代表我不关心你怎么回答,而是我确信只要你是一个求职者,就可以回答这个问题。

#48楼   回复  引用  查看    

2006-08-22 21:56 by 思无邪       真难哪
多态就像函数的接口

#49楼   回复  引用  查看    

2006-09-11 14:31 by 生米煮成稀饭       其实就是同样一个事件,在不同情况下产生不同的结果。
比如:事件:人穿衣服
如果应用在男人身上,可能就是穿西服,穿短裤,衬衫
如果应用在女人身上,那么就会变成穿裙子,穿内衣,穿bra,哈哈

#50楼   回复  引用  查看    

2006-09-12 00:12 by 天天敲       多态就是一个设计,多个实现.

#51楼   回复  引用    

2006-11-30 16:42 by wstorm[未注册用户] 叫声:
狗是"wangwang"
猫:miaomiao
牛:menmen

#52楼   回复  引用    

2006-12-08 12:02 by shangyq[未注册用户] “多态”是什么 和 “多态”可以做什么 不大一样吧,各位的描述更多的是后者。前者涉及多态的底层实现技术,以及实现目的(本来目的与衍生目的),以及具体的多态分类比如类层次多态还是对象层次多态;后者主要是面向对象方面的具体应用实现等。

#53楼   回复  引用    

2007-01-17 16:16 by 梁建书[未注册用户] 向上转型,向下转型。倒过来。

#54楼   回复  引用    

2007-05-30 17:32 by a[未注册用户] hao好!!!!!!!!!!!!!

#55楼   回复  引用    

2007-07-23 09:45 by webq 老虎和羚羊都属于动物,当他们进食时一个追着吃肉,一个站着吃草。

#56楼   回复  引用  查看    

2007-07-24 18:03 by 马可香蕉       多态可以实现相同中的不同

#57楼   回复  引用  查看    

2007-08-03 10:10 by 真 OO无双       多態 : 處理未來型別的能力

面向對象用 <動態多態> 來實現,靠的是的接口
泛型靠的是 <靜態多態> 來實現, 不需接口

#58楼   回复  引用    

2007-10-11 13:44 by daliang[未注册用户] 汉语中的四声、通假字、一字多义、一字多音不都是多态嘛。:)
c++发明人肯定对汉语有研究:)

#59楼   回复  引用    

2007-10-11 13:51 by daliang[未注册用户] 老子《道德经•第十一章》:“三十辐共一毂,当其无,有车之用。埏埴以为器,当其无,有器之用。凿户牖以为室,当其无,有室之用。故有之以为利,无之以为用。”

这是老子在几千年前对虚函数的高度概括。
越是高层越是务虚,越是打工仔越是要掌握实实在在的技术,以待价而沽啊。

#60楼   回复  引用    

2007-10-25 19:07 by 孤舟垂钓[未注册用户] @happy555
应该是父类引用调用子类的方法,而不是父类调用子类的方法,在父类定义的时候,哪来的子类?

#61楼   回复  引用    

2007-10-25 19:18 by 孤舟垂钓[未注册用户] 多态是一个相对概念,是父类与子类之间的关系在某方面的描述,是子类对父类某个行为或约定做的不同实现。单就子类或父类来谈多态是没有意义的。多态是站在父类的角度看子类,就子类本身而言,无所谓多态。

#62楼   回复  引用  查看    

2007-11-11 14:05 by yellowyu       从不同视角去看待一个对象

#63楼   回复  引用    

2007-12-02 00:42 by zk[未注册用户] 呵呵,最近刚好搞清楚了这个问题,我认为最正确的答案,多态就是一个对象的多种状态.多态必须要通过将子类对象赋给基类引用来实现,当将一个子类对象赋给基类引用时,这个对象就处于基类的状态,在这个状态上就可以产生一定的行为,也就是调用覆盖的基类的方法.其他的对多态的理解都属于一些次要部分,没在点子上.

#64楼   回复  引用    

2007-12-02 00:47 by zk[未注册用户] 百度知道里面对这个概念的解释是最正确和清楚的,如果不能理解可以参考一下.

#65楼   回复  引用  查看    

2007-12-11 16:55 by 棠棠dotNet       lz问大家同样一个问题,但是不同的程序员的回答是不同的.这就是多态.

#66楼   回复  引用  查看    

2008-01-13 17:22 by 海风吹呀吹       一个人偷东西的时候是小偷,扶老太过马路是雷锋!

#67楼   回复  引用  查看    

2008-04-23 10:37 by 镜涛       相同的调用,不同表现

#68楼   回复  引用    

2008-08-25 11:22 by 阿斯顿[未注册用户] 多态是父类对象指向一个或者多个子类对象的技术

#69楼   回复  引用    

2008-09-30 00:06 by sos[未注册用户] 发给你们一些水果箱子.是装水果的.你可以装世界上的任何一种水果.
这个就是多态吧.

#70楼   回复  引用    

2008-10-02 22:30 by wolf198[未注册用户] Function(BaseClass classa)
{
classa.aVisualFunction();
}
是一种多态

a()
a(int i)
是不是也是多态????

#71楼   回复  引用  查看    

2008-12-26 23:33 by xiao_p       具有同一父类的子类对象对同样的事件表现不同行为的能力。

#72楼   回复  引用    

2009-02-04 11:18 by 卖女孩的小火柴4[未注册用户] 个人理解: 多态给我的感觉,就是只能做自己该做的事,无权干涉别人,如果没有了多态,人人都是神。

#73楼   回复  引用    

2009-03-02 13:35 by 技大一支梅[未注册用户] 多态就是只负责指挥,具体事务交给别人做。

#74楼   回复  引用  查看    

2009-06-22 08:53 by Old       “多态(polymorphism) 在运行时刻接口匹配的对象能互相替换的能力”
——《设计模式 可复用面向对象软件的基础》 P239

#75楼   回复  引用  查看    

2009-11-12 10:03 by 午夜香吻       妈妈说:“多态就像撒尿:同样是撒尿,男人站着,女人蹲着,狗狗喇叭着腿……”