Creare e utilizzare classi dentro classi

venerdì 27 aprile 2007 - 16.45

Ghitano Profilo | Newbie

Salve a tutti
ho creato una classe ArticoloMagazzino
con diverse proprietà e funzioni (es: Salva_Articolo, etc...)
vorrei inserire al suo interno una "sottoclasse" con i campi di ciascun record
in rapporto uno-molti

dim MyArt as new ArticoloMagazzino(IDArticolo)

dim DescrizioneArticolo as string, QuMagazzino as Short

DescrizioneArticolo = MyArt.Descrizione
QuMagazzino = MyArt.Quantita
dove descrizione e quantita sono proprietà della classe
e fin qui ci siamo

se io voglio avere una sottoclasse per gestire ulteriori proprietà della classe articolo?
es:

MyArt.Fornitore("Tizio").PrezzoAcquisto
MyArt.Fornitore("Tizio").Sconto
MyArt.Fornitore("Tizio").ModalitaPagamento





Ghitano BitBoys

dedalo.nel.labirinto Profilo | Newbie

potresti provare ad aggiungera alla tua classe ArticoloMagazzino un campo Fornitori di tipo Collection
che ti permette di gestire una collezione di oggetti e poi definire o una nuova classe Fornitore o una
struttura (dipende se vuoi che anche Fornitore abbia dei metodi propri o che sia valorizzata tramite un ID).

public Fornitori As Collection

nella classe ArticoloMagazzino, poi, potresti aggiungere (se già non l'avevi previsto) un metodo che, una
volta popolata una DataTable con i fornitori che t'interessano e i loro dati, cicli sui suoi record
creando di volta in volta un'istanza della classe o struttura Fornitore valorizzandola con i dati
della tabella e aggiunga l'oggetto alla collezione insieme a una chiave di tipo stringa per richiamarlo
(per esempio la descrizione del fornitore).


Public sub ValorizzaFornitori() ' tabella con i dati dei fornitori Dim DTFornitori As New Data.DataTable("Fornitori") ' valorizzazione '... ' creazione istanza collezione Fornitori = New Collection ' valorizzazione Dim Fornitore As Fornitore For Each r As Data.DataRow In DTFornitori.Rows 'valorizzazione istanza Fornitore = New Fornitore With Fornitore .Descrizione = r(0) ' "Tizio" .PrezzoAcquisto = r(1) .Sconto = r(2) .ModalitaPagamento = r(3) End With ' aggiungiamo alla collezione, indicando ' come chiave la descrizione Fornitori.Add(Fornitore, r("Descrizione")) Next End Sub


a questo punto potrai richiamare i dati dei fornitori dalla classe ArticoloMagazzino
tramite la descrizione del fornitore o anche tramite indice come un semplice array:

Dim PrezzoAq As String Dim Sconto As String Dim ModPag As String PrezzoAq = MyArt.Fornitori("Tizio").PrezzoAcquisto Sconto = MyArt.Fornitori("Tizio").Sconto ModPag = MyArt.Fornitori("Tizio").ModalitaPagamento PrezzoAq = MyArt.Fornitori(0).PrezzoAcquisto Sconto = MyArt.Fornitori(0).Sconto ModPag = MyArt.Fornitori(0).ModalitaPagamento



nell'allegato troverai un esempio sia per la classe che per la
struttura, che potrai adattare al codice che hai gia scritto.
non so se questo sia il metodo migliore, ma comunque spero
che ti sia d'aiuto.

ciao

Ghitano Profilo | Newbie

si, certo,
ma non capisco perché quando vado a digitare
MyArt.Fornitore("Vattelapesca").
non mi compaiono i campi della classe fornitore
(es. Descrizione, PrzAcquisto etc...)

dove sbaglio?
(ho creato un oggetto con la classe da te postata art as new ArticoloMagazzino
art.fornitore(0).?????
Ghitano BitBoys

dedalo.nel.labirinto Profilo | Newbie



i campi non ti compaiono perchè gli elementi di una Collection sono di tipo Object.
quando aggiungi un elemento, sia esso l'istanza di una classe o di un tipo di dato,
questo viene 'incapsulato' in un Object generico, ma matendo le sue
proprietà o metodi o valori.


quelli che ho scritto erano due esempi del come pui accedre all'elemento
della Collection, ovvero in base alla chiave (in questo caso la Descrizione),
oppure in base all'indice, ovvero la posizione che occupa l'elemento
all'interno della collection ( essendo il primo il suo indice è 0) :

Dim PrezzoAq As String ' chiave: Descrizione = "Tizio" PrezzoAq = MyArt.Fornitori("Tizio").PrezzoAcquisto ' indice: posizione = 0 PrezzoAq = MyArt.Fornitori(0).PrezzoAcquisto

Ghitano Profilo | Newbie

La soluzione che hai proposto può essere accettabile
ma non soddisfa la necessità di creare una classe strutturata per gestire l'articolo
sarebbe bello poter capire quali sono i campi della classe senza dover andare a spulciare la classe sigh!!

MyArt.Fornitore("XXX"). -> Pop Up con tutte le proprietà della classe fornitore

purtroppo proveniendo da Vb6 sto cercando di interpretare le classi per come dovrebbero essere secondo me e non per come sono realmente ;-)


Ghitano BitBoys

dedalo.nel.labirinto Profilo | Newbie

quello che vuoi fare è sicuramente realizzabile, bisogna addentrarsi maggiormente nello sviluppo del codice.

per riuscire ad accedere al singolo oggetto fornitore e vederne metodi e proprietà, ho creato una nuova classe ElencoFornitori
da sostituire alla Collection.

ElencoFornitori è a sua volta una collezione di oggetti Fornitore, che eredita da DictionaryBase, e all'interno della quale vanno
definiti i vari metodi Add, Insert, Remove e la proprietà Item che ti permettere di accedere all'oggetto associato a una chiave.

a questo punto, una volta valorizzata la classe fornitore la potrai aggiungere con il consueto metodo Add, specificando
chiave e valore ( in questo caso Descrizione e oggetto Fornitore):

Dim f As Fornitore For Each r As Data.DataRow In DTFornitori.Rows ' valorizza l'istanza fornitore f = New Fornitore With f .Descrizione = r(0) .PrezzoAcquisto = r(1) .Sconto = r(2) .ModalitaPagamento = r(3) End With ' aggiuge alla collezione Fornitori.Add(f.Descrizione, f) Next

quindi potrai richiamare le proprietà dalla lista:
FornitoreTizioPrezzoAq = MyArt.Fornitori("Tizio").PrezzoAcquisto
ti allego le classi di esempio.
ciao.
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5