Sto imparando le basi di Smalltalk. C'è una parola chiave super
che viene utilizzato per chiamare un metodo da superclasse all'interno di un metodo sottoclasse:Parola chiave "super" nel metodo classe
Object subclass: # A
test
^1
A subclass: # B
test
^2
callSuper
^super test
Così B new callSuper
viene valutato come 1
.
OK. Questo è chiaro
Così ora, sto definendo una serie di metodi di classe per B
classe:
createNew1
^super new
createNew2
^self new
create
^self
createSuper
^super
E loro valuta, rispettivamente a a B
, a B
, B
e un errore (che mi mostra che super
non è un cast sottoclasse ma tipo di un dispatcher di messaggi).
Perché ricevo istanze di classe B
nonostante la parola chiave super
? E qual è la differenza tra gli oggetti a B
e B
? Ho iniziato a pensare che l'oggetto B
sia un'istanza speciale, singletone (proprio come gli attributi static
implementati in altre lingue) della classe B
, ma ancora - ho controllato ed è classe B
e sottoclasse è A
.
Qual è la semantica della parola chiave super
nei metodi di classe? Come si differenzia dalla semantica all'interno dei metodi degli oggetti? Qual è realmente l'oggetto che può essere ottenuto chiamando il metodo self
all'interno della classe?
Se hai familiarità con C#, tutto ha senso se consideri ogni metodo Smalltalk (istanza o classe) come dichiarato come virtuale. –
"L'espressione B nuovo runest è valutata come 'A'" No! Stai effettivamente valutando questo codice, o semplicemente facendo un esperimento mentale ?! Uno dei grandi vantaggi di Smalltalk è quanto sia facile fare esperimenti. Se valuti "B new runTest", vedrai che restituisce "B" –
@SeanDeNigris Forse non è chiaro a causa del mio povero inglese, ma volevo scrivere, che stavo pensando che è valutato su "A" mentre in Infatti è valutato su "B" (che è scritto nel prossimo paragrafo). Proverò a modificare questo e renderlo chiaro. –