【问题标题】:Polymorphism methods or classes多态方法或类
【发布时间】:2018-04-10 06:24:28
【问题描述】:

我想更多地了解 oop 中的多态性,该主题与任何特定语言(c++、java、python)都不相关。 我想以真实的形式学习和理解多态性(抛开语言的惯用语)。

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

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

【问题讨论】:

  • 您是否尝试过搜索现有问题?我确定他们已经涵盖了这个?也就是说,多态是一个宽泛的概念,但多态面向对象的代码最重要的方面是它允许一个对象属于多个类型。
  • 我理解多态性'允许一个对象属于多个类型'。所有这些都是通过编写多态方法来实现的(什么是没有定义任何方法的类(我的意思是一个空白类))。所以我的观点是多态性是通过编写多态方法来实现的。
  • @linuxWiz98 这就是你似乎出错的地方。 多态替换不是通过覆盖来实现的。 多态替换是通过继承(类扩展)实现的。无需覆盖子类中的方法来利用多态性。如果A 是具有doSomething 方法和B extends A 的类,则A 类型的引用可以同时引用AB 实例,而无需覆盖 i> doSomethingB。现在,如果我们谈论运行时多态性,那么您就可以真正开始谈论覆盖方法了。
  • 我想同时解决方法重载(静态绑定)和方法覆盖(动态绑定)这两种我们可以在任何 OOP 语言中实现多态性的方法。对于成为多态的类,没有特殊的声明(多态类 A(object) 使多态)。我的观点是多态性是通过编写多态方法来实现的,这些方法有助于根据被调用方法的签名来改变类的行为(我认为人们只是停留在多态性是类如何改变它们的行为,然后他们认为它只与类有关,他们忘记了它是如何实现的)。
  • 我认为我们编写的是多态方法而不是多态类(类只不过是具有通用(基类)和特定(子类)的属性组(数据字段、方法)的容器)

标签: oop polymorphism


【解决方案1】:

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

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

         Number
        /     \
       /       \
      /         \
  Integer      Real

每个类都定义了自己的一组操作,例如addmultiply。现在,我们可以将Integer 类型的object 用作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也可以用来描述函数的行为方式,例如,当我们声明同名但参数不同的函数时,编译器选择在特定情况下使用哪个实现(示例来自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 泛型函数/类(模板)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多