“多态性与方法重载或方法重写不同。......两者都不是多态的实现”。
的引用然而,在“面向对象的程序设计”一书中,Timothy Budd表示存在“四种不同形式的多态”:
重载(ad hoc polymorphism)
覆盖(包含多态性)
多态变量(赋值多态性)
泛型
谁是对的?感谢
答案 0 :(得分:3)
多态性是编程语言的特征或特征。编程语言支持它或不支持它。由于编程语言属于有时截然不同的范式,不同的范例(函数式编程或面向对象编程)可能会略有不同的解释,并且HOW多态性的应用在该特定范例中表达。
据我所知,在OOP中,多态性被认为是基本原则之一,也是一个非常独特的原则。大多数面向对象语言在其众多特性中具有多态性。简而言之,当具有多态实现的对象的调用者不知道对象的确切类型时,最好看到多态。通常是继承和转换的结果,也称为subtype polymorphism,并通过使用vTables来工作。
我同意(与许多作者一起)运算符重载是多态的表现。因此,如果重载==运算符以采用TypeA == TypeB,如果要比较包含类型A或B的随机元素的列表中的元素,则有效地将TypeB解释为TypeA,您实际上并不关心它是什么,因为他们都可以平等对待。像许多其他辩论一样,这个辩论者有捍卫者和仇恨者。
但这是OOP故事的结尾。
在函数(声明)语言(Lisp,F#)中,因为第一类公民是函数(vs Objects),所以多态性通过函数之间的关系来表达,并且表现略有不同。见Type Polymorphism
我想说的最后一句话是,我和其他人一样喜欢维基百科,但是你必须总是拿着一些盐的文章,不要盲目地信任它们而不确认其他来源。如果你想了解OOP的真正原理,你应该从这里开始:
答案 1 :(得分:1)
我相信我见过的关于多态性的最佳定义之一是指在运行时识别出的对象类型。这似乎强调对象运行时类型可能与其声明的类型不同,并且在运行时进程期间将匹配对象上调用的方法。
答案 2 :(得分:1)
我会将确切的定义留给更熟悉的人(从完全纯粹的观点来看),但从纯语义的角度来看,这些陈述并不一定相互矛盾。
一个是列出“四种不同形式”的东西,另一个是说这四种形式中的两种不是“自己”构成的东西。有人可能会争辩说,“四种形式”的作者并不一定说这些形式本身就是整体的“完整”例子,但它们是它们的组成部分。
那就是说,我认为“四种形式”的作家更为正确,维基百科作家或许只是试图解析一些东西。和你一样。 :P