我想更多地了解oop中的多态性,其主题与任何特定语言(c ++,java,python)无关。 我想学习和理解多态性的真实形式(将语言的缺点放在一边)。
背景: 我在电话采访中被问到解释多态性? 我的回答:多态性与方法有关,通过重载(静态绑定)和覆盖(动态绑定)来实现。解释了重载和覆盖之间的差异
采访者的回答是我错了,多态性与类而不是方法有关。我非常不同意,但这个人是科技主管和哥伦比亚大学毕业生,拥有计算机科学学士学位和硕士学位(大约15 - 20年经验),我来自一所拥有计算机科学学士学位的州立大学(< 4 years经验)
答案 0 :(得分:0)
最常见的是,当我们谈论OOP时,术语polymorphism
用于描述我们使用继承时的对象行为,因此我们可以使用子类型的对象,就好像有基类的对象(这些子类型的对象变为多态,它们有两种形式 - 自有类型和基类类型。“
例如,如果我们有一个表示整数和实数的对象层次结构,我们有基类Number
类:
Number
/ \
/ \
/ \
Integer Real
每个类定义自己的一组操作,例如add
和multiply
。现在,我们可以将object
类型Integer
用作Integer
和Number
(Real
和Complex
相同) - 所以这个对象是多态的,它可以代表两种类型(类):
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
的要点,现在我们可以定义更多的数字子类型(例如,实数的类型具有更好的浮点精度,但处理速度更慢)。同时f
函数将保持原样,因为它不依赖于特定类型。
请注意,polymorphism
也可用于描述函数的行为方式,例如,当我们声明具有相同名称但不同参数的函数时,编译器会选择在特定情况下使用哪个实现(例如来自{{ 3}}):
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
wikipedia通用函数/类(模板)。