实际上是运算符重载多态还是参数重载?
多态通常是指响应相同“消息”(方法名称)的不同类并执行不同的操作,所以
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
消息调用不同类的不同方法,但使用相同的消息名称+
。那么在这两种情况下,它们是多态的,而不是运算符重载?
上述准确无误吗?是否有可能添加到其中或在上面纠正的内容?
答案 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)
还有一个问题是,每种编程语言都会处理类不同的运算符。
我建议,避免运算符使用对象参数重载,并明确使用函数。