A24. Le Proprietà - Parte II
È possibile anche specificare uno o più parametri per individuare con maggiore precisione un dato all'interno della classe. Tuttavia è bene non usare mai più di un parametro, ond'evitare di rendere il codice più disordinato e prolisso. In genere si usa un parametro nel corpo di una proprietà per ricavare un elemento da una lista. Riprendendo l'esempio del capitolo precedente:
Module Esempio 'Una classe per gestire le annotazioni Class MyNotes 'ArrayList di stringhe Private _NotesAs New ArrayList 'Questa proprietà in sola lettura accetta un parametro, 'ossia l'indice dell'annotazione da prelevare. Se l'indice 'è minore della dimensione, prende la stringa voluta, 'altrimenti restituisce Nothing Public ReadOnly Property Note(ByVal IndexAs Int32)As String Get If Index < _Notes.CountAnd Index >= 0Then Return _Notes(Index)Else Return NothingEnd If End Get End Property 'Aggiunge una nuova annotazione, a patto che non sia 'una stringa vuota Public Sub AddNote(ByVal NoteAs String )If Note <> ""Then _Notes.Add(Note)End If End Sub End Class Sub Main()Dim NAs New MyNotes N.AddNote("Andare a prendere il pane.") N.AddNote("Ritirare il vestito.") N.AddNote("Comprare un tappeto nuovo.") 'Scrive a schermo la seconda annotazione Console.WriteLine(N.Note(1)) Console.ReadKey()End Sub End Module
Proprietà di Default
Le proprietà di default possono essere richiamate semplicemente specificando il nome della classe in cui si trovano. Per non creare ambiguità tuttavia, devono rispettare queste due regole: devono avere almeno un parametro. altrimenti non si potrebbe distinguere tra il nome della classe usato come tipo e quello usato per richiamare la proprietà di default; deve essercene una e una sola per ogni classe, in caso contrario il .Net non saprebbe quale scegliere. Un esempio comune di proprietà di Deafult è ArrayList.Item:
Le due chiamate a Console.WritLine() genereranno lo stesso messaggio a video, ossia "Come", il membro con indice 1 nell'ArrayList. La cosa interessante, però, è che scrivere A(1) equivale a scrivere A.Item(1): Item è la proprietà di default per la classe ArrayList e perciò può essere richiamata con il nome della classe stessa e specificando l'unico parametro. La sintassi standard è questa:Dim AAs New ArrayList A.Add("Ciao") A.Add("Come") A.Add("Stai?") Console.WriteLine(A(1)) Console.WriteLine(A.Item(1))
Nonostante il compilatore riordini automaticamente le parole riservate, mi sembra di non sprecare spazio specificando l'ordine in cui vanno specificati tutti gli eventuali attributi. Fin'ora abbiamo visto che le proprietà possono essere Public, Private o Friend, poichè sono membri di classe (anche se Private si usa raramente), ReadOnly, WriteOnly o Default a seconda della funzione. L'ordine corretto è:Default Property [Nome della proprieta']([Almeno un parametro])As [Tipo]Get '... Return [Valore]End Get Set (ByVal ValueAs [Tipo]) '... End Set End Property
[Preparatevi perchè questo è niente in confronto a tutte le altre keyword che vi spiegherò in seguito!Default ] [ReadOnly /WriteOnly ] [Public /Friend /Private ]Property ...
Get e Set con specificatore di accesso
È possibile che oltre a quello della proprietà stessa, anche il blocco Set o il blocco Get siano marcati con uno specificatore di accesso
(detto anche "keyword di scope"). In questo caso la keyword di scope dei blocchi interni deve essere più restrittiva rispetto a quella
utilizzata per la proprietà: ad esempio non si può avere una proprietà Private con un Get Public o Friend. Questo espediente serve solo
a limitare l'accesso a determinate parti della proprietà verso alcuni componenti dell'applicazione. Si potrebbe avere una proprietà
Public il blocco set è dichiarato Private: in questo caso, tutti gli assembly che vi si riferiscono possono leggerne il valore, ma solo
i membri della sua classe possono impostarlo. È la stessa cosa che usare la keyword ReadOnly, solo che in questo modo viene concessa la
flessibilità del meccanismo ai membri della classe.
Public Property ItemsNumber()As Int32Get Return _ItemsNumberEnd Get Private Set (ByVal ValueAs Int32)If Value >= 0Then _ItemsNumber = ValueElse _ItemsNumber = 0End If End Set End Property
Istanziamento differito
La tecnice dell'Istanziamento Differito consiste nell'inizializzare un oggetto solo se questo è effettivamente richiesto dall'applicazione.
Ne parlo nel capitolo sulle proprietà in quanto è possibile mettere in atto questa tecnica sopratuto nel loro corpo. Ad esempio:
Module Esempio2Class My Notes 'ArrayList di stringhe, non inizializzato Private _NotesAs ArrayListPublic ReadOnly Property Note()As ArrayListGet 'Solo se l'ArrayList viene effetivamente richiesto 'è inizializzato, altrimenti non si occupa 'memoria superflua nell'heap managed If _NotesIs Nothing Then _Notes =New ArrayListEnd If Return _NotesEnd Get End Property End Class End Module
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



