# Problema con ereditarietÃ  e moduli

**URL:** <https://www.ruby-forum.com/t/problema-con-ereditarieta-e-moduli/116000>\
**Category:** IT\
**Created:** [October 1, 2007, 3:20pm UTC](https://www.ruby-forum.com/t/problema-con-ereditarieta-e-moduli/116000 "2007-10-01T15:20:44Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![kaaio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/8797f3/32.png) [@kaaio](https://www.ruby-forum.com/u/kaaio)\
**Post date:** [October 1, 2007, 3:20pm UTC](https://www.ruby-forum.com/t/problema-con-ereditarieta-e-moduli/116000/1 "2007-10-01T15:20:44Z")

</div>

Sto lavorando ad un piccolo programma in Ruby, in particolare mi manca  
la GUI.  
Per farla uso le wxWidgets, andando a definire nel file gui.rb una  
classe Gui che eredita Wx:App, quindi la dichiaro cosÃ¬: class Gui \<  
Wx::App  
Tutte le classi che ho scritto precedentemente (e che si trovano in fle  
diversi) sono comprese in un modulo , come anche la classe Gui.

Ma quando cerco di richiamare un metodo di una classe definita in  
un’altra classe del modulo nn funziona.

Credo che il problema sia dovuto al fatto che la classe Gui eredita  
Wx:App, perchÃ¨ se tolgo l’ereditarietÃ i metodi vengono trovati ( cosÃ¬  
nn funziona piu il resto, ovviamente )

Come posso fare per risolvere questo problema?

---

<div class="post-metadata">

**Author:** ![kaaio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/8797f3/32.png) [@kaaio](https://www.ruby-forum.com/u/kaaio)\
**Post date:** [October 1, 2007, 3:30pm UTC](https://www.ruby-forum.com/t/problema-con-ereditarieta-e-moduli/116000/2 "2007-10-01T15:30:11Z")

</div>

— Claudio B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Ma quando cerco di richiamare un metodo di una  
> classe definita in  
> un’altra classe del modulo nn funziona.

scusa ma questo punto non mi è chiaro, intendi che è  
una cosa  
così?  
module Wx # module Wx fasullo  
class App  
end  
end

module M # il tuo modulo  
class Called #classi che richiami  
def self.foo  
p “foo”  
end  
end  
class Inner \< Wx::App # classe che richiama  
def bar  
Called.foo  
end  
end  
end  
un codice simile dovrebbe funzionare come ti aspetti  
(i.e. M::Inner.new.bar stampa “foo” correttamente)

potresti ridurre il tuo problema ad un esmepio piccolo  
da postare?  
Ad ogni modo, immagino che un “include” o un  
riferimento esteso (i.e. Modulo::Classe invece che  
Classe) potrebbbe essere quello che ti serve.

–  
Goto 10: [http://www.goto10.it](http://www.goto10.it)  
blog it: [http://riffraff.blogsome.com](http://riffraff.blogsome.com)  
blog en: [http://www.riffraff.info](http://www.riffraff.info)

```
  ___________________________________________________________

```

Want ideas for reducing your carbon footprint? Visit Yahoo! For Good  
[http://uk.promotions.yahoo.com/forgood/environment.html](http://uk.promotions.yahoo.com/forgood/environment.html)

---

<div class="post-metadata">

**Author:** ![kaaio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/8797f3/32.png) [@kaaio](https://www.ruby-forum.com/u/kaaio)\
**Post date:** [October 1, 2007, 4:14pm UTC](https://www.ruby-forum.com/t/problema-con-ereditarieta-e-moduli/116000/3 "2007-10-01T16:14:46Z")

</div>

gabriele renzi wrote:

> potresti ridurre il tuo problema ad un esmepio piccolo  
> da postare?

Ho creato una classe, Ui, salvata nel file ui.rb e contenente le  
definizioni dei metodi che poi andrÃ² ad usare e l’inizializzazione di  
alcune variabili globali.

La struttura Ã¨ questa:

require ‘kaambusa/ui/text’  
require ‘kaambusa/ui/gui’  
require ‘kaambusa/ingrediente’  
require ‘kaambusa/ricetta’  
require ‘kaambusa/giornata’

module Kaambusa  
class Ui  
def main(ui)

# …

```
  $lista_ricette = Array.new()

```

# …

```
  Ui.carica_ingredienti
  Ui.carica_ricette
  Ui.carica_giornate

```

# …

```
end

#metodi per la manipolazione del database ingredienti
def carica_ingredienti

```

# …

```
end

```

end  
end

il file gui.rb deve andare ad usare i metodi e le variabili definiti  
nella classe Gui.

module Kaambusa

# …

class SimpleFrame \< Frame  
def initialize(parent)

# …

```
  evt_button(Wx::xrcid('inserisci')) do
    Kaambusa::Ui.aggiungi_ingrediente(
      # ...
    )

  end

```

class Gui \< App  
def on\_init

```
  #debug
  puts "gui"
  puts $lista_ingredienti

  # Create a resource handler
  $xml = Wx::XmlResource.get();
  $xml.init_all_handlers();

  # Load a resource file
  $xml.load("kaambusa.xrc")

  # Show the main frame.
  SimpleFrame.new(self)

end

```

end

Gui.new.main\_loop()  
end

Ne la variabile $lista\_ingredienti ne i metodi invocati da SimpleFrame,  
come ad esempio Kaambusa::Ui.aggiungi\_ingrediente non sono visibili.  
il puts delle variabili restituisce nil, mentre l’errore riguardante i  
metodi Ã¨:  
uninitialized constant Kaambusa::Ui (NameError)

---

<div class="post-metadata">

**Author:** ![kaaio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/8797f3/32.png) [@kaaio](https://www.ruby-forum.com/u/kaaio)\
**Post date:** [October 1, 2007, 5:21pm UTC](https://www.ruby-forum.com/t/problema-con-ereditarieta-e-moduli/116000/4 "2007-10-01T17:21:55Z")

</div>

Ho riprovato facendo qualche modifica e ho notato di nuovo che se nella  
dichiarazione della classe Gui elimino l’ereditarieta’ e i riferimenti a  
metodi di Wx:App la variabile globale viene correttamente visualizzata.

Faccio un esempio:

class Gui  
def on\_init  
puts $lista\_ingredienti

# ,

```
end

```

end

da come output il contenuto della variabile

class Gui \< App  
def on\_init  
puts $lista\_ingredienti

# ,

```
end

```

end

da come output nil

---

<div class="post-metadata">

**Author:** ![kaaio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/8797f3/32.png) [@kaaio](https://www.ruby-forum.com/u/kaaio)\
**Post date:** [October 2, 2007, 12:33pm UTC](https://www.ruby-forum.com/t/problema-con-ereditarieta-e-moduli/116000/5 "2007-10-02T12:33:17Z")

</div>

gabriele renzi wrote:

> Per questo che ti chiedevo uno spezzone di codice  
> minimo eseguibile per fare due prove che riproduca iol  
> problema, almeno possiamo farti un po’ di debug remoto  
> 🙂

Tutto il codice Ã¨ disponibile all’indirizzo [povegliano.org/downloads](http://povegliano.org/downloads)  
all’interno dell’archivio kaambusa.tar.gz.  
Per avviare il programma bisogna eseguire kaambusa.rb nella dir lib.  
Grazie per l’interessamento!

---

<div class="post-metadata">

**Author:** ![kaaio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/8797f3/32.png) [@kaaio](https://www.ruby-forum.com/u/kaaio)\
**Post date:** [October 1, 2007, 8:45pm UTC](https://www.ruby-forum.com/t/problema-con-ereditarieta-e-moduli/116000/6 "2007-10-01T20:45:43Z")

</div>

— Claudio B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Ho riprovato facendo qualche modifica e ho notato di  
> nuovo che se nella  
> dichiarazione della classe Gui elimino  
> l’ereditarieta’ e i riferimenti a  
> metodi di Wx:App la variabile globale viene  
> correttamente visualizzata.

per la variabile globale… immagino che ci sia un  
problema di ordine di esecuzione per cui non è  
inizializzata.  
(Ad ogni modo se è una lista potresti usare una  
costante: il contenuto cambierà, ma l’oggetto Array  
associato alla costante no)

Posso immaginare un problema solo in questo modo: la  
classe Wx::App definisce const\_missing.  
Però questo dovrebbe succedere solo se è Wx::App a  
fare riferimento alla costante, penso.

Per questo che ti chiedevo uno spezzone di codice  
minimo eseguibile per fare due prove che riproduca iol  
problema, almeno possiamo farti un po’ di debug remoto  
🙂

```
  ___________________________________________________________

```

Want ideas for reducing your carbon footprint? Visit Yahoo! For Good  
[http://uk.promotions.yahoo.com/forgood/environment.html](http://uk.promotions.yahoo.com/forgood/environment.html)

---

<div class="post-metadata">

**Author:** ![kaaio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/8797f3/32.png) [@kaaio](https://www.ruby-forum.com/u/kaaio)\
**Post date:** [October 6, 2007, 11:12am UTC](https://www.ruby-forum.com/t/problema-con-ereditarieta-e-moduli/116000/7 "2007-10-06T11:12:36Z")

</div>

— Claudio B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Tutto il codice è disponibile all’indirizzo  
> [povegliano.org/downloads](http://povegliano.org/downloads)  
> all’interno dell’archivio kaambusa.tar.gz.  
> Per avviare il programma bisogna eseguire  
> kaambusa.rb nella dir lib.  
> Grazie per l’interessamento!

è un piacere, figurati.

Allora la diagnosi del Dott. Renzi è: hai fatto una  
zozzeria, ma sei ancora curabile 🙂

Il problema vero è che il codice di gui.rb esegue il  
mainloop da dentro la definizione del modulo:

module Kaambusa  
…fuffa…  
Gui.new.main\_loop  
end

Quando viene eseguito?  
Quando fai require ‘ui/gui’

Quando fai questo require?  
Quando fai il require di ui.rb, e _prima_ di aver  
definito il modulo Ui.

Se spostassi il require in fondo a ui.rb questo errore  
scomparirebbe.

Ma più in generale non dovresti eseguire codice nel  
momento del require a meno che non ci sia un ottimo  
motivo per farlo. Hai già la tua comoda funzione di  
inizializzazione, richiamala quando avvii da una  
funzione di inizializzazione globale e tutto andrò  
bene 🙂

Detto questo, un paio di note:

1. è una pessima abitudine scrivere il codice in  
italiano, funzioni, classi e variabili è meglio  
metterle in inglese.

2. questo:

puoi riscriverlo come  
for i in %w[note caroboidrati kcal etc etc]

ingrediente[i]=Window.find\_window\_by\_id(xrcid(i),self)  
end  
Almeno mi sembra 🙂

–  
Goto 10: [http://www.goto10.it](http://www.goto10.it)  
blog it: [http://riffraff.blogsome.com](http://riffraff.blogsome.com)  
blog en: [http://www.riffraff.info](http://www.riffraff.info)

```
  ___________________________________________________________

```

Yahoo! Answers - Got a question? Someone out there knows the answer. Try  
it  
now.

> **[Yahoo | Mail, Weather, Search, Politics, News, Finance, Sports & Videos](https://www.yahoo.com/)**
>
> Latest news coverage, email, free stock quotes, live scores and video are just the beginning. Discover more every day at Yahoo!

---

<div class="post-metadata">

**Author:** ![kaaio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/8797f3/32.png) [@kaaio](https://www.ruby-forum.com/u/kaaio)\
**Post date:** [October 6, 2007, 11:26am UTC](https://www.ruby-forum.com/t/problema-con-ereditarieta-e-moduli/116000/8 "2007-10-06T11:26:06Z")

</div>

gabriele renzi wrote:

> …

Grazie! Provo subito a correggere secondo le tue indicazioni.
