Newsgroup: it.comp.lang.visual-basic
Titolo: [VB 2008] come richiamare metodi definiti nelle classi figlie

ciao,
ho definito una classe padre che contiene alcune funzioni, tra cui una 
funzione che deve essere implementata nelle classi figlie, nella padre 
non ha senso.
Pero' c'e' una funzione della classe padre che ha bisogno di richiamare 
questa funzione figlio ... come si puo' fare?
In questo modo mi da errore ovviamente ...
Public class padre
  function comune()
   ... bla bla bla ...
   dim lista = get_lista() <=============
   ... bla bla bla ...
  end function
end class
Public class figlio
  inherits padre
  function get_lista()
   ...
   ...
  end function
end class
Spero di essermi spiegato abbastanza decentemente, grazie, ciao
Mauro

 Mauro
parola chiave .... MyBase
http://msdn.microsoft.com/en-us/library/ms973803.aspx

 
http://msdn.microsoft.com/en-us/library/ms973803.aspx
Ma non voleva fare il contrario?
Cio� MyBase lo usi nella classe derivata per richiamare un metodo della
classe base, lui voleva richiamare dalla classe base un metodo della
derivata.
In questo caso direi che c'� qualcosa che non va, cio� se nella classe base
ti serve il metodo get_lista l� deve stare, eventualmente nelle derivate si
fa l'override.

 fa l'override.
Provo a spiegare meglio quello che sto facendo.
Ho fatto una classe db_uty che si connette al db e popola una 
datagrid/listbox/textarea a partire da una query. Da questa ho fatto due 
classi "figlie" db_uty_odbc e db_uty_ole che fanno le query 
connettendosi via odbc oppure via ole.
Nella classe padre c'e' il metodo query_to_datagrid che � identico sia 
per la uty_odbc che per la uty_ole, quello che cambia � la chiamata alla 
funzione "query" che nella classe uty_odbc viene fatta tramite le 
funzioni odbc e nella classe oty_ole viene fatta tramite le funzioni ole.
Pero' non posso mettere la funzione query nella classe db_uty, non ha 
senso. Allo stesso tempo DEVO richiamare la funzione query che sta nelle 
classi figlie dalla classe padre per poter popolare la datagrid.
grazie, ciao
Mauro

 classi figlie dalla classe padre per poter popolare la datagrid.
Non sono molto esperto di .NET, anzi c'ho lavorato pochissimo.
Per� realmente uty_odbc e uty_ole devono essere *derivate* da db_uty?
Perch� se si, forse la soluzione la potrestri trovare facendo l'override in
ogni classe derivata del metodo query_to_datagrid, che se scrivi bene il
codice potrebbe divenire quasi
Public Overrides Sub query_to_datagrid
  .. poco codice
  MyBase.query_to_datagrid
End sub
In fondo se ho capito bene db_uty non dovrebbe poter essere usata cos�
com'�, ma dichiarata come MustInherits.
Ma secondo me per fare quello che vuoi fare non � corretto derivare due
classi dalla classe base.

"Innuendo" <prova@b.c> ha scritto nel messaggio 
news:VlQgn.139534$9f6.1...@twister1.libero.it...

Come ti ha detto Andrea la classe base andrebbe definita MustInherits.
In essa definisci (senza implementarla) la funzione che fa la query (es. 
"do_query"), impostandola Protected e MustOverride.
In tal modo le classi derivate saranno le uniche a poter "vedere" do_query e 
per di pi� sono costrette ad implementarla, ciascuna a modo suo.
Nel metodo query_to_datagrid della classe base, la chiamata alla funzione 
do_query verr� automaticamente "mappata" sull'implementazione opportuna 
della classe derivata.
Sperando di essere stato chiaro...
Ciao
Raf
 

 Sperando di essere stato chiaro...
Chiarissimo, adesso ci provo, grazie !!!
ciao
Mauro

 opportuna della classe derivata.
Ok, sono riuscito a fare i metodi astratti da implementare nella classe 
derivata.
Non riesco a fare la stessa cosa con una variabile.
Nella classe padre devo usare un dataReader che potrebbe essere un 
OleDbDataReader  oppure un OdbcDataReader.
Ho provato a fare
Protected Shadows reader As Object
nella classe base
e poi
Protected Shadows reader As OleDbDataReader = Nothing
Protected Shadows reader As OdbcDataReader= Nothing
nella classi derivate, ma non funziona.
Cosa sbaglio?
Ho anche provato a fare un metodo
Protected MustOverride Function getReader()
nella classe base e poi
Protected Overrides Function getReader()
         Dim reader As OleDbDataReader = Nothing
         Return reader
     End Function
ma non funziona nemmeno in questo modo :-(
ciao
Mauro

 ma non funziona nemmeno in questo modo :-(
Ci sei quasi...
Se osservi, OleDbDataReader e OdbcDataReader derivano entrambi da 
DbDataReader.
Ragion per cui conviene che nella classe "generica" dichiari:
    Protected MustOverride ReadOnly Property Reader() As DbDataReader
Che poi implementi cos� nelle classi derivate:
    Private _reader As OleDbDataReader ' (o OdbcDatReader)
    Protected Overrides ReadOnly Property Reader() As DbDataReader
        Get
            Return _reader
        End Get
    End Property
Ciao
Raf
 

 Ci sei quasi...
[ ... ]
Fantastico, funziona !!!!!!!!!!!!!!!!!!!!
Ti ringrazio infinitamente, se passi per Udine hai pizza e birra pagate 
:-) :-) !!!
Ci avevo praticamente rinunciato avendo letto anche io che "Non si pu� 
imporre l'override su una variabile" e non avrei mai immaginato il 
trucco di dichiarare
Reader() As DbDataReader
io facevo con object :-) !!!
grazie ancora !!!
ciao
Mauro

 Mauro
Prego!
Ciao
Raf