Smalltalk型系统

时间:2013-12-21 00:59:02

标签: smalltalk

我对Smalltalk很新,想了解一些事情并确认其他事情(为了看看我是否有这个想法):

1)在Smalltalk中,变量是无类型的吗?

2)Smalltalk中唯一的“类型检查”发生在发送消息并且爬升继承层次结构以便将消息绑定到方法时?如果到达类Object,它会抛出运行时错误,因为该方法不存在?

3)没有强制,因为没有类型......?

4)是否可以重载方法或运算符?

5)是否存在某种通用性?我的意思是,参数多态?

6)发送消息时是否对参数进行某种兼容性/等价性检查?或者在分配变量时?

大多数问题可能都有很短的答案(如果我的方向正确的话)。

3 个答案:

答案 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: #+

这表明:

  1. 这些课程可以作为某种实用的打字工具,有效区分可以总结的事物(见下文)。
  2. 显式检查Type / Class的情况。当然,如果参数不是Integer或Fraction,并且do_not_understand #adaptToInteger:andSend:,它将引发一个DNU(doNotUnderstand见下文)。
  3. 某种强制行为'继续,但不是含蓄的。最后一行:

    ^ aNumber adaptToInteger:self andSend:#+

  4. 要求方法的参数做适当的事情以将自己添加到整数。这可能涉及要求原始接收者将自己的版本作为Float返回。

    1. (并没有真正展示,但暗示)#+在多个班级中定义。运算符被定义为常规方法,它们被称为二进制方法。区别在于一些Smalltalk方言将它们限制为两个字符长度,以及它们的优先级。
    2. 调度接收器类型和参数的示例。它使用双重调度(见3)。
    3. 明确检查所需的位置。对象可以看作是类型(类),但变量不是。它们只是保存对任何对象的引用,因为Smalltalk是动态类型的。
    4. 这也表明很多Smalltalk都是在Smalltalk中实现的,所以图像总是一个寻找这种东西的好地方。

      关于DNU错误,它们实际上涉及的更多:

      当搜索到达继承链中的顶级类(可能是ProtoObject)并且找不到该方法时,会将#doesNotUndertand:消息发送到该对象,并且该消息不被理解为参数)以防它想要处理小姐。如果没有实现#doesNotUnderstand:那么查找会再次爬到Object,它的实现就是抛出一个错误。

      注意:我不确定类和类型之间的等价性,所以我试着小心这一点。