首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Smalltalk型系统

Smalltalk型系统
EN

Stack Overflow用户
提问于 2013-12-21 00:59:01
回答 3查看 2.4K关注 0票数 7

我对Smalltalk非常陌生,我想了解一些事情并确认其他(看看我是否有了这个想法):

1)在Smalltalk中,变量是非类型化的?

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

3)没有矫顽力,因为没有类型.?

( 4)是否有可能超载方法或操作人员?

( 5)是否有某种普遍性?我是说参数多态性?

( 6)在发送消息时,是否存在某种参数的兼容性/等效性检查?或者什么时候给变量赋值?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-21 01:38:13

1)变量没有声明的类型。它们都是隐式引用对象。物体知道它们是什么类型的。

2)没有隐式类型检查,但如果愿意,可以进行显式检查。查看isMemberOf:和isKindOf:方法。

3)正确。没有胁迫的概念。

( 4)操作员只是信息。任何对象都可以实现任何方法,是的,它有重载。

5) Smalltalk是泛型的终极。变量和集合可以包含任何对象。具有“泛型”的语言使变量和集合更加具体。去想一想。多态性基于接收方的类。若要执行多个多态性,请使用双重分派。

6)没有隐含的检查。您可以根据需要添加自己的显式检查。

票数 10
EN

Stack Overflow用户

发布于 2013-12-22 08:19:40

回答3)您可以使用#changeClassTo:、#changeClassToThatOf:和#佐普特Instance:等消息更改对象的类型。当然,关于什么可以转化为什么,有一些警告。请参阅方法注释。

票数 1
EN

Stack Overflow用户

发布于 2015-05-08 02:17:53

为了完成,Squeak图像中的一个例子是:

代码语言:javascript
复制
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. 显式检查类型/类的一种情况。当然,如果参数不是整数或分数,并且does_not_understand #adaptToInteger:andSend:,它将引发DNU (doesNotUnderstand见下文)。
  3. 某种“胁迫”在进行,但不是含蓄的。最后一行: ^aNumber adaptToInteger: self andSend:#+

向方法请求参数,以执行适当的操作,将自己添加到整数中。这可能涉及到要求原始接收者返回,比如说,他自己作为一个浮动版本。

  1. (没有真正显示,但暗示) #+是在多个类中定义的。运算符被定义为正则方法,它们被称为二进制方法。不同之处在于,一些Smalltalk方言将它们限制在两个字符的长度,以及它们的优先级。
  2. 发送接收器类型和参数的示例。它使用双重调度(见3)。
  3. 一个明确的检查需要它的地方。对象可以被视为具有类型(类),但变量不是。它们只保存对任何对象的引用,因为Smalltalk是动态类型的。

这也表明很多Smalltalk都是在Smalltalk中实现的,所以图像总是寻找这类东西的好地方。

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

当搜索到达继承链中的顶级类(想必是ProtoObject)并没有找到该方法时,就会向对象发送一个# to : message,其中的消息不被理解为参数),以防它想要处理遗漏。如果#doesNotUnderstand:未实现,则查找再次上升到对象,其实现将抛出一个错误。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20714259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档