Какъв е еквивалентът на 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 излага това по обичайния начин, с getter/setter (#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 имате класови променливи. Обикновено променливите на класа се използват за напр. singletons. Въпреки това има разлики в типовете променливи, които можете да използвате между разновидностите на Smalltalk, така че прочетете документацията по този въпрос за вашата конкретна реализация.

person iwein    schedule 23.06.2010