# FacetsTip #1: Class.subclasses

**URL:** <https://www.ruby-forum.com/t/facetstip-1-class-subclasses/98420>\
**Category:** IT\
**Created:** [July 14, 2006, 5:21pm UTC](https://www.ruby-forum.com/t/facetstip-1-class-subclasses/98420 "2006-07-14T17:21:15Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Paolo\_DonSSSS](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/898d66/32.png) [@Paolo\_DonSSSS](https://www.ruby-forum.com/u/Paolo_DonSSSS)\
**Post date:** [July 14, 2006, 5:21pm UTC](https://www.ruby-forum.com/t/facetstip-1-class-subclasses/98420/1 "2006-07-14T17:21:15Z")

</div>

Anche se l’esempio è banale,  
colgo lo spunto di Gabriele e incomincio la gloriosa…

\*\*\* Ruby-it FacetsTip Series  
\*\*\* FacetsTip #1: Class.subclasses

Facile facile giusto per cominciare:

E:\prj\archeodata\>irb  
irb(main):001:0\> class Base; end #=\> nil  
irb(main):002:0\> class Ext1 \< Base; end #=\> nil  
irb(main):003:0\> class Ext2 \< Base; end #=\> nil  
irb(main):004:0\> require ‘facets/core/class/subclasses’ #=\> true  
irb(main):005:0\> Base.subclasses #=\> [Ext2, Ext1]  
irb(main):006:0\> Ext1.subclasses #=\> []  
irb(main):007:0\> class Ext11 \< Ext1; end #=\> nil  
irb(main):008:0\> Ext1.subclasses #=\> [Ext11]  
irb(main):009:0\> Base.subclasses #=\> [Ext2, Ext11, Ext1]

In pratica vi restituisce un’array con le sottoclassi. Molto carino no?  
L’unica cosa è che oltre al debugging non mi viene in mente come si possa  
usare in maniera profittevole…

PS: i FacesTip presuppongono spunti e commenti sugli snippet, quindi  
dateci  
sotto 😛

–  
Paolo Donà  
SeeSaw | Another point of view

> **[A Padova il buon software chi lo fa?](https://seesaw.it/)**
>
> A creare software sono tantissimi, a farlo molto bene c’è una certa schiera di sviluppatori, ma a costruirlo un pezzo alla volta insieme al cliente, plasmarlo sulle sue esigenze e renderlo parte di un nuovo approccio al mondo del lavoro sono davvero...

removed\_email\_address@domain.invalid

---

<div class="post-metadata">

**Author:** ![Paolo\_DonSSSS](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/898d66/32.png) [@Paolo\_DonSSSS](https://www.ruby-forum.com/u/Paolo_DonSSSS)\
**Post date:** [July 14, 2006, 10:11pm UTC](https://www.ruby-forum.com/t/facetstip-1-class-subclasses/98420/2 "2006-07-14T22:11:09Z")

</div>

— Paolo Donà [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

> Anche se l’esempio è banale,  
> colgo lo spunto di Gabriele e incomincio la  
> gloriosa…
> 
> \*\*\* Ruby-it FacetsTip Series  
> \*\*\* FacetsTip #1: Class.subclasses  
>   
> In pratica vi restituisce un’array con le  
> sottoclassi. Molto carino no?  
> L’unica cosa è che oltre al debugging non mi viene  
> in mente come si possa  
> usare in maniera profittevole…

esempio reale: supponi di avere una cosa tipo  
activerecord, in cui dichiari tante sottoclassi di  
Base per poi usarle in qualche modo automaticamente.

Invece di smanettare con #inherited per tenerne  
traccia puoi usare

def Base.setup  
subclasses.each do |c|  
fai qualcosa con c  
end  
end

Oppure se hai un qualcosa in cui caricare dei plugin  
(sottoclassando BasePlugin), e poi vuoi mostrarli  
all’utente (per farglieli  
attivare/deattivare/modificare) invece di lavorare a  
livello di file puoi usare #subclasses.

Immagino che gli Smalltalker ci vedano più usi, io  
sono in un caso di mezzo blub paradox 🙂

–  
icq: #69488917  
blog it: [http://riffraff.blogsome.com](http://riffraff.blogsome.com)  
blog en: [http://www.riffraff.info](http://www.riffraff.info)

Chiacchiera con i tuoi amici in tempo reale!  
[Yahoo Search - Ricerca nel Web | Motore di Ricerca](http://it.yahoo.com/mail_it/foot/*http://it.messenger.yahoo.com)

---

<div class="post-metadata">

**Author:** ![Paolo\_DonSSSS](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/898d66/32.png) [@Paolo\_DonSSSS](https://www.ruby-forum.com/u/Paolo_DonSSSS)\
**Post date:** [July 25, 2006, 10:26am UTC](https://www.ruby-forum.com/t/facetstip-1-class-subclasses/98420/3 "2006-07-25T10:26:26Z")

</div>

Il giorno ven, 14/07/2006 alle 13.08 -0700, gabriele renzi ha scritto:

> Oppure se hai un qualcosa in cui caricare dei plugin  
> (sottoclassando BasePlugin), e poi vuoi mostrarli  
> all’utente (per farglieli  
> attivare/deattivare/modificare) invece di lavorare a  
> livello di file puoi usare #subclasses.
> 
> Immagino che gli Smalltalker ci vedano piÃ¹ usi, io  
> sono in un caso di mezzo blub paradox 🙂

Beh, nell’esempio dei Plugin Smalltalk usa #subclasses perchÃ© non ha  
file con cui lavorare, visto che Smalltalk non usa file sorgenti se non  
come meccanismo di backup.

Altri usi di #subclasses sono legati agli strumenti di sviluppo (class  
browser etc).

Inoltre, poichÃ© in Smalltalk le variabili di instanza sono gestite in  
maniera diversa da Ruby, se si aggiunge una variabile di instanza ad una  
classe che abbia sottoclassi occorre effettuare delle modifiche in tutte  
le sottoclassi (tramite il metodo #subclasses o la sua variante  
#allSubclasses)

```
Giovanni
```
