我对Smalltalk很新,想了解一些事情并确认其他事情(为了看看我是否有这个想法):
1)在Smalltalk中,变量是无类型的吗?
2)Smalltalk中唯一的“类型检查”发生在发送消息并且爬升继承层次结构以便将消息绑定到方法时?如果到达类Object,它会抛出运行时错误,因为该方法不存在?
3)没有强制,因为没有类型......?
4)是否可以重载方法或运算符?
5)是否存在某种通用性?我的意思是,参数多态?
6)发送消息时是否对参数进行某种兼容性/等价性检查?或者在分配变量时?
大多数问题可能都有很短的答案(如果我的方向正确的话)。
答案 0 :(得分:8)
1)变量没有声明的类型。它们都是对对象的隐式引用。对象知道它们是什么类型。
2)没有隐式类型检查,但如果您愿意,可以进行明确检查。查看方法isMemberOf:和isKindOf:。
3)正确。没有强制的概念。
4)运营商只是消息。任何对象都可以实现任何方法,是的,它有重载。
5)Smalltalk是通用的终极产品。变量和集合可以包含任何对象。具有“泛型”的语言使变量和集合更具体。去搞清楚。多态性基于接收器的类。要做多个多态,请使用双重调度。
6)没有隐式检查。您可以根据需要添加自己的显式检查。
答案 1 :(得分:1)
答案3)您可以使用#changeClassTo:,#changeClassToThatOf:和#adoptInstance:等消息更改对象的类型。关于什么可以转化为什么,当然有一些警告。请参阅方法评论。
答案 2 :(得分:1)
为了完成,来自Squeak图像的示例:
Integer>>+ aNumber
"Refer to the comment in Number + "
aNumber isInteger ifTrue:
[self negative == aNumber negative
ifTrue: [^ (self digitAdd: aNumber) normalize]
ifFalse: [^ self digitSubtract: aNumber]].
aNumber isFraction ifTrue:
[^Fraction numerator: self * aNumber denominator + aNumber numerator denominator: aNumber denominator].
^ aNumber adaptToInteger: self andSend: #+
这表明:
某种强制行为'继续,但不是含蓄的。最后一行:
^ aNumber adaptToInteger:self andSend:#+
要求方法的参数做适当的事情以将自己添加到整数。这可能涉及要求原始接收者将自己的版本作为Float返回。
这也表明很多Smalltalk都是在Smalltalk中实现的,所以图像总是一个寻找这种东西的好地方。
关于DNU错误,它们实际上涉及的更多:
当搜索到达继承链中的顶级类(可能是ProtoObject)并且找不到该方法时,会将#doesNotUndertand:消息发送到该对象,并且该消息不被理解为参数)以防它想要处理小姐。如果没有实现#doesNotUnderstand:那么查找会再次爬到Object,它的实现就是抛出一个错误。
注意:我不确定类和类型之间的等价性,所以我试着小心这一点。