Newsgroup: it.comp.lang.perl
Titolo: Hash & wxWidgets

Ho una package derivato da un wxFrame con un metodo new scritto in questo
modo;
sub new{
   #qui viene restituito un hash 
   my( $this ) = shift->SUPER::new( @_ );
   # qui il package button accetta l'hash
   $this->{bt} =Wx::Button->new($this,-1,"");   
}
Come č possibile che accetti un hash quando č richiesto un wxWindow
package?
Mi sono posto questa domanda dopo aver provato anche il package wxWizard e
quest'ultimo non mi permette piů la seconda istruzione:
$this->{bt} =Wx::Button->new($this,-1,"");   
Mi dice che $this non č un hash
ciao :)

package?
Non conosco il modulo sicché posso solo fare delle illazioni (ma, del
resto, non ha risposto nessuno, quindi anche questo è lecito). I due casi
possibili mi sembrano: 1) il metodo SUPER::new di fatto restituisce un
wxWindow package; 2) il metodo Wx::Button::new non fa un controllo rigoroso
sul tipo di quello che gli viene passato (di per sé perl non ha una
tipizzazione stretta degli oggetti, sicché questi controlli dipendono
dall'implementazione dei metodi).
Ciao.

 package?
Ti chiederei di precisare meglio la domanda. La terminologia che usi
mi pare non corretta.
Non conosco wxPerl, ma mi sentirei lo stesso di precisare queste cose
intorno alla programmazione ad oggetti in Perl:
 i. Non credo che un costruttore possa restituire una hash. Almeno,
    io non ne ho mai visto uno. Quello che piu` probabilmente 
    restituisce e` una _reference_ ad una hash. Anche perche` una
    reference e` l'unica cosa che puo` essere "battezzata" (blessed),
    meccanismo sul quale si basa la programmazione ad oggetti in Perl.
ii. Mi pare molto impreciso dire che il costruttore di "Wx::Button"
    richiede "un wxWindow package". Molto meglio "richiede che gli 
    venga passato una instanza di Wx::Window". E cosa e` una 
    istanza di Wx::Window ? E` una reference a qualcosa (ad una 
    hash, ad esempio) che e` stata battezzata come Wx::Window,
    oppure un'istanza di qualche classe derivata, che quindi IS-A
    Wx::Window (ma bisogna vedere quale controllo fa, di preciso,
    il costruttore di Wx::Button).
Detto questo, non ho una risposta alla tua domanda. 
Ma l'intero post mirava a dimostrare che non riuscivo a capirla :)
ciao,
S.

 dall'implementazione dei metodi).
Esatto il metodo new restituisce un wxWizard package e non un hash come mi
aspetterei.
Spiego un pochino meglio...
Se creo un package dal wxFrame tutto funziona correttamente:
my( $this ) = shift->SUPER::new( @_ );
print $this , "\n";
output:
MyFrame=HASH(0x1aef748)
qui vediamo che crea un hash e posso richiamare tutti i miei metodi del
package creato
$this->medodo1();
$this->medodo2();
e anche i metodi di wxFrame..
$this->Show();
$this->Title();
e posso anche creare nuovi item per l'hash
$this->{bt1}=Button->new(this.....
se invece uso wxWizard 
my( $this ) = shift->SUPER::new( @_ );
print $this , "\n";
output:
Wx::Wizard=SCALAR(0x1a9dc84)
appunto crea un scalare che è anche un riferimento al package wxWizard
Infatti posso richiamare solo i metodi di wxWizard e non quelli del mio
package creato:
questi sono possibili
$this->Show();
$this->Title();
Questi invece no 
$this->medodo1();
$this->medodo2();
e chiaramente neppure creare nuovi elementi per l'hash (visto che non
esiste un hash)...
La cosa potrebbe non essere così importante e potrei risolverla in tanti
modi..
Io però volevo capire come poter impostare $this in modo da poterlo usare
come il package creato da wxFrame...
In pratica con $this vorrei poter fare:
1)Chiamare i metodi del mio package:
   $this->miometodo();
2)Chiamare i metodi del package wxWizard
   $this->Show()
   $this->Title()
3) creare nuovi elementi epr l'hash 
   $this->{bt}=button.....
Possibile simulare questa cosa?? 
grazie e ciao

$this->medodo2();
Veramente è molto difficile rispondere senza conoscere la classe (e senza
avere neppure troppo dimistichezza con la creazione e derivazione di classi
in perl). In particolare, non mi è chiaro come uno scalare consenta di
richiamare dei metodi come se fosse un reference. Sempre in termini di
libere illazioni, mi sembra ragionevole supporre che semplicemente wxWizard
non sia congegnato come classe da cui derivare altre classi, e rassegnarsi
alla cosa. Un'attenta lettura della documentazione e dei sorgenti potrebbe
però anche far cambiare atteggiamento.
Senza accedere ad altre informazioni, io credo che creerei un mio oggetto,
proprio della mia classe, e gli attribuirei una proprietà wxWizard, in cui
conserverei il reference ad un'istanza di wxWizard. Duplicherei quindi
nella mia classe tutti i metodi di wxWizard (può darsi che ci sia anche un
modo per farlo che non ti costringa a scrivere una sub per ogni metodo); il
codice di ognuno di questi metodi si limiterebbe a richiamare il
corrispondente metodo wxWizard, attraverso l'istanza contenuta nella
proprietà wxWizard del mio oggetto. L'interfaccia finale del modulo sarebbe
trasparente per l'utente, e farebbe sostanzialmente quello che chiedi.
Ciao.

 Spiego un pochino meglio...
Torno alla carica, piu` puntiglioso, noioso e precisino che mai :)
Il "metodo new" _non_ restituisce un package wxWizard. 
"Restituire un package", in generale, e` un'affermazione alla quale
faccio fatica ad attribuire qualche senso.
Quello che fa il costruttore new() e` restituire una reference
blessed. Nota che dico reference senza specificare a cosa si 
riferisca effettivamente: e infatti si puo` usare qualunque cosa.
Il fatto che molto spesso si usi una hash, che fa anche da 
contenitore per le proprieta` dell'oggetto, e` un dettaglio.
Quindi: e` comprensibile aspettarsi di ricevere un blessed 
reference ad hash, ma e` scorretto fare asserzioni su questo 
comportamento.
Cosa vuol dire essere blessed ? Lo dicevo in un post precedente:
e` il modo usato dal Perl per dire che un certo oggetto appartiene
ad una certa classe. L'oggetto lo gestiamo attraverso la reference,
e la classe e` realizzata usando un package: ma usare reference,
oggetti, classi e package come termini intercambiabili genera
mostri :)
Altrettanto scorretta, a mio avviso, e` la pratica di aggiungere
slot alla hash ricevuta. Il programmatore della classe che stai
usando ha tutto il diritto di modificarne l'implementazione, ad 
esempio scegliendo un altro meccanismo per mantenere le proprieta`
dell'oggetto. Se il tuo codice si basava su asserzioni sulla
struttura interna dell'oggetto, cessera` di funzionare. 
Mi rendo conto che non ti sto aiutando direttamente a risolvere
il tuo problema. Non ho trovato su CPAN la classe Wx::Wizard,
quindi faccio fatica a collocare la tua domanda (che mi pare
diversa da quella dell'inizio di questo thread) nel suo giusto
contesto. Se hai voglia di riformularla (un po' piu` di codice
non guasterebbe), sono a disposizione.
ciao,
S.
-- 
Stefano Rodighiero      |  
http://larsen.perlmonk.org
mailto:
lar...@perl.it
   |  
http://www.perl.it