首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多态方法或类

多态方法或类
EN

Stack Overflow用户
提问于 2017-10-29 07:28:42
回答 1查看 605关注 0票数 1

我想知道更多关于oop中的多态性的知识,这个主题与任何特定的语言(c++,java,python)无关。我想学习和理解多态的真实形式(抛开语言的空洞不谈)。

背景:在一次电话采访中,我被要求解释多态性?我的回答是:多态性与方法有关,通过重载(静态绑定)和覆盖(动态绑定)来实现。解释了重载和重写之间的区别

面试官的回答是我错了,多态与类有关,而不是方法。我强烈反对,但这个人是技术主管,毕业于哥伦比亚大学,拥有计算机科学学士和硕士学位(大约15-20年的经验),而我来自一所州立大学,拥有计算机科学学士学位(<4年经验)。

EN

回答 1

Stack Overflow用户

发布于 2017-11-10 18:58:47

最常见的是,当我们谈论OOP时,术语polymorphism被用来描述我们使用继承时的对象行为,所以我们可以使用子类型的对象,就像有基类的对象一样(子类型的这些对象变得多态,它们有两种形式-自己的类型和基类类型)。

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

代码语言:javascript
运行
复制
         Number
        /     \
       /       \
      /         \
  Integer      Real

每个类定义自己的一组操作,例如addmultiply

代码语言:javascript
运行
复制
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中):

代码语言:javascript
运行
复制
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泛型函数/类(模板)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46995502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档