2010-12-10 15 views

risposta

5

La risposta breve è "La tua ipotesi che le Classi sono istanze di un sistema di Classe è sbagliato, ogni Classe è in realtà un'istanza di un Metaclass specifico di Classe" e inoltre "non funzionerebbe in nessun altro modo".

Una leggera modifica alla risposta è "i nomi sono davvero confusi, a volte è più semplice memorizzare i loro ruoli e non cercare di pensare troppo a come funzionano".

risposta peloso breve:

metaclasse è un esempio, così come tutte le altre Classi Smalltalk ordinarie, e richiede una propria classe dedicata. Ogni istanza di un oggetto Smalltalk regolare ha una classe, con ereditarietà che segue la gerarchia di classi. Ogni classe è di per sé un'istanza di un metaclasse specifico della classe, con ereditarietà che segue la gerarchia del metaclasse. Ogni metaclasse è di per sé un'istanza della classe Metaclass, che viene cortocircuitata dalla macchina virtuale in un piccolo e semplice trucco, dal momento che nessuno ha trovato l'utilità di dare alla classe Metaclass un genitore, e tutti quelli che hanno provato hanno generalmente trovato che la loro sanità mentale stava iniziando a erodere nel processo.

Longer, ancora risposta peloso:

Smalltalk permette per ogni classe di contenere messaggi specifici di classe. Questi sono equivalenti, approssimativamente, a metodi statici in Java - ma con alcune differenze significative. Una di queste differenze è che le classi Smalltalk sono in realtà oggetti istanziati - sono oggetti attivi nel sistema, completi della possibilità di ereditare da altri oggetti e di contenere variabili di istanza.

Questa proprietà conduce a una potenziale moltitudine di gerarchie di ereditarietà nel sistema. Gli oggetti regolari sono istanze di esattamente una classe, con il messaggio che invia a un oggetto che cerca la classe degli oggetti e quindi segue la catena di ereditarietà della gerarchia di classi. I messaggi inviati agli oggetti regolari vengono risolti sulla gerarchia delle classi.

Inoltre, gli oggetti di classe sono ciascuna istanza di un Metaclass specifico di una classe. I messaggi inviati a un oggetto classe vengono risolti effettuando ricerche sul metaclasse specifico della classe e quindi verso l'alto nella gerarchia metaclass.

Su un altro livello, gli oggetti metaclasse sono istanze di una classe Metaclass unica del sistema. I messaggi inviati a un oggetto metaclass vengono esaminati nel Metaclass univoco del sistema, che non può ereditare da nessuno ed è cablato come un corto circuito nella VM.

Tecnicamente, il sistema ha due gerarchie di ereditarietà e un terzo che è simulato con un cortocircuito. Non c'è una ragione teorica per fermarsi alle due, anche se ce ne sono molte pratiche.Ciò consente a ciascun oggetto di avere il proprio, l'oggetto unico, i messaggi, ogni classe di avere il proprio, classe unica, i messaggi e forza tutti i metaclassi a rispondere a un solo insieme di messaggi, definito in Metaclass.

Niente, eh?

+1

Naturalmente, se si fa via con le classi del tutto, ala http://selflanguage.org/, è non devi mai preoccuparti di nulla lontanamente come questo. – blueberryfields

+0

Sì, ma perché le metaclassi sono istanze di Metaclass e non di classe? –

+0

Oops, le mie dita si spalancano ... È una convenzione di denominazione. Allo stesso modo i punti sono istanze di Punto. – blueberryfields

3

Hai chiaramente bisogno di due ClassDescriptions per una classe: una per i metodi di istanza e una per i metodi di classe.

Ora è possibile provare a utilizzare Class per entrambi gli oggetti. Penso che uno dei motivi per avere Metaclass è che devi distinguere i due. Se osservate i metodi theMetaClass e theNonMetaClass, vedete che si stanno specchiando a vicenda: passate da metaclasse a classe attraverso questo membro di classe, e da classe a metaclasse attraverso il puntatore di classe regolare (qualsiasi oggetto possesi). Se entrambi erano di classe di esempio, non potevano sapere da che parte si implementavano - a meno che non ci fosse uno slot di bandiera, il che è peggio della creazione di sottoclassi.

1

Questa è una di quelle cose che capisco perfettamente ... fino a quando devo spiegarlo ;-) Dopo molte distillazione ...

Dato:

  • comportamento di un oggetto è specificato da le classi classe
  • sono oggetti, anche
  • regolari-oggetti/classi hanno un comportamento che senso solo per regolare-oggetti/classi

Pertanto, le classi e le istanze dovrebbero avere identificatori di comportamento diversi (ad es. classi).

Guardato in un altro modo, ciò che chiamiamo "lato istanza" rappresenta il lato dell'istanza della classe . Ciò che chiamiamo "lato classe" rappresenta il lato dell'istanza della metamera .

Ad esempio, Class definisce #addClassVarNamed: e #addInstVarNamed :, perché entrambi hanno senso sul lato dell'istanza, dove Metaclass definisce solo #addInstVarNamed :, poiché non esistono variabili di classe lato classe.

Per scavare più a fondo nella minuzia, vedere "Pharo l'esempio" o "Fondamenti di Smalltalk tecnica di programmazione"

Problemi correlati