Что такое Smalltalk эквивалент статики Java?

Что такое Smalltalk-эквивалент статических полей и методов Java? IOW, что делают Smalltalkers, когда им нужны данные и/или методы уровня класса?


person Jim    schedule 23.06.2010    source источник
comment
Не стоит формального ответа, но я наткнулся на эту страницу, которая может вам помочь: per.bothner. com/papers/smalltalk.html .   -  person Carl Smotricz    schedule 23.06.2010


Ответы (3)


Мы используем методы/переменные экземпляра на стороне класса. В конце концов, класс — это объект, поэтому он может иметь методы.

Например, класс Rectangle имеет метод #origin:corner:, так что вы можете написать

Rectangle origin: 0@0 corner: 100@100

для создания прямоугольника. Это просто сообщение #origin:corner:, отправленное объекту Rectangle (класс — это объект!) с двумя точками в качестве параметров.

Переменные экземпляра на стороне класса работают почти так же. Класс, будучи объектом, может иметь переменные экземпляра. Из библиотеки SUnit:

TestCase class
  instanceVariableNames: 'history'

а затем класс TestCase предоставляет это обычным способом с помощью геттера/установщика (#history и #history:).

РЕДАКТИРОВАТЬ: @, который я использовал, вызвал немало дискуссий. Это так называемое бинарное сообщение, которое позволяет определять селекторы, которые выглядят точно так же, как другие языки. будет вызывать инфиксные операторы. Например, 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 является заданным параметром".

person Frank Shearar    schedule 23.06.2010
comment
Используют ли какие-либо языки, кроме Smalltalk, @ для разграничения различных координат точки? Я не верю, что видел этот конкретный синтаксис раньше. - person JAB; 23.06.2010
comment
Это @ указывает на кортеж? - person Jim; 23.06.2010
comment
@ — это двоичное сообщение — сообщение, которое принимает один параметр, но не нуждается в обычном завершающем :. Number определяет метод с именем @, который возвращает Point: ^Point x: self y: y (где y, очевидно, единственный параметр). - person Frank Shearar; 23.06.2010

Если вы пришли к Smalltalk с Java или чего-то подобного, самое важное, что нужно изменить в сознании, — это то, что классы — это объекты.

Статика в Java-подобных языках может иметь различную семантику. Обычно это связано с видимостью. Вам нужен объект, независимый от каких-либо экземпляров класса, но вы хотите ограничить видимость этого объекта внутри класса, то есть: видимым только из экземпляров класса или самого класса (в Smalltalk, потому что в Java классы не являются объектами первого класса).

В Smalltalk у вас обычно больше возможностей для этого:

  1. Переменные экземпляра класса
  2. Переменные класса или переменные пула (в зависимости от вашего диалекта Smalltalk)

Переменная экземпляра класса действительно похожа на переменную экземпляра экземпляров любого класса: класс имеет это свойство, и его можно сделать доступным для любого экземпляра класса, предоставив метод получения для класса (не для экземпляров, мы назовите это методом класса). Это полезно, если у вас есть значения по умолчанию и тому подобное. Пример:

Определите класс Car с переменной экземпляра colour, ПЛЮС переменную экземпляра класса defaultColour (которая, конечно, будет иметь значение «ЧЕРНЫЙ» ;-))

Smalltalk defineClass: #Car
    superclass: #{Core.Object}
    indexedType: #none
    private: false
    instanceVariableNames: 'colour '
    classInstanceVariableNames: 'defaultColour'
    imports: ''
    category: ''

Это определение класса (фактически сообщение объекту Smalltalk) в VisualWorks Smalltalk. Если вы создаете подкласс Car, он наследует переменную экземпляра класса defaultColour, как и обычный объект. Если переменная экземпляра класса defaultColour имеет значение, подкласс также наследует это значение!

person robject    schedule 01.09.2010

В большинстве типов Smalltalk у вас есть переменные класса. Обычно переменные класса используются, например, для одиночки. Существуют различия в типах переменных, которые вы можете использовать между разновидностями Smalltalk, поэтому прочитайте документацию по этому вопросу для вашей конкретной реализации.

person iwein    schedule 23.06.2010