Classi, metodi e proprietà in C#

17 marzo 2006

Il concetto di classe è alla base di ogni linguaggio di programmazione orientato agli oggetti ed ha la potenza di definire le caratteristiche di un insieme di oggetti che hanno proprietà e compiono azioni uguali. Rappresenta tutti gli oggetti che appartengono ad una certa classe, appunto.

Per fare un’esempio si pensi alle automobili: ogni automobile è diversa da un’altra ma tutte hanno quattro ruote un propulsore e compiono l’azione di avanzare o frenare. Questi elementi comuni le fanno rientrare in un unico concetto. Un’unica classe.

Più praticamente possiamo vedere una classe è una collezione di variabili, metodi e proprietà. Anche in questo caso, C# riprende la sintassi di Java dove per definire una classe si usa il costrutto class.

public class Persona
{
	string mNome;
	string mCognome;
	//Altre variabili...

	public Persona(string Nome, string Cognome)
	{
		//Imposta le proprietà iniziali della classe.
		mNome = Nome;
		mCognome = Cognome;
	}

	public void StampaMessaggio()
	{ }
	
	private void Appoggio()
	{ }
}

A volte una classe è identificata anche come “tipo di dato“, infatti porta con sé sia la rappresentazione dei dati, sia le operazioni sugli stessi, in realtà il concetto di classe è più vasto.

Oggetti e costruttori

Possiamo però cosiderare le istanze di una classe, ovvero gli oggetti che realizzano il concetto di classe, come variabili definite da un certo tipo di dato.

//Crea un oggetto p che è istanza della classe Persona
Persona p = new Persona("Marco", "Minerva"); 

Per ogni classe istanziata, viene creato un’oggetto ed è invocato un metodo detto costruttore della classe. Il costruttore, così come avviene in Java e in C++, ha lo stesso nome della classe e non restituisce alcun valore (nel nostro esempio il metodo public Persona). In VB .NET, invece, il costruttore è definito in un metodo dichiarato come Sub New.

Il costruttore è utilizzato per impostare le proprietà che la classe deve avere al momento della sua creazione: nel nostro esempio, quando si crea una istanza della classe Persona, le sue variabili mNome e mCognome assumono i valori specificati nel relativo argomento del costruttore.

Metodi, cosa sono e come si dichiarano

I metodi rappresentano le modalità con cui si può accedere agli oggetti per stimolarli a mettere in atto azioni o comportamenti. Più pragmaticamente si tratta di routines (funzioni o procedure), vediamo come dichiararle.

I metodi di una classe possono essere definiti come public, private, protected oppure internal (“Friend” in Visual Basic .NET): queste parole chiave vengono solitamente chiamate modificatori di accesso.

Con public, una routine diventa accessibile da tutte le istanze della classe. private, invece, impedisce che la routine sia visibile al di fuori della classe di in cui è definita.

Se non si specifica il modificatore di accesso, private è il valore predefinito. Ad esempio, utilizzando ancora la nostra classe Persona:

Persona p = new Persona("Marco", "Minerva");

// Corretto, StampaMessaggio è public
p.StampaMessaggio(); 

// Errato, Appoggio è private, quindi non è accessibile
p.Appoggio(); 

Dichiarando una metodo della classe Persona come protected, esso sarà visibile nell’ambito in cui definiamo le classi che ereditano da Persona ma non potrà essere utilizzata nel codice in cui istanziamo oggetti di questa classe. L’ereditarietà sarà trattata nelle prossime lezioni.

In pratica, protected è simile a private, con la differenza che il metodo è visibile anche alle classi che ereditano da quella principale. Infine, ciò che è dichiarato come internal è visibile solo all’interno dell’assembly dell’applicazione; per il concetto di assembly fare riferimento alle Lezioni dedicate a Visual Studio.

Dopo il modificatore di accesso del metodo, nella dichiarazione è necessario specificare il tipo di dato restituito.

È possibile indicare un qualsiasi tipo di dato: int, string, byte, etc. Si può specificare anche il nome di una classe, poiché, ricordiamo, una classe è un tipo. Questo tipo di metodi corrisponde alle Function di VB.

Per restituire il valore, è necessario utilizzare la parola chiave return, seguita da una qualsiasi espressione che abbia lo stesso tipo del valore di ritorno del metodo. Tale istruzione causa anche l’uscita dal metodo. Ad esempio:

public int Quadrato(int N)
{
  return N * N;
  //Eventuale codice scritto qui non verrà eseguito.
}

In C# un metodo che restituisce un valore deve obbligatoriamente contenere la parola chiave return, altrimenti, in fase di compilazione, si otterrà un errore.

Le funzioni di Visual Basic, invece, possono non presentare il return: in tal caso il valore restituito è quello di default per il particolare tipo di dati.

I metodi che non restituiscono un valore, come StampaMessaggio() e Appoggio() dell’esempio, hanno tipo void; essi corrispondono alle Sub di Visual Basic. Si può comunque usare la parola return in un metodo void, che in questo caso ha il solo scopo di uscire dalla procedura: in questo caso, quindi return non deve essere seguito da alcuna espressione.

Le proprietà

Una classe può contenere anche un altro tipo di metodi, le cosiddette proprietà. Si tratta di particolari routine che permettano di leggere e/o impostare i valori di determinate proprietà di una classe. Aggiungiamo, per esempio, la seguente proprietà alla classe Persona:

public string Nome
{
	get { return mNome; }
	set { mNome = value; }
}

Essa permette di avere accesso in lettura/scrittura alla variabile mNome, che altrimenti non sarebbe visibile all’esterno della classe. Il blocco get deve restituire la variabile associata alla proprietà, quindi, come detto prima, deve contenere l’istruzione return.

Il codice del blocco set, invece, viene eseguito quando si modifica il valore della proprietà; la parola chiave value contiene il nuovo valore da assegnare. L’utilizzo delle proprietà è intuitivo:

Persona p = new Persona("Marco", "Minerva");

//Stampa "Marco" (richiama il blocco get)
Console.WriteLine(p.Nome); 

//Imposta il nome a "Pippo" (richiama il blocco set)
p.Nome = "Pippo"; 

Allo stesso modo è possibile aggiungere una proprietà Cognome.

È lecito domandarsi perché utilizzare le proprietà, quando si potrebbe più semplicemente rendere pubbliche le variabili mNome e mCognome. Conviene avere una classe con membri privati accessibili solo tramite proprietà quando si devono effettuare dei controlli sui valori assegnati ai membri stessi.

Ad esempio, supponiamo di voler impedire che l’utente inserisca un nome o un cognome vuoto: se impostiamo le variabili mNome e mCognome come pubbliche questo controllo non può essere effettuato.

Infatti si ha libero accesso alle variabili che possono essere impostate su qualunque stringa valida (compresa, dunque, la stringa vuota). Per risolvere il problema, è sufficiente definire i membri come privati e modificare la proprietà Nome nel modo seguente:

public string Nome
{
  get { return mNome; }
  set
  {
    if (value == string.Empty)
      mNome = "(Nessun nome)";
    else
      mNome = value;
  }
}

In modo analogo, anche la proprietà Cognome deve essere ridefinita.

string.Empty è un campo a sola lettura che rappresenta la stringa vuota. Se Nome oppure Cognome vengono impostati sulla stringa vuota, questo codice li definisce, rispettivamente, come Nessun nome e Nessun cognome.

Notiamo che, per ottenere un comportamento coerente di tutta la classe, anche il costruttore deve essere modificato in modo da effettuare un controllo sugli argomenti.

È buona norma definire delle proprietà che consentano di modificare i valori delle variabili utilizzate da una classe, in modo da avere un maggior controllo sui dati specificati, piuttosto che dare libero accesso alle variabili stesse.

Le proprietà possono anche essere di sola lettura, se dispongono del solo blocco get, oppure di sola scrittura, se hanno solo il codice associato al set.

Per ottenere un comportamento analogo in Java oppure in C++, è necessario definire due metodi distinti, i cosiddetti metodi getter (per recuperare il valore) e setter (per impostarlo).

Il codice completo della classe può essere scaricato qui. Nel file da scaricare è incluso un semplicissimo esempio di uso della classe Persona.

Tutte le lezioni

1 ... 3 4 5 ... 27

Se vuoi aggiornamenti su Classi, metodi e proprietà in C# inserisci la tua e-mail nel box qui sotto:
Tags:
 
X
Se vuoi aggiornamenti su Classi, metodi e proprietà in C#

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento dei dati per attività di marketing