Smalltalk中与Java的static等效的是什么?

10

Smalltalk中等同于Java静态字段和方法的是什么?即,当Smalltalkers需要类级别的数据和/或方法时,他们会做什么?


不值得“正式”的回答,但我偶然发现了这个页面,可能会对您有所帮助:http://per.bothner.com/papers/smalltalk.html。 - Carl Smotricz
3个回答

10
我们使用类方法/实例变量。毕竟,一个类也是一个对象,所以可以有方法。
例如,矩形类有一个 #origin:corner: 方法,所以可以编写如下代码:
Rectangle origin: 0@0 corner: 100@100

创建一个矩形。这只是消息#origin:corner:发送给名为Rectangle的对象(类是一个对象!),并带有两个点作为参数。

类侧实例变量的工作方式基本相同。一个类,作为一个对象,可以拥有实例变量。从SUnit库中:

TestCase class
  instanceVariableNames: 'history'

然后TestCase类以通常的方式公开这个内容,具有getter/setter (#history和#history:)。
编辑:我使用的@引起了很多讨论。它被称为二进制消息,允许定义看起来像其他语言中称为中缀运算符的选择器。例如,3 + 40@0。在@的情况下,Number类定义了一个名为@的方法,该方法接受一个参数y,定义为^Point x:self y:y - “返回一个点,其x坐标是我的值,y坐标是参数”。
Point是一个有序对,但当然也可以定义更高维度的版本。例如,Point可以定义一个名为@的方法,如下所示:^Triple x: self x y: self y z: z - “返回R^3中的一个点,其x,y坐标是我的,z坐标是给定的参数”。

除了Smalltalk之外,还有哪些语言使用@来分隔点的不同坐标?我认为我以前没有见过这种特定的语法。 - JAB
那个 @ 符号是表示元组吗? - Jim
@ 是一个“二进制消息” - 一条只带一个参数,但不需要通常的冒号结尾的消息。Number 定义了一个名为 @ 的方法,该方法返回一个 Point:^Point x: self y: y (其中y是唯一的参数,显然)。 - Frank Shearar

4
如果你从Java或类似语言转到Smalltalk,最重要的心态转变是认识到类是对象。
在Java等语言中,静态可以有许多不同的语义。通常这与可见性有关。你需要一个独立于类的任何实例的对象,但你希望限制这个对象的可见性仅限于类内部,也就是说:只能从类的实例或类本身中看到(在Smalltalk中,因为在Java中类不是一等对象)。
在Smalltalk中,你通常有更多选项:
1. 类实例变量 2. 类变量或池变量(取决于你使用的Smalltalk方言)
类实例变量确实就像任何类实例的实例变量:类具有这个属性,并且可以通过在类上提供一个getter方法(而不是在实例上,我们称之为类方法)来使其可访问于类的任何实例。如果你有默认值等情况,这很有用。例如:
定义一个名为Car的类,带有实例变量colour,加上一个类实例变量defaultColour(当然会有"BLACK"的值 ;-))。
Smalltalk defineClass: #Car
    superclass: #{Core.Object}
    indexedType: #none
    private: false
    instanceVariableNames: 'colour '
    classInstanceVariableNames: 'defaultColour'
    imports: ''
    category: ''

这是在VisualWorks Smalltalk中的一个类定义(实际上是对对象Smalltalk的一条消息)。

如果您创建Car的子类,它将继承类实例变量defaultColour,就像普通对象一样。如果defaultColour类实例变量有值,则子类也会继承这个值!


2
在大多数Smalltalk类型中,您都有类变量。通常,类变量用于单例等情况。不过,在不同的Smalltalk版本中,您可以使用的变量类型存在差异,因此请阅读特定实现的文档以了解这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接