# Metodi di classi ereditate

**URL:** <https://www.ruby-forum.com/t/metodi-di-classi-ereditate/235679>\
**Category:** IT\
**Created:** [July 8, 2013, 11:43am UTC](https://www.ruby-forum.com/t/metodi-di-classi-ereditate/235679 "2013-07-08T11:43:31Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![alcina](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/a587f6/32.png) [@alcina](https://www.ruby-forum.com/u/alcina)\
**Post date:** [July 8, 2013, 11:43am UTC](https://www.ruby-forum.com/t/metodi-di-classi-ereditate/235679/1 "2013-07-08T11:43:31Z")

</div>

Carissimi lettori,  
vi illustro il seguente problema relativo alla chiamata di un metodo di  
una classe ereditata.

Ho due classi Time1 e Time2 che ereditano in cascata da Time (tralascio  
i metodi particolari)

class Time1 \< Time

# …

end

class Time2 \< Time1

# …

end

t = Time2.now  
r = t + 3600 # adding 1 hour  
purtroppo ora r di class Time, e invece vorrei che rimanesse di classe  
uguale a quella di partenza, ovvero Time2.

Allora introduco in Time dei metodi per “ricastare” e modifico come qui  
di seguito:

Time.class\_eval do  
def to\_time2  
Time2.parse(to\_s)  
end

def to\_time1  
Time1.parse(to\_s)  
end  
end

class Time1 \< Time  
def +(seconds)  
super(seconds).to\_time1  
end  
end

class Time2 \< Time1  
def +(seconds)  
super(seconds).to\_time2  
end  
end

r = Time2.now + 3600  
ora r correttamente di class Time2, tuttavia ci sono 2 casting in  
cascata che suppongo poco performanti

Come posso modificare il codice affinch quando chiamo un metodo di  
istanza di Time da un’istanza di classe che eredita da essa (cio Time1 o  
Time2) il tipo del valore ritornato sia uguale a quella del chiamante?

Grazie mille per ogni risposta,  
ciao

iwan

---

<div class="post-metadata">

**Author:** ![1w4n](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/1/65b543/32.png) [@1w4n](https://www.ruby-forum.com/u/1w4n)\
**Post date:** [July 8, 2013, 12:23pm UTC](https://www.ruby-forum.com/t/metodi-di-classi-ereditate/235679/2 "2013-07-08T12:23:15Z")

</div>

Ciao Iwan,

direi che in generale l’approccio è corretto, perché il metodo ‘+’ di  
Time  
restituisce un oggetto di tipo Time; quindi se vuoi che restituisca  
qualcos’altro devi ricastare l’oggetto alla classe che desideri (se vuoi  
usare super), oppure ridefinire completamente il metodo in modo da  
sostituirne integralmente il comportamento.

L’unico problema che vedo con il tuo codice è che viola il principio OOP  
che le classi madri non dovrebbero mai sapere nulla delle classi figlie,  
mentre tu stai inserendo i metodi ‘to\_time1’ e ‘to\_time2’ che vanno a  
sporcare la classe madre con specifiche implementazioni delle classi  
figlie. Quello che farei io è qualcosa di questo tipo:

class Time1 \< Time

> puts r.inspect
> 
> r = Time2.now + 7200  
> puts r.class  
> puts r.inspect

che restituisce qualcosa di questo tipo

Time1

> 2013-07-08 13:20:39 +0200  
> Time2  
> 2013-07-08 14:20:39 +0200

Dimmi se qualcosa non ti è chiaro 🙂

```
Ju

```

## –\* \*M.Sc. Ju Liu Card: [http://zerp.ly/ju-liu](http://zerp.ly/ju-liu)

Società Cooperativa weLaika  
Corso Vigevano 14/B, 10154 Torino (TO), Italy  
[http://welaika.com](http://welaika.com) - [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

2013/7/8 Iwan B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![1w4n](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/1/65b543/32.png) [@1w4n](https://www.ruby-forum.com/u/1w4n)\
**Post date:** [July 8, 2013, 12:33pm UTC](https://www.ruby-forum.com/t/metodi-di-classi-ereditate/235679/3 "2013-07-08T12:33:46Z")

</div>

+1 per JU

Aggiungo:

> **[Liskov substitution principle](https://en.wikipedia.org/wiki/Liskov_substitution_principle)**
>
> The Liskov substitution principle (LSP) is a particular definition of a subtyping relation, called strong behavioral subtyping, that was initially introduced by Barbara Liskov in a 1987 conference keynote address titled Data abstraction and hierarchy. It is based on the concept of "substitutability" – a principle in object-oriented programming stating that an object (such as a class) may be replaced by a sub-object (such as a class that extends the first class) without breaking the program. It is...

2013/7/8 Ju Liu [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![1w4n](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/1/65b543/32.png) [@1w4n](https://www.ruby-forum.com/u/1w4n)\
**Post date:** [July 8, 2013, 2:29pm UTC](https://www.ruby-forum.com/t/metodi-di-classi-ereditate/235679/4 "2013-07-08T14:29:27Z")

</div>

WOW! Bello, mi piace! 🙂
