Что такое Smalltalk-эквивалент статических полей и методов Java? IOW, что делают Smalltalkers, когда им нужны данные и/или методы уровня класса?
Что такое Smalltalk эквивалент статики Java?
Ответы (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 Jim; 23.06.2010
Если вы пришли к Smalltalk с Java или чего-то подобного, самое важное, что нужно изменить в сознании, — это то, что классы — это объекты.
Статика в Java-подобных языках может иметь различную семантику. Обычно это связано с видимостью. Вам нужен объект, независимый от каких-либо экземпляров класса, но вы хотите ограничить видимость этого объекта внутри класса, то есть: видимым только из экземпляров класса или самого класса (в Smalltalk, потому что в Java классы не являются объектами первого класса).
В Smalltalk у вас обычно больше возможностей для этого:
- Переменные экземпляра класса
- Переменные класса или переменные пула (в зависимости от вашего диалекта 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
имеет значение, подкласс также наследует это значение!
В большинстве типов Smalltalk у вас есть переменные класса. Обычно переменные класса используются, например, для одиночки. Существуют различия в типах переменных, которые вы можете использовать между разновидностями Smalltalk, поэтому прочитайте документацию по этому вопросу для вашей конкретной реализации.