Smalltalk与Java';它是静态的吗?
Smalltalk与Java的静态字段和方法的等价物是什么?那么,当Smalltalker需要类级数据和/或方法时,他们会做什么呢?我们使用类端方法/实例变量。毕竟,类是一个对象,所以可以有方法 例如,矩形类有一个方法#origin:corner:因此您可以编写Smalltalk与Java';它是静态的吗?,java,oop,programming-languages,smalltalk,Java,Oop,Programming Languages,Smalltalk,Smalltalk与Java的静态字段和方法的等价物是什么?那么,当Smalltalker需要类级数据和/或方法时,他们会做什么呢?我们使用类端方法/实例变量。毕竟,类是一个对象,所以可以有方法 例如,矩形类有一个方法#origin:corner:因此您可以编写 Rectangle origin: 0@0 corner: 100@100 创建一个矩形。这就是消息#origin:corner:发送到名为Rectangle的对象(类是对象!),其中两点作为参数 类端实例变量的工作方式大致相同。作为
Rectangle origin: 0@0 corner: 100@100
创建一个矩形。这就是消息#origin:corner:发送到名为Rectangle的对象(类是对象!),其中两点作为参数
类端实例变量的工作方式大致相同。作为对象的类可能具有实例变量。从SUnit库:
TestCase class
instanceVariableNames: 'history'
然后TestCase类用一个getter/setter(#history和#history:)以通常的方式公开这一点
编辑:我使用的@
引起了不少讨论。这就是所谓的a,它允许定义选择器,这些选择器看起来就像其他语言所称的中缀运算符。例如,3+4
,或0@0
。在@
的情况下,Number
类定义了一个名为@
的方法,该方法取一个参数y
,定义为^Point x:self y:y
-“返回一个x坐标为我自己的值且y坐标为参数的点”
点是一个有序的对,但当然没有什么能阻止点定义更高维度的版本
Point
可能定义一个名为@
的方法,看起来像这样,例如:^Triple x:self x y:self y z:z
-“返回R^3中的一个点,其x、y坐标是我自己的,其z坐标是给定的参数”。在大多数类型的Smalltalk中,都有类变量。通常,类变量用于,例如。不过,Smalltalk的不同版本之间可以使用的变量类型有所不同,因此请阅读关于这一点的文档,以了解您的具体实现。如果您是从Java或类似的语言使用Smalltalk,最重要的思想转变是类是对象
类Java语言中的静态对象可以有许多不同的语义。通常这与可见性有关。您需要一个独立于类的任何实例的对象,但您希望将此对象的可见性限制在类内,即:仅从类的实例或类本身可见(在Smalltalk中,因为在Java中,类不是第一类对象)
在Smalltalk中,您通常有更多的选择:
Car
,使用实例变量color
,再加上一个类实例变量defaultcolor
(当然该变量的值为“BLACK”;-)
这是VisualWorks Smalltalk中的类定义(实际上是给对象Smalltalk
)的消息。
如果创建
Car
的子类,它将继承类实例变量defaultcolor
,就像普通对象一样。如果defaultcolor
class实例变量有一个值,子类也会继承这个值 不值得一个“正式”的答案,但我偶然发现了这个页面,它可能会帮助您:。除了Smalltalk之外,还有其他语言使用@来划分点的不同坐标吗?我相信我以前没有见过这种特定的语法。这是否表示元组?@是一条“二进制消息”-一条包含单个参数的消息,但不需要通常的尾随:。Number定义了一个名为@的方法,该方法返回一个点:^Point x:self y:y(其中y显然是唯一的参数)。
Smalltalk defineClass: #Car
superclass: #{Core.Object}
indexedType: #none
private: false
instanceVariableNames: 'colour '
classInstanceVariableNames: 'defaultColour'
imports: ''
category: ''