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 + 4
或0@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中,您通常有更多选择:
- 类实例变量
- 类变量或池变量(取决于您的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的各种风格之间使用变量类型存在差异,因此请阅读有关此特定实现的文档。
- 在写入文件之前触发了Java 7 Watch Service ENTRY_CREATE
- 如何使用flexjson.deserializer将jsonarray反序列化为java中的List ?
- 使用AbstractRoutingDataSource动态更改数据库架构/目录
- 根据“尽力而为1PC”模式实现Spring ChainedTransactionManager
- 在Dataflow Generic中进行转换
- 打印出数组列表中的所有对象
- 使用值从HashMap获取密钥
- HotSwaping代码变成“mvnDebug tomcat:run”
- org.dbunit.dataset.NoSuchTableException:未在架构’null’中找到表’xxx’