Capita spesso di voler fare in modo che un’istanza di una classe sia visibile a tutti. Qualcuno di voi dirà “certo, basta dichiararla come statica!”. Esatto… o meglio, quasi! Infatti, per chi come me ha necessità di usare la Reflection (ovvero la capacità di un programma di modificare sè stesso in base all’occorrenza)… non è possibile! Non conosco l’esatto motivo per cui una classe statica non possa usare la Reflection, ma conosco il modo per aggirare il problema. È qui infatti che viene in aiuto il Design Pattern Singleton. Con questo pattern noi siamo in grado in tutto e per tutto di agire sulla classe come se questa fosse statica, però permettendoci il privilegio in più di avere la Reflection! Cosa significa questo? Significa che facendo ad esempio una classe di Opzioni basata su questo pattern non dobbiamo più salvare tutte le proprietà una ad una durante il salvataggio, ma ci penserà in automatico la reflection automaticamente! questo è solo un esempio, magari scriverò più avanti un articolo a parte… comunque, tornando al pattern…
Dichiariamo la nostra classe creando un costruttore privato:
public class Opzioni
{
private Opzioni()
{
}
}
perchè privato? lo vediamo fra un pò…
Adesso creiamo all’interno della classe un oggetto private o protected di tipo Opzioni e lo chiamiamo _instance:
private Opzioni _instance = new Opzioni();
e per concludere creiamo un metodo pubblico GetInstance() all’interno della classe che ritorna l’oggetto _instance:
public Opzioni GetInstance()
{
return _instance;
}
a questo punto quando volete accedere ai dati di questa classe basta chiamare il metodo:
Options.GetInstance().[quellochevoletevoi]();
Finito! “Come finito?” direte voi… già, è così!
Con pochissime righe di codice avete creato una classe completa che essendo per natura NON statica, allora può estendere classi, interfaccie e usare la reflection
non male no?
Mi chiamo Denis Billi, ho 25 anni e sono della provincia di Ravenna. Mi sono laureato nell'estate del 2008 presso la facoltà di Ingegneria Informatica dell'università di Bologna e attualmente sto seguendo i corsi per la Laurea Specialistica in Ingegneria Informatica sempre all'università di Bologna.
Ciao Filippo! La tua non è una bestialità anzi, hai fatto bene a chiedermelo. Comunque sia il sistema è ingegnoso sì, ma non l’ho inventato io
Tant’è che all’inizio dell’articolo scrivo proprio che nel caso io dichiari una classe come statica, non posso accedere alla reflection, ovvero se ho ad esempio la necessità di leggere le proprietà della classe stessa non conoscendole a priori (un caso tipico lo puoi vedere nella creazione di plug-in), allora non posso usare una semplice classe statica ed ecco che mi viene in aiuto il Pattern Singleton.
Se hai ancora dubbi, chiedi pure!
Perdona la mia bestialità ma potresti postare una soluzione ove utilizzi questo ingegnoso sistema?
Grazie.
Scusami, ma non riesco a vedere l’esempio riportato nella soluzione creata per la creazione di plug-in. Sono agli inizi e non mi è facile seguire tutto il ragionamento. Ti chiedo se potresti indicarmi dove posso reperire informazioni o se hai degli esempi ancora + semplici
.
Ti ringrazio in anticipo
saluti,
Filippo
Sì certo, ma mi è difficile aiutarti non conoscendo il livello a cui ti trovi. Così a freddo, conosci cosa sono le classi, le interfacce, gli eventi, le proprietà, i metodi? L’ereditarietà delle classi? Che linguaggi conosci in maniera abbastanza approfondita?
Fammi sapere, poi magari vedo di formulare un esempio chiaro.
A presto!
Tutto le conoscenze da te elencate, le conosco teoricamente e le applico in modo basilare sul codice in C#, mentre conosco bene VB6. Magari con qualche commento in più su un esempio in cui utilizzi la reflection con il singleton potrebbe rendermi il concetto più chiaro. Ti ringrazio comunque per la tua disponibilità!
Allora. Partendo dal presupposto che tu debba creare ad esempio una classe che ti contenga una serie di opzioni per il tuo programma visibile a tutte le altre classi, la prima cosa che ti viene in mente è quella di creare una classe statica. Proseguendo nel progetto ti viene in mente di realizzare un sistema per scrivere nella classe tante proprietà quanti sono i campi da salvare e di non volerli salvare tutti manualmente, ma di trovare un sistema automatico per farlo. A questo punto, dovresti ricorrere alla Reflection, tramite this.GetType().GetFields() per accedere al valore di tutti i campi e quindi ricorrere su di esso tramite un costrutto FOR o WHILE. Purtroppo però, le classi statiche non ti permettono di usare la keyword this e perciò non puoi far nulla. Utilizzando il Singleton, tutto questo invece non è un problema.
E’ più chiaro ora? Fammi sapere. A presto!