Eredità
Eredità e polimrofismo permettono di implementare una classe a partire da una esistente per riutilizzarla e ampliarne le funzionalità, dati e membri privati non vengono ereditati.
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. Il modificatore protected permette di estendere la visibiltà dei membri all’interno delle classi che derivano da essa.
Si può bloccare l’eredità della classe tramite il modificatore sealed.
Anche i record, no le struct, supportano l’eredità.
Con il termine polimorfismo intendiamo la possibilità che ha un oggetto di assumere comportamenti differenti utilizzando i metodi della classe madre.
Una sottoclasse può utilizzare i membri pubblici o protected definiti nella classe madre, la classe figlia può implementare un metodo presente nella classe madre in modo da nascondere quello ereditato. Possiamo forzare di utilizzare quello definito nella classe madre utilizzando la parola chiave base, possiamo utilizzare base per utilizzare i costrutti della classe madre non ereditabili.
La classe madre può prevedere quali membri potranno essere ridefiniti indicandoli con il modificatore virtual, mentre nelle classi derivate utilizziamo il modificatore override. Il tipo di ritorno deve essere un tipo compatibile con quello definito nella classe madre.
Possiamo decidere di bloccare l’override di alcuni metodi virtuali tramite il modificatore sealed.
Una classe astratta serve per raggruppare funzionalità che saranno utilizzate dalle classi derivate, all’interno possiamo definire metodi astratti che non possiedono un corpo.
Le interfacce vengono utilizzate per indicare le funzionalità che si vogliono implementare, lasciando alla classe o struct il compito di fornire l’implementazione. Una classe può derivare da un’altra e implementare interfacce, basta indicare per primo il nome della classe madre e poi le interfacce separate dalla virgola.
Nell’esempio seguente vediamo che si può utilizzare i membri dell’interfaccia mediante il cast o l’operatore as.
Si possono implementare più interfacce conteporaneamente, se più interfacce definiscono uno stesso metodo possiamo implementare i due metodi indicando esplicitamente a quale interfaccia fa riferimento (implementazione esplicita).