我对Smalltalk非常陌生,我想了解一些事情并确认其他(看看我是否有了这个想法):
1)在Smalltalk中,变量是非类型化的?
2) Smalltalk中唯一的“类型检查”发生在消息被发送并且继承层次结构被提升以便将消息绑定到方法上时?如果到达类对象,它会抛出一个运行时错误,因为该方法不存在?
3)没有矫顽力,因为没有类型.?
( 4)是否有可能超载方法或操作人员?
( 5)是否有某种普遍性?我是说参数多态性?
( 6)在发送消息时,是否存在某种参数的兼容性/等效性检查?或者什么时候给变量赋值?
大多数问题可能有很短的答案(如果我是在正确的方向)。
发布于 2013-12-21 01:38:13
1)变量没有声明的类型。它们都是隐式引用对象。物体知道它们是什么类型的。
2)没有隐式类型检查,但如果愿意,可以进行显式检查。查看isMemberOf:和isKindOf:方法。
3)正确。没有胁迫的概念。
( 4)操作员只是信息。任何对象都可以实现任何方法,是的,它有重载。
5) Smalltalk是泛型的终极。变量和集合可以包含任何对象。具有“泛型”的语言使变量和集合更加具体。去想一想。多态性基于接收方的类。若要执行多个多态性,请使用双重分派。
6)没有隐含的检查。您可以根据需要添加自己的显式检查。
发布于 2013-12-22 08:19:40
回答3)您可以使用#changeClassTo:、#changeClassToThatOf:和#佐普特Instance:等消息更改对象的类型。当然,关于什么可以转化为什么,有一些警告。请参阅方法注释。
发布于 2015-05-08 02:17:53
为了完成,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: #+这表明:
向方法请求参数,以执行适当的操作,将自己添加到整数中。这可能涉及到要求原始接收者返回,比如说,他自己作为一个浮动版本。
这也表明很多Smalltalk都是在Smalltalk中实现的,所以图像总是寻找这类东西的好地方。
关于DNU错误,它们实际上涉及得更多一些:
当搜索到达继承链中的顶级类(想必是ProtoObject)并没有找到该方法时,就会向对象发送一个# to : message,其中的消息不被理解为参数),以防它想要处理遗漏。如果#doesNotUnderstand:未实现,则查找再次上升到对象,其实现将抛出一个错误。
注意:我不确定类和类型之间的等价性,所以我试着注意这一点。
https://stackoverflow.com/questions/20714259
复制相似问题