Smalltalk相当于Java的静态是什么?

什么是Java的静态字段和方法的Smalltalk等价物? IOW,Smalltalkers在需要类级数据和/或方法时会做些什么?

我们使用类方法/实例变量。 毕竟,类是一个对象,所以可以有方法。

例如,Rectangle类有一个方法#origin:corner:所以你可以写

Rectangle origin: 0@0 corner: 100@100 

创建一个Rectangle。 这只是消息#origin:corner:发送到名为Rectangle的对象(一个类是一个对象!),其中两个Point作为参数。

类侧实例变量的工作方式大致相同。 作为对象的类可以具有实例变量。 来自SUnit库:

 TestCase class instanceVariableNames: 'history' 

然后TestCase类以通常的方式使用getter / setter(#history和#history :)公开它。

编辑:我使用的@引起了相当多的讨论。 这就是所谓的二进制消息 ,它允许用户定义只看其他语言会调用中缀运算符的选择器。 例如, 3 + 40@0 。 在@的情况下, Number类定义一个名为@的方法,取一个参数y ,定义为^Point x: self y: y – “返回一个Point,其x坐标是我自己的值,其y坐标是参数”。

Point是一个有序的对,但当然没有什么可以阻止定义更高维度的版本。 Point可能会定义一个名为@的方法,例如: ^Triple x: self xy: self yz: z – “返回R ^ 3中的一个点,其x,y坐标是我自己的,其z坐标是给定参数“。

如果从Java等来到Smalltalk,那么最重要的思维转变是类是对象。

类Java语言中的静态可以具有许多不同的语义。 通常这与可见性有关。 您需要一个独立于类的任何实例的对象,但是您希望将此对象的可见性限制在类中,即:仅从类的实例或类本身可见(在Smalltalk中,因为在Java中)类不是一流的对象)。

在Smalltalk中,您通常有更多选择:

  1. 类实例变量
  2. 类变量或池变量(取决于您的Smalltalk方言)

类实例变量确实就像任何类的实例的实例变量一样:该类具有此属性,并且通过在类上提供getter方法(而不是实例,我们可以使这个类的任何实例都可以访问它)称之为类方法)。 如果您有默认值等,这很有用。 例:

定义一个类Car ,用实例变量colour ,PLUS一个类实例变量defaultColour (当然它的值为“BLACK”;-))

 Smalltalk defineClass: #Car superclass: #{Core.Object} indexedType: #none private: false instanceVariableNames: 'colour ' classInstanceVariableNames: 'defaultColour' imports: '' category: '' 

这是VisualWorks Smalltalk中的类定义(实际上是对象Smalltalk的消息)。 如果您创建Car的子类,它将inheritance类实例变量defaultColour ,因为普通对象也会这样做。 如果defaultColour类实例变量有值,则子类也inheritance此值!

在大多数类型的Smalltalk中,您都有类变量。 通常,类变量用于例如单例 。 尽管如此,您可以在Smalltalk的各种风格之间使用变量类型存在差异,因此请阅读有关此特定实现的文档。