Mi piacerebbe sapere il motivo per cui sono state utilizzate due classi diverse, invece di usare solo Class per entrambi.Perché le istanze di Metaclass sono Metaclass e non Class?
risposta
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?
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.
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"
- 1. Ruby metaclass confusion
- 2. Ruby metaclass follia
- 3. Superclasse smalltalk vs metaclass?
- 4. Remove Single Metaclass Method
- 5. Metaclass Python: Comprensione di 'with_metaclass()'
- 6. Perché la mappa di Groovy non ha metaClass?
- 7. Metaclass non viene chiamato nelle sottoclassi
- 8. Quando "metaClass" di Groovy restituisce null
- 9. Cython Metaclass .pxd: Come dovrei implementare `__eq __()`?
- 10. Cosa c'è di sbagliato in questo semplice metaclass python?
- 11. Errore di Pylint quando si utilizza la metaclass
- 12. La metaClass di Groovy non riesce quando il metodo di overriding viene chiamato nel costruttore?
- 13. Posso trasmettere un oggetto metaclass a un tipo di protocollo in Swift?
- 14. Perché le istanze di `java.time.ZoneOffset` sono ordinate 'all'indietro'?
- 15. Le istanze di classe Class sono garantite come singleton per classloader?
- 16. Le istanze di Django Model sono lavabili?
- 17. Le "class var" sono inizializzate a zero?
- 18. Come faccio a fare riferimento all'istanza GroovyObject dai metodi MetaClass in Groovy?
- 19. Perché le istanze Python non hanno attributo __name__?
- 20. wsimport .wsdl: perché generare file .class e non file .java?
- 21. Perché le mie importazioni non sono riconosciute
- 22. Le istanze di Google Container Engine sono accessibili tramite DNS?
- 23. C# Tutte le istanze di pipe sono occupate
- 24. Perché le continuazioni non sono utili?
- 25. Perché le password originali non sono memorizzate?
- 26. Perché più istanze dell'oggetto Method sono per i metodi ereditati
- 27. Perché le letture non sono dichiarate covarianti?
- 28. Le istanze del programma di pianificazione Quartz sono sicure?
- 29. Che cosa sono esattamente le istanze di Windows Azure?
- 30. Perché .class: last-of-type non funziona?
Naturalmente, se si fa via con le classi del tutto, ala http://selflanguage.org/, è non devi mai preoccuparti di nulla lontanamente come questo. – blueberryfields
Sì, ma perché le metaclassi sono istanze di Metaclass e non di classe? –
Oops, le mie dita si spalancano ... È una convenzione di denominazione. Allo stesso modo i punti sono istanze di Punto. – blueberryfields