我想知道更多关于oop中的多态性的知识,这个主题与任何特定的语言(c++,java,python)无关。我想学习和理解多态的真实形式(抛开语言的空洞不谈)。
背景:在一次电话采访中,我被要求解释多态性?我的回答是:多态性与方法有关,通过重载(静态绑定)和覆盖(动态绑定)来实现。解释了重载和重写之间的区别
面试官的回答是我错了,多态与类有关,而不是方法。我强烈反对,但这个人是技术主管,毕业于哥伦比亚大学,拥有计算机科学学士和硕士学位(大约15-20年的经验),而我来自一所州立大学,拥有计算机科学学士学位(<4年经验)。
发布于 2017-11-10 18:58:47
最常见的是,当我们谈论OOP时,术语polymorphism
被用来描述我们使用继承时的对象行为,所以我们可以使用子类型的对象,就像有基类的对象一样(子类型的这些对象变得多态,它们有两种形式-自己的类型和基类类型)。
例如,如果我们有一个表示整数和实数的对象的层次结构,其中我们有基本的Number
类:
Number
/ \
/ \
/ \
Integer Real
每个类定义自己的一组操作,例如add
和multiply
。
n1 = Integer(...)
n2 = Integer(...)
r = Real(...)
// Now we can have a function that takes advantage of the
// polymorphic behavior, notice that it takes `Number` as
// argument types, so it doesn't know what are actual types
function f(x: Number, y: Number) {
// here we don't know if x and y are integer or real
return x.multiply(x).add(y); // x*x + y
}
Number result1 = f(n1, n2) // here we also don't know the specific
Number result2 = f(n2, r) // type of the result
这就是subtype polymorphism
的意义所在,现在我们可以定义更多的Numer子类型(例如,用于实数的类型具有更好的浮点精度,但处理速度较慢)。同时,f
函数将保持原样,因为它不依赖于特定的类型。
请注意,polymorphism
也可用于描述函数的行为,例如,当我们使用相同的名称但不同的参数声明函数,并且编译器选择在特定情况下使用哪个实现时(例如在wikipedia中):
function Add(x, y : Integer) : Integer;
begin
Add := x + y
end;
function Add(s, t : String) : String;
begin
Add := Concat(s, t)
end;
begin
Writeln(Add(1, 2)); (* Prints "3" *)
Writeln(Add('Hello, ', 'World!')); (* Prints "Hello, World!" *)
end.
还有polymorphism
can be used to describe泛型函数/类(模板)。
https://stackoverflow.com/questions/46995502
复制相似问题