l'ereditarietà tra le classi di indica con il segno
:
sintassi: creazione classe derivata
modificatore_accesso class NOME_CLASSE_DERIVATA : NOME_CLASSE_BASE
{
....;
}
la classe derivata avrà ereditato:
- ciò che nella classe base è stato definito come public, protected o internal
- variabile
- metodo
- proprietà
- non eredita il costruttore che dovrà essere implementato con la parola base
modificatore_accesso NOME_CLASSE_DERIVATA (parametri) : base(parametri costruttore classe base)
esempio: classe base Persona → classe derivata Studente
costruzione
public class Persona classe base
{
string mNome; variabile non visibile dalla derivata perché private
protected string mCognome; variabile visibile dalla derivata perché protected
public Persona(string Nome, string Cognome) costruttore base
{
mNome = Nome;
mCognome = Cognome;
}
public string Nome proprietà classe base perché Nome é private
{
get { return mNome; }
set { mNome = value; }
}
...;
}
public class Studente : Persona classe derivata
{
private int mMatricola;
public Studente(string Nome, string Cognome, int Matricola) : base(Nome, Cognome) costruttore derivato
si può in caso di necessità imporre una variabile dei parametri della classe base costante,
ex: : base("Pippo", Cognome) → Nome = "Pippo" per tutti gli studenti
{
mMatricola = Matricola;
}
public int Matricola proprietà derivata (+ quella base ereditata)
{
get { return mMatricola; }
set { mMatricola = value; }
}
}
dichiarazione
Studente stud = new Studente("Marco", "", 0); creo oggetto Studente
stud.Matricola = 232440; Corretto: Matricola è una proprietà della classe Studente
stud.Cognome = "Minerva"; Corretto: Cognome è una proprietà ereditata da Persona
Persona pers = new Persona("Marco", ""); creo oggetto Persona
pers.Cognome = "Minerva"; Corretto: Cognome è una proprietà della classe Persona
pers.Matricola = 232440; Errato: la proprietà Matricola non è visibile da Persona
conseguenze e caratteristiche:
- dove è previsto l'uso di una certa classe è quasi sempre possibile utilizzare una sua classe derivata
- se un metodo richiede come parametri determinati oggetti, sarà possibile passare oggetti derivati
esempio: a un metodo che confronta la variabile Nome di due oggetti persona Persona é possibile passare anche un oggetto Studente, in quanto Studente é una persona Persona
public static bool NomiUguali(Persona p1, Persona p2) metodo che chiede due oggetti Persona
{
return (p1.Nome == p2.Nome); funzione che ritorna true se le variabili Nome dei due oggetti sono uguali
}
Persona pers = new Persona("Marco", "Rossi"); oggetto Persona
Studente stud = new Studente("Marco", "Minerva", 232440); oggetto Studente che deriva da Persona
Console.WriteLine(NomiUguali(pers, stud)); richiama il metodo e visualizza il risultato passando i due oggetti Persona e derivato di Persona
all'interno della routine NomiUguali la variabile stud viene vista come una Persona, e, quindi, di stud sono visibili i metodi e le proprietà pubbliche della classe Persona, non quelli di Studente.
- l'ereditarietà è singola
una classe può avere solo una classe base, a differenza del C++, non è possibile definire una classe C che eredita contemporaneamente da A e da B