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

时间:2010-06-23 13:54:56

标签: java oop programming-languages smalltalk

Smalltalk相当于Java的静态字段和方法是什么? IOW,Smalltalkers在需要班级数据和/或方法时会怎么做?

3 个答案:

答案 0 :(得分:10)

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

例如,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:)公开它。

编辑:我使用的@引起了一些讨论。这就是所谓的binary message,它允许用户定义选择器,这些选择器看起来只是其他语言会调用的中缀运算符。例如,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坐标是给定的参数“。

答案 1 :(得分:4)

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

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

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

  1. 类实例变量
  2. 类变量或池变量(取决于您的Smalltalk方言)
  3. 类实例变量确实就像任何类的实例的实例变量一样:该类具有此属性,并且可以通过在类上提供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 :(得分:2)

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