Sto facendo ricerche in Reflection Smalltalk e mi chiedevo se fosse possibile estendere un singolo oggetto come sarebbe possibile ad esempio in Ruby. Con questo intendo un selettore a cui solo oggetti particolari rispondono.È possibile estendere un singolo oggetto in Smalltalk
Ecco un codice Ruby che indica cosa intendo. Per chiarimenti: in Ruby questo apre una classe virtuale per questo oggetto e la estende con una nuova definizione. La parte vitale qui è che nulla cambia nella definizione della classe!
o = Object.new
o.instance_eval {def foo;puts "foo";end}
o.foo #=> "foo"
#however this will fail:
m = Object.new
m.foo #=> NoMethod error
Più in particolare la mia domanda è se questo è possibile in Squeak Standard/Pharo o altre implementazioni Smalltalk, senza l'aggiunta di strutture o codice sostanziali per permettere questo. Quindi con altre parole con caratteristiche riflessive regolari che esistono in Smalltalk.
Ad esempio, è possibile aggiungere metodi, rimuovere metodi, compilare un nuovo codice in una classe, modificare variabili di istanza e qualsiasi cosa, ma non ho trovato un modo per estendere un singolo oggetto.
Test addInstVarNamed: #var.
Test compile: 'var ^var'.
t:= Test new.
Test instVarNames.
t instVarNamed: #var put: 666.
t var. #=> 666
Se la risposta è no, allora spiegare perché. Non sto cercando di risolvere questo problema, ma piuttosto di capire perché non si tratta di un piccolo problema.
Ho già letto il primo link, ma può essere ancora difficile capire l'idea reale che c'è dietro come hai appena spiegato. Darò sicuramente un'occhiata agli altri link. Risposta eccellente – froginvasion
Forse lo screencast (link 3d) ti darà una migliore comprensione. Sto cercando di trovare * la * carta che spiega in dettaglio come funzionano le classi leggere, ma non riesco a trovarlo. Dammi solo un paio di minuti :) –
Siamo spiacenti, non riesco ancora a trovarlo. Ho aggiunto un quinto link con un'eccellente spiegazione su come funziona la ricerca dei metodi in Smalltalk e le diverse tecniche utilizzate per manipolare il recapito dei messaggi. Si riferisce anche all'approccio di classe leggero. –