多态性方法或类

时间:2017-10-28 23:28:42

标签: oop polymorphism

我想更多地了解oop中的多态性,其主题与任何特定语言(c ++,java,python)无关。 我想学习和理解多态性的真实形式(将语言的缺点放在一边)。

背景: 我在电话采访中被问到解释多态性? 我的回答:多态性与方法有关,通过重载(静态绑定)和覆盖(动态绑定)来实现。解释了重载和覆盖之间的差异

采访者的回答是我错了,多态性与类而不是方法有关。我非常不同意,但这个人是科技主管和哥伦比亚大学毕业生,拥有计算机科学学士学位和硕士学位(大约15 - 20年经验),我来自一所拥有计算机科学学士学位的州立大学(< 4 years经验)

1 个答案:

答案 0 :(得分:0)

最常见的是,当我们谈论OOP时,术语polymorphism用于描述我们使用继承时的对象行为,因此我们可以使用子类型的对象,就好像有基类的对象(这些子类型的对象变为多态,它们有两种形式 - 自有类型和基类类型。“

例如,如果我们有一个表示整数和实数的对象层次结构,我们有基类Number类:

         Number
        /     \
       /       \
      /         \
  Integer      Real

每个类定义自己的一组操作,例如addmultiply。现在,我们可以将object类型Integer用作IntegerNumberRealComplex相同) - 所以这个对象是多态的,它可以代表两种类型(类):

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通用函数/类(模板)。