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