2010-01-25 9 views
5

Sono nuovo di OOP, ma con uno sfondo "procedurale".Superclasse smalltalk vs metaclass?

Attualmente sto cercando di orientarmi su OOP tramite GNU Smalltalk e Lovejoy "Smalltalk: Getting The Message".

Sono confuso sul fatto che il metaclass e la classe Metaclass sono, rispetto alla superclasse. Riesco a vedere il flusso ereditario della superclasse -> classe -> sottoclasse; ma non vedo come/dove si inserisce metaclass. TIA ...

risposta

5

C'è una descrizione eccellente nel libro online gratuito Pharo by Example, capitolo 13 (Classi e metaclassi). Le cose spiegate in questo capitolo sono comuni a tutte le implementazioni Smalltalk.

+0

Grazie per il link! Sembra essere quello che sto cercando. – duke

+1

Dovresti includere l'essenza del libro che risponde a questa domanda invece di limitarti a fare riferimento a un link. Una volta che il collegamento viene interrotto, questa risposta non diventa più utile –

4

Esistono in realtà due livelli di ereditarietà: ereditarietà di un'istanza e ereditarietà di classe.

Smalltalk ha uno schema speciale che consente di passare intorno alle classi come oggetti. Ciò significa che le classi sono anche oggetti nei propri diritti. Il metaclasse è "semplicemente" la classe dell'oggetto della classe.

Non interferisce con l'ereditarietà di istanza normale, quindi non si adatta a nessuno nello schema superclass -> class -> subclass utilizzato.

+0

@ zneak -> "Il metaclasse è" semplicemente "la classe dell'oggetto della classe." Ho pensato che la superclasse fosse "la classe dell'oggetto della classe". Questa è la mia domanda in realtà: qual è la differenza tra superclasse e metaclasse? – duke

+0

"Esistono in realtà due livelli di ereditarietà: ereditarietà di un'istanza e ereditarietà di classe." Da questa formulazione, direi che stai confondendo ereditarietà e instanciazione ... –

+0

Questo è proprio quello che intendevo. Le sottoclassi possono ignorare quelli che chiameremmo metodi statici in altre lingue. – zneak

3

ci sono due differenti relazioni in OO basato su classi: di istanza e eredità.

Instantiation è il rapporto tra un oggetto e la sua classe, la parola chiave new, ecc Di solito è implementato da un puntatore nella rappresentazione basso livello di qualsiasi oggetto. In Smalltalk, anObject class attraversa questo puntatore; accade anche che le classi siano anche oggetti, e le classi di classi sono chiamate metaclassi, ma questa è la stessa relazione che con le istanze.

Ereditarietà è una relazione tra le classi. Puoi passare da una classe alla sua superclasse facendo aClass superclass e continua così fino a quando non arrivi alla classe Object. In Smalltalk, il puntatore superclass è solo una variabile di istanza definita su tutte le classi e il messaggio superclass è un normale accesso.

0

Come concetto, uno superclass è il genitore della classe di un oggetto. Ad esempio, la Classe un livello più in alto nella gerarchia di Classe rispetto alla Classe dell'oggetto corrente.

Come metodo denominato, restituisce il nome della superclasse immediata del destinatario. ad es. è definedin Squeak Smalltalk (e anche nei suoi derivati, Pharo e Cuis) come superclass "Answer the receiver's superclass, a Class." ^superclass

In Dolphin Smalltalk, è definita come `superclasse "Risposta ad una che è immediato superclasse del ricevente (o se nessuno)."

^superclass' 

Ma - ogni classe nella gerarchia di classe è in realtà un'istanza della sua classe padre. Quindi la Classe di cui una determinata Classe è un'istanza, è la MetaClass della Classe.

Così, ad es. aSortedCollection è un oggetto, un'istanza di Class SortedCollection.

SortedCollection è una classe denominata Class 'SortedCollection' nella gerarchia di classi browsable. Allo stesso tempo, è anche un'istanza di un Metaclass - una Classe anonima che ha un'istanza di oggetto Singleton, che è una Classe con nome. La classe indicata è visibile nella gerarchia di classi, ma Metaclass (essendo anonimo) è molto meno visibile. È così che Smalltalk

Smalltalk mantiene una gerarchia di Metaclass, ovvero una gerarchia delle Classi delle Classi. È molto meno visibile, in quanto è considerato come oggetti di sistema anonimi, ma è possibile trovare il livello più alto della gerarchia Metaclass nel browser Class. Sia la classe che la classe Metaclass devono essere trovate come sottoclassi della classe Behaviour, a sua volta una sottoclasse della classe Object.

Una ragione per cui la gente dice che "In Smalltalk, tutto è un oggetto" è perché la classe Object è la radice di tutte le altre classi e oggetti - è in cima alla gerarchia dell'oggetto, che contiene la gerarchia di classi e la gerarchia Metaclass.

(E 'generalmente in questa fase che il mio cervello inizia a sanguinare fuori delle mie orecchie, ma esimo dopo 3 punti contribuire a spingere tutto indietro al mio cranio)

Se si invia il messaggio anInstanceOfAClass class - Avrai get
restituita la classe dell'oggetto anInstanceOfAClass.

Se si invia il messaggio anInstanceOfAClass class superclass - si otterrà
la classe padre della classe dell'oggetto anInstanceOfAClass restituita.

Se si invia il messaggio anInstanceOfAClass class class - si otterrà il singleton Metaclass anonimo della Classe dell'oggetto restituito daInstanceOfAClass dell'oggetto.