Eredità
Una classe può derivare da un’altra classe ereditando tutti i membri dati e funzione non privati con la possibilità di personalizzarli. Al nome della classe bisogna far seguire i due punti e il nome della classe che si vuole implementare.
classe Computer { private int spazioHD; private int spazioUtilizzato; public string sistemaOperativo { get; set; }; public void AggiungiFile(int dimFile) { spazioUtilizzato += dimFile; if(spazio >= spazioHD) { spazioUtilizzato -= dimFile; Console.WriteLine("HD pieno"); } }
I dati spazioHD e SpazioUtilizzato sono dichiarati privati quindi una classe derivata non li può modificare direttamente ma tramite la funzione AggiungiFile.
classe SedePc : Computer { private string nomeAzienda; public string NomeAzienda { get { return nomeAzinda; } set { nomeAzienda = value; } } }
La classe SedePC eredita dalla classe madre il membro funzione AggingiFile che modifica il membro privato spazioUtilizzato.
SedePC sedeRoma = new SedePc(); sedeRoma.NomeAzienda = "RiboSoft"; sedeRoma.SistemaOperativo = "OsX"; sedeRoma.AggingiFile(1024);
Il modificatore sealed evita che una classe possa essere eredità, serve per limitare il suo utilizzo all’interno di una libreria.
Polimorfismo
Permette ad una classe di utilizzare gli stessi membri della classe ereditata in maniera differente. Possiamo anche aver bisogno di richiamare il metodo base dentro al metodo ridefinito, in questo caso si deve anteporre “base.”.
Una classe può prevedere quali membri potranno essere ridefiniti, tali membri dovranno essere indicati con il modificatore virtual. Nella classe derivata il metodo deve anticipare il metodo override.
Classi e Metodi astratti
Una classe astratta serve per raggruppare funzionalità che saranno utilizzate dalle classi derivate, all’interno possiamo definire metodi astratti che non possiedono un corpo.
Interfacce
Vengono utilizzate per indicare le funzionalità che si vogliono implementare, la classe o la struct fornirà l’implementazione.
Per indicare che una classe implementa un’interfaccia utilizziamo la stessa sintassi usata per derivare una classe da una classe madre. Se una classe deriva da una classe madre e implementa una interfaccia dobbiamo prima indicare la classe madre e poi le interfacce.
Se due interfacce definiscono lo stesso metodo e una classe li vuole implementare entrambi deve esplicitare anche il nome dell’interfaccia prima del nome del membro.
public class Documento: IDocUno, IDocDue { void IDocUno.Print() { ... } void IDocDue.Print() { ... } }
Una interfaccia supporta l’eredità da altre interfacce e quindi eredita tutti i membri definiti nelle altre interfacce da cui deriva.