Newsgroup: it.comp.lang.visual-basic
Titolo: [.Net] Ancora sull'ereditarietà dei form

Ciao.
Scusate, ma vorrei solo sapere che sono io che non ho capito bene
l'ereditarietà dei form o cosa...
Come ho già detto nel post precedente, ho creato un form di base
(frmModTabBase) da cui ho creato due form ereditati (frmModTab e
frmModTabCom).
A questo punto nel codice devo decidere quale dei due form utilizzare. Come
devo dichiarare la variabile da utilizzare in modo da non dover duplicare
tutto il codice, visto che comunque le proprietà che devo impostare sono
identiche per entrambi i form (cambia solo il form che alla fine devo
visualizzare).
Io vorrei fare una cosa di questo tipo:
Dim oFrm As ? (e qui ho il primo dubbio... come lo dichiaro)
If UsaTabCom Then
    'In questo caso devo utilizzare frmModTabCom
    oFrm = New frmModTabCom()
Else
    'In questo caso devo utilizzare frmModTab
    oFrm = New frmModTab()
End If
oFrm.Text = "Tabella " & TabellaSel
oFrm.Posizione = StarchGrid_Net1.Row
ecc. ecc. con l'inizializzazione delle proprietà.
E' possibile fare una cosa del genere?
Grazie
Skysurfer

 (cambia solo il form che alla fine devo visualizzare).
Mi butto? Buttiamoci...
fai un type cast alla classe dalla quale derivano
dim frm as new frmDerivata()
dim frmt as frmMamma
frmt = ctype(frm,frmMamma)
a questo punto lavori su frmt, a prescindere da quale classe (comunque
derivata dalla frmMamma) appartenga frm
Dove poi fare questo cast.... ninzò
Salutoni
Sergio


Anche io avevo pensato di usare il Cast (anche se avevo usato DirectCast
invece di CType ma non credo cambi molto).
Il problema però è che se aggiungo qualche proprietà ai due form derivati,
ovviamente mi segnala l'errore in compilazione perchè nella definizione del
form di base non esiste quella proprietà.
Quindi usando il tuo esempio, se a frmDerivata aggiungo una property Prova
quando scrivo:
frmt.prova mi dice che prova non è un membro di...
Se non c'e' soluzione dichiaro frm as Object e buonanotte....
Grazie.
Skysurfer

 definizione del form di base non esiste quella proprietà.
certo: con quella tecnica avresti accesso solo alla parte di proprietà e di
metodi che sono presenti nella classe madre, non a quelli delle classi che
ereditano, anche se presenti in tutte e due...
Però....
se nella classe mamma hai la proprietà "Saltello"
nella classe figlia1 esegui l'override della proprietà
se hai una istanza di Figlia1 che si chiama frm1, e fai il cast alla clase
madre
Frm2 = ctype(frm1, Mamma), la proprietà
frm2.saltello restituirà un valore secondo l'implementazione dell'override
di figlia1, se non ricordo male.
Stesso discorso se fai l'override in una ipotetica classe figlia2
hth
Salutoni
Sergio

 Dim oFrm As ? (e qui ho il primo dubbio... come lo dichiaro)
Lo dichiari come classe base, il resto del codice va bene com'e'...
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown


Va bene se nella classe base ci sono tutte le proprietà che verrano
utilizzate anche nei form che ereditano.
Ma se ho proprietà nuove create nelle classi che ereditano, queste generano
errore in compilazione.
Ciao
Skysurfer


Ok, così funziona. Ma a questo punto non serve più fare il Cast.
Io ho provato così:
Dim FrmMamma As frmModTabBase
If UsaFiglia1 Then
    FrmMamma = New frmModTabCom()
Else
    FrmMamma = New frmModTab()
Endif
Ma mi chiedo se ha senso inserire nel form di base proprietà che comunque
non saranno utilizzate dai form che ereditano.
Ciao
Skysurfer

 errore in compilazione.
Ovviamente, pero':
Se le nuove proprieta' delle classe B e C (derivate da A) *non* sono comuni,
allora comunque devi scrivere codice specifico per ognuna e non ha senso
avere un codice generico, se invece esistono dei membri nuovi *e* comuni a
entrambe le classe derivate allora puoi derivare una classe A1 da A, con i
membri comuni, e derivare B e C da quest'ultima, o, forse meglio ma dipende,
definire una nuova interfaccia con i membri comuni, che deve essere
implementata da entrambe le classi derivate
