Confusione sull'ereditarietà

venerdì 18 maggio 2007 - 12.23

fabiogvn Profilo | Newbie

C'è qualcosa che mi sfugge riguardo all'ereditarietà tra due classi. Poniamo questo esempio:

Class Persona Public Nome as string End Class Class Dipendente Inherits Persona Public Mansione as string End Class

Posso fare un'operazione di questo tipo:

dim d as new dipendente d.nome="pippo" d.mansione="impiegato" dim p as persona=d

Ma ricevo un errore di casting se faccio il contrario, ovvero:

dim p as new persona p.nome="pippo" dim d as dipendente=p d.mansione="impiegato"

Perchè? Se ho una collection di oggetti di tipo Persona, alcuni dei quali devo aggiungerli ad una seconda collection di oggetti di tipo dipendente, perchè non posso aggiungerli direttamente con un directcast?

bluland Profilo | Guru

errore di casting dove?
--------------------
Vincenzo PESANTE

erongis Profilo | Junior Member

>dim p as new persona
>p.nome="pippo"
>dim d as dipendente=p
>d.mansione="impiegato"

Perchè scrivi Dim d as dipendente = p ?
Quando scrivi "d as dipendente", la proprietà nome è ereditata.

Io farei cosi:

Dim d as dipendente

d.nome = p.nome
d.mansione = "impiegato"

Comunque non capisco perchè devi istanziare un oggetto person per valorizzare l'oggetto dipendenti.

Non è meglio istanziare direttamente l'oggetto dipendente?

Inoltre ti consiglio di usare le proprietà e non le variabili public.

quando scrivi: "dim p as persona=d" VB non va in errore perchè stai passando all'oggetto persona un oggetto ddipendente che contiene più proprietà dell'oggetto persona, il contrario crea problemi perchè li manca la proprietà "mansione".
comunque, se attivi l' "option strict on" che ti obbliga a passare valori fra due oggetti uguali (in pratica non puoi passare un single ad un double) secondo me non ti funziona comunque.

fabiogvn Profilo | Newbie

Capisco che con l'esempio che ho riportato ci possono essere tante altre soluzioni e quello che ho scritto può sembrare assurdo. Nella realtà ovviamente le cose sono un pò diverse, ovvero:

- la classe persona è stata fatta molto prima della classe dipendente, e buona parte del progetto già la utilizza in vari punti
- tale classe non è composta solo da un paio di variabili pubbliche come nell'esempio, ma è molto più complessa ed espone sia proprietà che riferimenti ad altri oggetti tramite collection
- Ad un certo punto si rende necessario implementare in questo progetto una nuova classe derivata da Persona che abbia caratteristiche aggiuntive (la classe dipendente, appunto): ci sono sicuramente vari approcci, tra i quali il più semplice sarebbe quello di aggiungere queste caratteristiche aggiuntive direttamente alla classe persona. Sarebbe più logico ed elegante però creare una classe derivata da persona ed aggiungere in quella classe le caratteristiche desiderate.
- Seguendo il secondo approccio, si rende necessario ad un certo punto creare una collection di oggetti Dipendente da popolare con alcuni degli oggetti Persona già presenti in una collection Persone. Ed ecco perchè mi sarebbe piaciuto se fosse stato possibile assegnare l'oggetto persona ad un oggetto dipendente, ovviamente lasciando "vuote" tutte le proprietà aggiuntive, ma mi sembra di aver capito che non si può fare.

A questo punto, siccome copiare le proprietà una ad una tra i due oggetti non è fattibile perchè sono veramente molte, credo che mi rassegnerò ad aggiungere le nuove caratteristiche direttamente alla classe persona.

erongis Profilo | Junior Member

>- la classe persona è stata fatta molto prima della classe dipendente,
>e buona parte del progetto già la utilizza in vari punti
>- tale classe non è composta solo da un paio di variabili pubbliche
>come nell'esempio, ma è molto più complessa ed espone sia proprietà
>che riferimenti ad altri oggetti tramite collection
>- Ad un certo punto si rende necessario implementare in questo
>progetto una nuova classe derivata da Persona che abbia caratteristiche
>aggiuntive (la classe dipendente, appunto): ci sono sicuramente
>vari approcci, tra i quali il più semplice sarebbe quello di
>aggiungere queste caratteristiche aggiuntive direttamente alla
>classe persona. Sarebbe più logico ed elegante però creare una
>classe derivata da persona ed aggiungere in quella classe le
>caratteristiche desiderate.

OK sono d'accordo anche io sulla seconda

>- Seguendo il secondo approccio, si rende necessario ad un certo
>punto creare una collection di oggetti Dipendente da popolare
>con alcuni degli oggetti Persona già presenti in una collection
>Persone. Ed ecco perchè mi sarebbe piaciuto se fosse stato possibile
>assegnare l'oggetto persona ad un oggetto dipendente, ovviamente
>lasciando "vuote" tutte le proprietà aggiuntive, ma mi sembra
>di aver capito che non si può fare.

Secondo me non si può fare per le ragioni che ti ho detto, anche se potresti creare una collection di oggetti generici dove puoi mettere tutto quello che vuoi, va da sè che però perdi l'intellisense.

>A questo punto, siccome copiare le proprietà una ad una tra i
>due oggetti non è fattibile perchè sono veramente molte, credo
>che mi rassegnerò ad aggiungere le nuove caratteristiche direttamente
>alla classe persona.

Prima di fare ciò ci penserei molto bene. Se fai così ottieni due copie diverse dello stesso oggetto con risultati deleteri per il mantenimento del software in futuro.
Se proprio devi, meglio adattare il codice che già c'è e far puntare all'oggetto dipendente piuttosto che all'oggetto persona, oppure fare un metodo generale che copi tutti i valori delle proprietà dell'oggetto persona nell'oggetto dipendente, grande fatica, ma la fai una volta per tutte, e dopo i valori sono sempre allineati.

Io sono per le soluzioni drastiche ma decisive...

Non amo i rattoppi, so per esperienza che prima o poi tornano sempre a galla e ti creano problemi dopo.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5