# Usare un oggetto della classe madre come modello?

**URL:** <https://www.ruby-forum.com/t/usare-un-oggetto-della-classe-madre-come-modello/172781>\
**Category:** IT\
**Created:** [July 28, 2009, 12:13am UTC](https://www.ruby-forum.com/t/usare-un-oggetto-della-classe-madre-come-modello/172781 "2009-07-28T00:13:17Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![gderosa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4da419/32.png) [@gderosa](https://www.ruby-forum.com/u/gderosa)\
**Post date:** [July 28, 2009, 12:13am UTC](https://www.ruby-forum.com/t/usare-un-oggetto-della-classe-madre-come-modello/172781/1 "2009-07-28T00:13:17Z")

</div>

Salve a tutti,

e` la prima volta che scrivo su questo forum, e in effetti sono  
abbastanza nuovo a Ruby (poco piÃ¹ di un mese, ma con esperienze  
precedenti di C e Perl).

La domanda in oggetto si esemplifica con questo frammento di codice:

class ClasseSpecializzata \< ClasseBase  
def initialize(modelloBase)  
modelloBase.instance\_variables.each do |ivar|  
instance\_variable\_set(  
ivar,  
modelloBase.instance\_variable\_get(ivar)  
)  
end  
end  
…  
… # altri metodi…  
…  
end

oggettoSpecializzato = ClasseSecializzata.new(oggettoBase)

E` un modo per “promuovere” oggettoBase a ClasseSpecializzata.

Il codice Ã¨ testato e sembra funzionare nella maniera attesa; ma mi  
chiedo: esiste un modo piÃ¹ ‘nativo’ e diretto di fare la cosa?

Si`, certo, avrei potuto definire ClasseSpecializzata.initialize in modo  
da accettare gli stessi parametri di ClasseBase.initialize e poi usare  
super, ma questo comporterebbe almeno due problemi:

1. devo aver memorizzato da qualche parte i parametri con cui ho  
chiamato a suo tempo ClasseBase.new

2. lo stato di oggettoBase puÃ² essere cambiato dal momento della  
creazione a quello della “promozione”

Grazie a chi vorrÃ rispondermi!

Guido

---

<div class="post-metadata">

**Author:** ![gderosa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4da419/32.png) [@gderosa](https://www.ruby-forum.com/u/gderosa)\
**Post date:** [July 28, 2009, 10:27am UTC](https://www.ruby-forum.com/t/usare-un-oggetto-della-classe-madre-come-modello/172781/2 "2009-07-28T10:27:08Z")

</div>

mmh… se ho capito bene l’idea che hai sarebbe quella di fare

oggetto\_specializzato = ClasseSpecializzata.new(oggetto\_base)

giusto ? E’ un pattern un pò strano… mi ricorda il prototyping …

Sandro

2009/7/28 Guido De rosa [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![gderosa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4da419/32.png) [@gderosa](https://www.ruby-forum.com/u/gderosa)\
**Post date:** [July 28, 2009, 11:12am UTC](https://www.ruby-forum.com/t/usare-un-oggetto-della-classe-madre-come-modello/172781/3 "2009-07-28T11:12:13Z")

</div>

Il giorno 28 luglio 2009 00.13, Guido De rosa[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> … # altri metodi…  
> …  
> end
> 
> oggettoSpecializzato = ClasseSecializzata.new(oggettoBase)
> 
> E` un modo per “promuovere” oggettoBase a ClasseSpecializzata.
> 
> Il codice è testato e sembra funzionare nella maniera attesa; ma mi  
> chiedo: esiste un modo più ‘nativo’ e diretto di fare la cosa?

che io sappia no, farei anch’io così, credo. però vedi però successivo.

> Si`, certo, avrei potuto definire ClasseSpecializzata.initialize in modo  
> da accettare gli stessi parametri di ClasseBase.initialize e poi usare  
> super, ma questo comporterebbe almeno due problemi:
> 
> 1. devo aver memorizzato da qualche parte i parametri con cui ho  
> chiamato a suo tempo ClasseBase.new
> 
> 2. lo stato di oggettoBase può essere cambiato dal momento della  
> creazione a quello della “promozione”

ok, però dipende dall’oggetto, in particolare dalla natura delle  
variabili di istanza.

oggettoSpecializzato e oggettoBase condividono le variabili d’istanza,  
il che può andare bene oppure no, ad esempio se una variabile è un  
file, o un socket, continuare a usare oggettoBase potrebbe  
compromettere la consistenza di oggettoSpecializzato o viceversa.

infine potrebbero esserci situazioni particolari in cui lo stato di un  
oggetto non risiede interamente nelle sue variabili d’istanza ma  
anche, per esempio, nella sua relazione con altri oggetti.

pietro

---

<div class="post-metadata">

**Author:** ![gderosa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4da419/32.png) [@gderosa](https://www.ruby-forum.com/u/gderosa)\
**Post date:** [July 28, 2009, 11:50am UTC](https://www.ruby-forum.com/t/usare-un-oggetto-della-classe-madre-come-modello/172781/4 "2009-07-28T11:50:04Z")

</div>

Guido De Rosa wrote:

> class ClasseSpecializzata \< ClasseBase  
> def initialize(modelloBase)  
> modelloBase.instance\_variables.each do |ivar|  
> instance\_variable\_set(  
> ivar,  
> modelloBase.instance\_variable\_get(ivar)  
> )  
> end  
> end  
> …  
> … # altri metodi…  
> …  
> end
> 
> oggettoSpecializzato = ClasseSecializzata.new(oggettoBase)
> 
> E` un modo per “promuovere” oggettoBase a ClasseSpecializzata.

Allora… mi pare di capire che il tuo codice sostanzialmente non  
“promuova” l’oggetto, ma lo duplica per cambiargli la classe e  
presumibilmente aggiungere dei metodi. Non credo che sia una scelta  
ottimale, almeno in ruby.  
In alternativa se quello che ti interessa veramente Ã¨ aggiungere metodi  
ad un oggetto giÃ istanziato puoi estendere o aggiungere metodi  
direttamente alla classe singleton dell’oggetto stesso.  
Tieni poi presente che in ruby conta piÃ¹ la capacitÃ di un oggetto di  
rispondere ad un dato metodo piuttosto che la sua appartenenza ad una  
classe specifica: il seguente codice funziona correttamente, ma genera  
un errore se qualcuno apre la classe Array e patcha #length o Matz si  
sveglia male e decide di eliminare il metodo Array#length:

if collection.is\_a? Array  
puts collection.length  
else  
puts “I only return arrays length!”  
end

Questo invece funzionerÃ sempre (e come side effect funziona anche su  
qualsiasi oggetto per il quale Ã¨ definito #length):

if collection.respond\_to? :length  
puts collection.length  
else  
puts “this object doesn’t have a length method”  
end

---

<div class="post-metadata">

**Author:** ![gderosa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4da419/32.png) [@gderosa](https://www.ruby-forum.com/u/gderosa)\
**Post date:** [July 29, 2009, 10:31am UTC](https://www.ruby-forum.com/t/usare-un-oggetto-della-classe-madre-come-modello/172781/5 "2009-07-29T10:31:17Z")

</div>

Pietro G.:

> ok, perï¿½ dipende dall’oggetto, in particolare dalla natura delle  
> variabili di istanza.  
> […]

Si`, e` chiaro che dipende molto dalla situazione specifica. Nel mio  
caso si tratta di eseguire il comando Linux ip addr show e catturare,  
via espressioni regolari, le informazioni sulle interfacce di rete del  
sistema. A questo stadio non si fa ancora distinzione fra schede  
ethernet o bridge o altro. Solo in una elaborazione successiva si scopre  
che pippo0 e` in realtÃ il bridge fra eth1 e eth2, oppure che wlan0 e  
wmaster0 rappresentano in realtÃ la stessa scheda WiFi…

Appare abbastanza naturale, per esempio, pensare alla classe Bridge come  
erede della classe Interface, e che l’oggetto derivato conservi le  
variabili di istanza dell’oggetto padre (gli indirizzi IP etc.). Per  
design (e per buon senso) nessuno modificherÃ piÃ¹ l’oggetto base a meno  
che non si decida di interrogare nuovamente il sistema operativo per  
sapere se lo stato delle interfacce Ã¨ cambiato.

> **[Snurl : le Journal des Rédacteurs](https://snurl.com)**
>
> Publiez sur Snurl, le magazine open source du Syndicat National Unitaire des Rédacteurs Libres. Les publications du journal sont ouvertes.

> **[Snurl : le Journal des Rédacteurs](https://snurl.com)**
>
> Publiez sur Snurl, le magazine open source du Syndicat National Unitaire des Rédacteurs Libres. Les publications du journal sont ouvertes.

> **[Snurl : le Journal des Rédacteurs](https://snurl.com)**
>
> Publiez sur Snurl, le magazine open source du Syndicat National Unitaire des Rédacteurs Libres. Les publications du journal sont ouvertes.

---

<div class="post-metadata">

**Author:** ![gderosa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4da419/32.png) [@gderosa](https://www.ruby-forum.com/u/gderosa)\
**Post date:** [July 28, 2009, 4:52pm UTC](https://www.ruby-forum.com/t/usare-un-oggetto-della-classe-madre-come-modello/172781/6 "2009-07-28T16:52:00Z")

</div>

Sandro P. wrote:

> mmh… se ho capito bene l’idea che hai sarebbe quella di fare
> 
> oggetto\_specializzato = ClasseSpecializzata.new(oggetto\_base)
> 
> giusto ?

Giusto.

> E’ un pattern un po’ strano… mi ricorda il prototyping …

Avevo letto di programmazione prototype-based mi pare proprio su questa  
mailing list qualche tempo fa… e in effetti si avvicina un po’ a  
quello che avevo in mente…
