Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Scope: uso corretto
Forum - C# / VB.NET - Scope: uso corretto

Avatar
Marcus65 (Normal User)
Newbie


Messaggi: 10
Iscritto: 30/08/2010

Segnala al moderatore
Postato alle 11:48
Martedì, 14/09/2010
Questo topic è stato chiuso dal moderatore

Sto studiando la guida di Totem. Giunto al polimorfismo e provati vari programmi di esempi ed altri di mia “invenzione”, mi restano dei dubbi sull’uso degli scope.


Le variabili interne ad una classe mi pare sia sempre bene dichiararle private o protected (se la classe eredita una o più classi derivate). Ma mi sfugge il senso dello scope private nel caso di variabili mediate da una property public. Solo se la property è readonly la variabile private è realmente immodificabile (immetto il suo valore una volta tramite il costruttore e quello resta). Altrimenti ci si può accedere tranquillamente dall’esterno della classe e cambiarla…    Cosa c’è di sbagliato nel mio ragionamento ?
Ancora: come esercizio sul polimorfismo mi sto inventando un programmino che calcola le paghe dei dipendenti di una ditta, così strutturato: c’è una classe base “dipendente” con i seguenti campi: Nome, Cognome, DataNascita, OreLavorate, PagaOraria e una function CalcoloStipendio.  Poi ci sono tre classi : Impiegato, Operaio, Dirigente che ereditano dalla classe base. Il campo PagaOraria e la funzione CalcoloStipendio sono oggetto di polimorfismo: in ognuna delle tre classi derivate il calcolo avverrà in maniera differente.
Mi verrebbe da dichiarare tutto protected nella classe base e private eventuali variabili interne alle classi derivate. La data di nascita la dichiarerei readonly come nei programmi di esempio nelle lezioni di totem. Ma perché la data di nascita soltanto può essere immodificabile e non pure il nome e cognome ecc? D'altronde posso sbagliarmi a inserire la data di nascita come pure il cognome…. Invece una eventuale data odierna acquisita dal sistema mi pare abbia ben ragione di essere read only: è quella, non deve essere cambiata.

Sono stato prolisso me ne rendo conto ma, spendendo qualche parola in più,  spero di aver chiarito bene la natura dei miei dubbi e ringrazio chi volesse fornirmi delucidazioni.

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 11:57
Martedì, 14/09/2010
Testo quotato

Postato originariamente da Marcus65:
Le variabili interne ad una classe mi pare sia sempre bene dichiararle private o protected (se la classe eredita una o più classi derivate). Ma mi sfugge il senso dello scope private nel caso di variabili mediate da una property public. Solo se la property è readonly la variabile private è realmente immodificabile (immetto il suo valore una volta tramite il costruttore e quello resta). Altrimenti ci si può accedere tranquillamente dall’esterno della classe e cambiarla…    Cosa c’è di sbagliato nel mio ragionamento ?



Le variabili private non sono fatte per essere immodificabili, ma per contenere dati inerenti ai meccanismi interni di una classe. Nella fattispecie, è sempre consigliabile avvolgere un campo in una proprietà pubblica perchè è possibile modificare il comportamento della proprietà semplicemente aggiungendo codice ai blocchi get o set, mentre è impossibile ovviare alla natura di un campo in qualsiasi modo.


Testo quotato

Postato originariamente da Marcus65:
Ancora: come esercizio sul polimorfismo mi sto inventando un programmino che calcola le paghe dei dipendenti di una ditta, così strutturato: c’è una classe base “dipendente” con i seguenti campi: Nome, Cognome, DataNascita, OreLavorate, PagaOraria e una function CalcoloStipendio.  Poi ci sono tre classi : Impiegato, Operaio, Dirigente che ereditano dalla classe base. Il campo PagaOraria e la funzione CalcoloStipendio sono oggetto di polimorfismo: in ognuna delle tre classi derivate il calcolo avverrà in maniera differente.
Mi verrebbe da dichiarare tutto protected nella classe base e private eventuali variabili interne alle classi derivate. La data di nascita la dichiarerei readonly come nei programmi di esempio nelle lezioni di totem. Ma perché la data di nascita soltanto può essere immodificabile e non pure il nome e cognome ecc? D'altronde posso sbagliarmi a inserire la data di nascita come pure il cognome…. Invece una eventuale data odierna acquisita dal sistema mi pare abbia ben ragione di essere read only: è quella, non deve essere cambiata.



Sono più che altro questioni di stile. Se una persona è identificata esclusivamente da Nome, Cognome e DataNascita, allora sarebbe corretto anche dichiarare tutte e tre le proprietà come readonly, rendendo così l'oggetto immutabile (come le stringhe). Nell'esempio che avevo fatto, avevo deciso di non usare readonly per tutte solo per evitare questo caso. Gli oggetti immutabili sono sempre un po' strani.

PM
Avatar
Marcus65 (Normal User)
Newbie


Messaggi: 10
Iscritto: 30/08/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 14:07
Martedì, 14/09/2010
Grazie mille
Chiarimenti preziosi.
Come sempre

PM