Что такое Smalltalk-эквивалент статики Java? - PullRequest
10 голосов
/ 23 июня 2010

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

Ответы [ 3 ]

10 голосов
/ 23 июня 2010

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

Например, класс 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 является заданным параметром».

4 голосов
/ 01 сентября 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 имеет значение, подкласс также наследует это значение!

2 голосов
/ 23 июня 2010

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

...