Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Smalltalk与Java';它是静态的吗?_Java_Oop_Programming Languages_Smalltalk - Fatal编程技术网

Smalltalk与Java';它是静态的吗?

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的对象(类是对象!),其中两点作为参数 类端实例变量的工作方式大致相同。作为

Smalltalk与Java的静态字段和方法的等价物是什么?那么,当Smalltalker需要类级数据和/或方法时,他们会做什么呢?

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

例如,矩形类有一个方法#origin:corner:因此您可以编写

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中,您通常有更多的选择:

  • 类实例变量
  • 类变量或池变量(取决于Smalltalk方言)
  • 类实例变量实际上就像任何类实例的实例变量:该类具有此属性,并且可以通过在类上提供getter方法(而不是在实例上,我们称之为类方法)来访问该类的任何实例。如果您有默认值等,这将非常有用。例如:

    定义一个类
    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: ''