是否可以在Smalltalk中重载运算符?
我正在寻找教程/示例。
感谢。
答案 0 :(得分:17)
Smalltalk中无法进行方法重载。相反,方法重写和名为double dispatch的技术的组合用于实现与其他语言中的运算符重载相同的行为。
您可以在数学运算符+,*,/,-
中找到示例实现(Smalltalk中的二进制消息)。这是一个想法:Integer>>+
的实现向其参数发送消息#addWithInteger:
。 #addWithInteger:
的实现是在每个Magnitude子类上实现的,例如专门添加Int + Int,Float + Int等...
答案 1 :(得分:11)
在大多数情况下,作为其他语言的运算符的东西都是Smalltalk一元或二进制消息,如+,*,/,...等等。类似可以自由地响应这些消息,因为它们看似合适,所以是的,你可以重新定义+的行为,你也可以让一些非数字类的实例理解并回应它。
例如,查看Point类中的+的实现。
有一点需要注意:=和^不是消息,因此无法以上述方式重新定义。
顺便说一句,为了学习Smalltalk,示例和代码的最大资源之一是Smalltalk图像。因此,我建议您启动Smalltalk,并学习浏览其中包含的大量示例的方法。
答案 2 :(得分:6)
除了作业外,没有小号操作符。一切都在类中作为方法实现。因此,如果您想要改变=或+ / - 方法的行为,只需看看它们的实现者。 或者,如果您想让您的类的实例理解这些消息,请执行它们。
答案 3 :(得分:1)
{Stack}上的operator-overloading
标签定义为
编程语言的一个特性,它允许运算符的自定义实现,具体取决于所涉及的操作数的类型。有些语言允许定义新的运算符,而其他语言只允许重新定义现有的运算符。
在Smalltalk中
所有类型都定义为对象类*
所有操作员都是方法*
所有方法都由消息的接收者以方法的名称执行
所有方法都可以被覆盖
因此,任何操作员操作的任何操作员都可以被任何开发人员覆盖。
以下是一些例子:
类Float
,类SmallInt
,类Fraction
和类Point
的对象都可以响应+
消息。他们也可以互相交流
aFloat := 3.1415 .
aSmallInt := '6' .
aPoint := 3@3 .
aFraction := 22/7 .
"将+ aSmallInt
讯息发送至aFraction
"
aSum := aFraction + aSmallInt
评估为:64/7
"将+ aFraction
讯息发送至aSmallInt
"
aSum := aSmallInt + aFraction
评估为:64/7
aSum := aFloat + aFraction
aSum := aFraction + aFloat
这些评估为:6.284357142857143
aSum := aFloat + aSmallInt
aSum := aSmallInt + aFloat
这些评估为:9.1415
aSum := aPoint + aSmallInt
aSum := aSmallInt + aPoint
这些评估为:9@9
实际上,我们在此处展示了+
运算符的8种不同实现,每种运算符都经过自定义以处理所涉及的操作数类型。
警告: *对象不是强类型的。一种类型的任何变量都可以更改为任何其他类型,系统不会引发异常。对象可以作为Class SmallInt的对象开始,然后更改为ByteString或Dictionary,系统不会发出最轻微的警告。直到发送一条它不理解的消息。
有6个基元不是对象或对象类: true,false,nil等。
有两个运算符实际上是命名方法的语法糖。
答案 4 :(得分:0)
Smalltalk没有运算符,但是您可以通过方法定义/重写来实现类似的目的:
Object subclass: Foo [
+ anObject [
"define new behavior for + here"
]
]