Smalltalk相当于Java的静态字段和方法是什么? IOW,Smalltalkers在需要班级数据和/或方法时会怎么做?
答案 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 + 4
或0@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中,您通常有更多选择:
类实例变量确实就像任何类的实例的实例变量一样:该类具有此属性,并且可以通过在类上提供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的各种风格之间可以使用的变量类型也有所不同,因此请阅读有关此特定实现的文档。