首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OOP中,操作符重载实际上是多态性还是参数重载?

在OOP中,操作符重载实际上是多态性还是参数重载?
EN

Stack Overflow用户
提问于 2011-03-28 21:04:35
回答 4查看 1.6K关注 0票数 7

操作符重载实际上是多态性还是参数重载?

多态性通常引用不同的类来响应相同的“消息”(方法名)并做不同的事情,这是真的吗?

代码语言:javascript
复制
bird.give_sound()

代码语言:javascript
复制
car.give_sound()

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

代码语言:javascript
复制
bird.give_sound()

代码语言:javascript
复制
bird.give_sound(:frighten_sound)

可以有所不同。

所以操作符重载就是严格的参数重载?如下所示:

代码语言:javascript
复制
"foo" + "bar"
"foo" + 3

至少在Ruby语言中,它向包含foo的字符串发送+消息,第一行发送参数字符串,第二行发送参数3,+做的事情略有不同,但它们是相同的接收器类String

在下面的示例中,它是多态性:

代码语言:javascript
复制
"foo" + 3
1 + 3

因为+消息调用不同类的不同方法,但使用相同的消息名称+。所以在这两种情况下,它们是多态的,而不是操作符重载?

以上内容是否准确正确?上面有没有什么可以添加或更正的地方?

EN

回答 4

Stack Overflow用户

发布于 2011-03-28 21:23:11

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

简而言之,尽可能简短地总结……

给定相同的方法名(或"message"):

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

Stack Overflow用户

发布于 2011-03-28 21:15:45

我将在黑暗中试一试,并说这是一种(但不是真正的)两者。

每个对象必须以特定的方式处理给定的对象(操作符右侧的对象)。对于字符串,似乎会使用toString方法(或其他等效语言)。因此,您将始终附加一个字符串(作为Object传递给方法)。(Polymorphism)

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

票数 1
EN

Stack Overflow用户

发布于 2011-03-28 21:21:55

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

代码语言:javascript
复制
Shape
  Qudrilateral
    Rect
    Rhombus
  Elliptoid
    Oval
    Circle

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

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

因此,根据使用上下文,为给定对象定义运算符可能会导致多态或运算符重载。

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

https://stackoverflow.com/questions/5459381

复制
相关文章

相似问题

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