Posted on 2005-03-06 22:06
idior 阅读(8721)
评论(68) 编辑 收藏 所属分类:
Design
wayfarer在
他的随笔中谈到了面试别人时的一个问题. 你是如何理解多态的.
我想每个人的理解都不同,那么我们就来集思广义吧.
你可以从概念层 实现层,各个层面谈谈你对它的理解.角度越多,越能加深我们对它的理解.
不过有个小要求,就是用一两句话把你的意思表达出来.

越是精练的语言,越能反应问题的实质.
我们不要求全面但是要有内容.比如sumtec的面向对象就是面向接口.
不过这里不要求一定是自己的见解,也可以是别的大家的看法.
毕竟我们的目的是理解多态!
我先抛砖引玉:
多态就是实现将接口(不特指关键字interface)与实现分离的技术.
btw 如果效果好,以后可以多采用这种方式 加深大家对某些概念的理解.
Feedback
在实际操作中,多态可以让我不用关心某个对象到底是什么具体类型,就可以使用该对象的某些方法,而这些方法通过一个抽象类或者接口来实现。
从下往上看的话,多态实际上是多个对象的抽象,对它们进行通用编码。
没有多态,工厂方法模式的效果就大打折扣,或者可以说不可能实现 :)
对于相同的事件(不指一般我们说的那些事件),不同的对象表现出不同的行为(特征)。
多态给我的感觉就是提供父类调用子类代码的一个手段而已
继承的目的是复用,继承复用包括两方面的复用:抽象(接口)复用,实现(过程)复用。
多态的目的就是要将抽象复用及实现复用剥离开来,子类虽然拥有和父类一样的抽象接口,但实现过程却未必一样,多态的引入就是要在继承的基础上实现变异的可能性。当然子类继承也不一定会产生实现差异,所以多态允许在产生差异的时候override父类接口,没有产生差异的时候直接继承。
interface则是另一种复用方式,interface只允许抽象复用,而禁止实现复用,所以interface比继承显得更轻量,但实际上系统中的实现复用必须由其他机制来保证。
To idior,想用一两句话来解释清楚一个深奥的概念是不是有点不切实际。
一时 找不到sun 的 oo-226课程了,里面应该有比较简单明确的定义
我的理解,一个问题一般会表现在多个层面上,各个层面上抽象程度不同,多态正是思考问题过程中跨越各层的桥梁。
运行时,才明确具体是指那个对象,这给client代码,带来了很大的灵活性。使依赖注入、针对抽象与接口编程、同一行代码操作不同类的对象(用接口)等等成为可能。
我比较喜欢 “生活、工作”的描述
◎age0
如果概念解释是很难用一两句话说清。
但是就像“生活、工作”这样的描述就能有意义。
用人来表示基对象,多态就是对于不同种类的人(情圣或者情盲),拍MM马屁虽然目的相同,但是效果很不相同,情圣说“你好漂亮”就抱得MM归,而情盲拍得话,可能就被锯

我比较同意小诈的观点,多态就是具有相似功能的对象,有着不同的表现方法和行为。
我的观点是大大增强代码的复用性,使得项目架构更加清晰,松耦合.
比如在实际应用中我可以轻松继承一个System.Window.Forms.Control命名空间下的类比如Button打造属于自己的NixButton类而当一些原有系统的方法参数要求的传入的参数类型是Button时,我不必修改原有代码而直接把NixButton的实例对象传进去依然可用.
从而达到代码复用和架构松耦合的效果
子类继承了父类的所有接口,包括invoke handler/object对应表然后按继承关系和invoke handler不同而调用不同的实现代码!
小诈的观点确实比较简明的说出了多态的表现.
希望看到更加深刻透彻的观点.
一位司机在公共汽车上,有可能是乘客,有可能是司机,就就是多态吧^_^
和小作的差不多,多态的本质根本是语义相同。
多态是指,不同对象对应于同一动作语义具有不同的实际行为。
呵,我也常在面试中提到对“多态”的理解,我的理解是:
接口是面象对象的实现,多态是面象接口的应用!
BTW:不太认同sumtec的面向对象就是面向接口. 面象对象更多的是一种开发思想,接口更多的是实现技术,用“就是”来表达不确切,但这么形容也道出接口是面象对象开发中实现抽象最主要的手段!
sumtec的那句话当然”不对“,关键是道出很本质的东西。
我觉得多态是面向接口的保证,支持。 而不是应用,关系反了吧。
由于多态的支持才能面向接口。
句中的“应用”有两重含义:
其一,多态是接口的特性。其二,就是对接口的应用,如在子类中override父类接口。
我认为多态,首先蕴含有decorator 的味道---------->一样的接口,但是功能上增强了。
另外一方面,多太表明实现多态的class是一族的,
对外部(外人)来讲,只要知道有这个方法(标签),
具体运行时你是这个系列(族)的谁,我不关心,我只关心你能给我进行这个服务就行。
通俗的说,先说明一项功能或动作,风马牛不相及的东西去实现它。
对服务器段代码而言:
订下这个功能的设计时间较长,但写时一下了就完成了,用1%的时间,但风马牛不相及的东西去实现它时,耗时就多了,用99%的时间。
对客户端代码而言:
从使用的角度说:好处还是我上面所说的。
从学院派的角度说:就是小诈的说法“对于相同的事件(不指一般我们说的那些事件),不同的对象表现出不同的行为”。
多态是和继承相反的概念
多态是父类调子类的实现,继承是子类调父类的实现,由于多态时不知道会被哪个子类继承,所以定义的东西都是虚函数,当你执行这个虚函数时,首先找到该虚函数代表的实体子类,并执行子类中的相关代码
@ttyp
多态是和继承相反的概念 interesting idea!
我今天晚上或者明天上午会在我的Blog上贴出我对多态的理解,地址如下:
www.cnblogs.com/framesniper
我从客户和服务的角度来理解 就是
服务可以由许多人来提供。
而客户只管使用服务,不需要知道服务的来源更不需要知道服务是如何实现的。另外,客户也许还会有小秘,专门帮客户选择服务的。
哎 多态让客户太舒服了啊 呵呵
我只是很疑惑:为什么人可以在运行之前就知道会调用哪个类型的方法,而编译器就只能在运行时才能确定调用哪个类型的方法呢?编译器也是人写的啊
Function(BaseClass classa)
{
classa.aVisualFunction();
}
不到运行时,人也没法确定究竟会调用到哪个方法啊
我从客户和服务的角度来理解 就是
服务可以由许多人来提供。
而客户只管使用服务,不需要知道服务的来源更不需要知道服务是如何实现的。另外,客户也许还会有小秘,专门帮客户选择服务的。
哎 多态让客户太舒服了啊 呵呵
==================
你说的应该是“封装”这个概念吧?
今天突然又看到了这篇文章,呵呵,再回复一下:
站在OOA、OOD、OOP的角度,
对于系统(项目)而言,横向解析可以分离出许多企业对象,这些企业对象相互协作完成相应的功能。横向解析完毕后再纵向解析运用继承技术,可以达到代码的复用,使顶层类站在基类层次的肩膀上,一步一步实现复杂功能,就像很高的楼一步难以迈上去,但一个一个台阶就能爬上去(比喻的有点不确切)。
对于系统的实现而言,服务器端代码会用到继承来实现很多类,这是显而易见的,同时为多态的消费打好基础。有了服务器端的类,客户端代码就消费这些类,消费(享受)多态带来的好处。
曾经在哪本书看到过 作者对多态的理解
“多态赋予了老代码调用新代码的能力”
我觉得很有道理
有了多态 加上继承 使面向对象的代码复用思想更全面
有了多态代码更加丰富多彩 有了多态从事高层设计的程序员不会被许许多多的接口而晕头转向
多态+继承 使面向对象的代码复用思想更全面
继承负责共性的部分 多态负责不同的部分 各自为重用做了贡献.
多态就是让同一个类别中的不同实体按自己的方式实现同一个动作。比如,交通工具中有汽车火车飞机,对他们都可以实现驾驶这个动作。但是我们不用去关心驾驶这个动作是如何实现的。只要使用 实例.驾驶 他就可以往前走了
age0:但是我觉得多态可以实现的继承也可以实现,多态和继承有什么区别?或者多态就是继承的一个方面?override可以覆盖父类中实现某个动作的方法,继承中的new也覆盖了父类中的方法。所以我区分不开 -_-!
Function(BaseClass classa)
{
classa.aVisualFunction();
}
看看这个用new 和override会有什么区别
一日300多人一起打扫卫生,不懂多态的领导发号施令道:a去扫地、b去擦窗户、c去打水......话未毕,累倒当场,立仆。
上级随即派来一懂得多态的领导,不愧青年才俊,他只发布了一道命令:大家都去干活。于是各司其职,不一会事毕.....
多态就是生活,虽然都在一天天的过,却有着孑然不同的味道.
多态就是占位符,一个地方,有同性质的object都可以去填充.
最近又在看《C++编程思想》,对多态的定义就是不断upcast的过程。让我说对多态的理解,和上面一位兄弟的观点差不多,就是多态和继承是一组相反的调用过程,多态是父类调子类的方法,继承是子类调父类的过程
当你向不同的人问同一个问题的时候,就运用了多态。对wayfarer来说所有的人都是求职者(interface),同时每个人又是一个特定的区别与其他人的。多态不代表我不关心你怎么回答,而是我确信只要你是一个求职者,就可以回答这个问题。
其实就是同样一个事件,在不同情况下产生不同的结果。
比如:事件:人穿衣服
如果应用在男人身上,可能就是穿西服,穿短裤,衬衫
如果应用在女人身上,那么就会变成穿裙子,穿内衣,穿bra,哈哈
叫声:
狗是"wangwang"
猫:miaomiao
牛:menmen
“多态”是什么 和 “多态”可以做什么 不大一样吧,各位的描述更多的是后者。前者涉及多态的底层实现技术,以及实现目的(本来目的与衍生目的),以及具体的多态分类比如类层次多态还是对象层次多态;后者主要是面向对象方面的具体应用实现等。
老虎和羚羊都属于动物,当他们进食时一个追着吃肉,一个站着吃草。
多態 : 處理未來型別的能力
面向對象用 <動態多態> 來實現,靠的是的接口
泛型靠的是 <靜態多態> 來實現, 不需接口
汉语中的四声、通假字、一字多义、一字多音不都是多态嘛。:)
c++发明人肯定对汉语有研究:)
老子《道德经•第十一章》:“三十辐共一毂,当其无,有车之用。埏埴以为器,当其无,有器之用。凿户牖以为室,当其无,有室之用。故有之以为利,无之以为用。”
这是老子在几千年前对虚函数的高度概括。
越是高层越是务虚,越是打工仔越是要掌握实实在在的技术,以待价而沽啊。
@happy555
应该是父类引用调用子类的方法,而不是父类调用子类的方法,在父类定义的时候,哪来的子类?
多态是一个相对概念,是父类与子类之间的关系在某方面的描述,是子类对父类某个行为或约定做的不同实现。单就子类或父类来谈多态是没有意义的。多态是站在父类的角度看子类,就子类本身而言,无所谓多态。
呵呵,最近刚好搞清楚了这个问题,我认为最正确的答案,多态就是一个对象的多种状态.多态必须要通过将子类对象赋给基类引用来实现,当将一个子类对象赋给基类引用时,这个对象就处于基类的状态,在这个状态上就可以产生一定的行为,也就是调用覆盖的基类的方法.其他的对多态的理解都属于一些次要部分,没在点子上.
百度知道里面对这个概念的解释是最正确和清楚的,如果不能理解可以参考一下.
lz问大家同样一个问题,但是不同的程序员的回答是不同的.这就是多态.