Smalltalk的运营商可以超载吗?

时间:2011-06-30 05:41:06

标签: operator-overloading smalltalk

是否可以在Smalltalk中重载运算符?

我正在寻找教程/示例。

感谢。

5 个答案:

答案 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"

  ]
]