在OOP中,运算符重载实际上是多态还是参数重载?

时间:2011-03-28 13:04:35

标签: oop polymorphism overloading

实际上是运算符重载多态还是参数重载?

多态通常是指响应相同“消息”(方法名称)的不同类并执行不同的操作,所以

bird.give_sound()

car.give_sound()

可以做不同的事情。参数重载更多的是谈论同一个类,当与消息(方法名称)一起发送的参数不同时,做不同的事情。所以

bird.give_sound()

bird.give_sound(:frighten_sound)

可能不同。

那么运算符重载是严格的参数重载?像这样:

"foo" + "bar"
"foo" + 3

至少在Ruby中,它将+消息发送到包含foo的字符串,第一行是使用参数字符串发送,第二行是发送参数3,{ {1}}做一些稍微不同的事情,但它是相同的接收器类+

在以下示例中,它是多态:

String

因为"foo" + 3 1 + 3 消息调用不同类的不同方法,但使用相同的消息名称+。那么在这两种情况下,它们是多态的,而不是运算符重载?

上述准确无误吗?是否有可能添加到其中或在上面纠正的内容?

4 个答案:

答案 0 :(得分:2)

感谢您在评论中澄清上下文。是的,我会说你是对的。

总结尽可能短......

给出相同的方法名称(或“消息”):

  • 基于参数类型的不同行为是重载,
  • 基于对象类型的不同行为是多态性。

答案 1 :(得分:1)

我将在黑暗中采取刺,并说这是两种(但不是真的)。​​

每个对象必须以特定方式处理给定对象(运算符右侧的对象)。对于字符串,似乎将使用toString方法(或其他语言等效方法)。所以你总是会追加一个字符串(作为Object传递给方法)。 (的多态性

但是,您的对象可能需要根据给定的对象执行不同的逻辑。例如,假设您有一个Student对象。您可能有一个版本的方法采用Class对象,并将其添加到学生的课程表中。然后你可能有一个超载,比如一个Book,并将它添加到学生所需的阅读材料集合中。 (参数重载

答案 2 :(得分:0)

多态性是指一种数据类型动态表现为另一种数据类型。(动态类型转换)

Shape
  Qudrilateral
    Rect
    Rhombus
  Elliptoid
    Oval
    Circle

多态性自动为给定的对象上下文选择适当的area()方法

运算符重载是指为方法上下文选择正确的区域方法(即传递的参数数量或传递的参数类型)因此,如果Rect有两个区域方法,一个接受一个参数(正方形),另一个接受两个参数(任何其他矩形)

因此,根据使用情况,定义给定对象的运算符可能会导致多态性或运算符重载。

答案 3 :(得分:0)

好问题。

你发现的问题,我们有2个不同的概念,它们的语法类似,在应用编程时会发生冲突:重载和参数继承。

当我发现运算符重载时,我通常会考虑重载(方法)函数,以便更清楚。

当我读到这些时:

//(string)x =(string)“foo”+(int)3 x =“foo”+ 3

我想到了这些:

//(string)x =(string)“foo”.concat((int)3) x =“foo”.concat(3)

还有一个问题是,每种编程语言都会处理类不同的运算符。

我建议,避免运算符使用对象参数重载,并明确使用函数。