Classi Derivate in C#

Nello scorso articolo abbiamo trattato delle classi e dei loro costruttori e distruttori, oggi trattiamo dell’ereditarietà e quindi delle classi derivate. Nella programmazione ad oggetti ogni classe abbiamo detto che è un oggetto e come ogni cosa in natura può essere rappresentata con proprietà ed essere modificata nell’ambiente tramite metodi. Facciamo l’esempio del tavolo, questo oggetto lo posso rappresentare tramite una classe alla quale attribuisco le proprietà che lo rappresentano e quindi altezza, larghezza e lunghezza. Attraverso i metodi posso fare delle traslazioni o delle rotazioni. L’oggetto tavolo è una classe base che presenta solo le caratteristiche di un oggetto generico, ma posso anche inserirgli altre proprietà ed apportare altri metodi e costruirlo in maniera più particolareggiata, ma sempre un tavolo rimane. Ecco cosa significa ereditarietà delle classi, facciamo un esempio:

using System;

public class CPersona
{
    protected string m_sNome;
    protected string m_sCognome;

    public CPersona(string sNome, string sCognome)
    {
         m_sNome = sNome;
         m_sCognome = sCognome;
    }

   public CPersona() { }

   public void Stampa()
    {
           Console.WriteLine(m_sNome + " " + m_sCognome);
     }
}

public class CStudente : CPersona
{
     private string m_sMatricola;

     public CStudente(string sNome, string sCognome,
        string sMatricola)
    {
        m_sNome = sNome;
        m_sCognome = sCognome;
        m_sMatricola = sMatricola;
    }
}

public class Corso
{
     static void Main(string[] args)
     {
           CStudente stu = new CStudente("Giampaolo", "Rossi",
               "146");
           stu.Stampa();

           Console.ReadKey();
     }
}

Come si può notare dall’esempio qui sopra per derivare una classe da un’altra occorre inserire 2 punti con il nome della classe base public CStudente : CPersona, inoltre occorre avere le proprietà della classe base di tipo protected in modo da potervi accedere da una classe derivata. Come vedete la classe CStudente è una classe specializzata di CPersona, quindi uno studente è una persona con il numero di matricola. Da notare che ho dovuto inserire 2 costruttori per CPersona, il primo con i valori assegnati, mentre il secondo con i valori non assegnati e questo è un caso di overloding. Si parla di overloading delle funzioni quando esse differiscono solo per gli argomenti ed i valori di ritorno, comunque faremo tanti esempi e vedrete da soli questa caratteristica. Se non avessi inserito il costruttore vuoto in CPersona non avrei potuto istanziarla nella classe base, basta provare! Un’altra cosa da notare è la stampa dei valori, in pratica vengono stampati solo nome e cognome perché in effetti viene richiamato un metodo pubblico da una classe derivata e la funzione ad essere invocata è quella della classe base, ma se ce ne fosse anche una in CStudente che stampa anche la matricola?

...
public void Stampa()
{
    Console.WriteLine(m_sNome + " " + m_sCognome + " "
          + m_sMatricola);
}
...

In pratica ho inserito il metodo all’interno della classe studente e questa volta è questo che viene richiamato.
Speriamo sia tutto chiaro e se non fosse così, postate commenti o andate sul nostro forum mi raccomando, rispondo a tutti.

<< Lezione Precedente – Inizio CorsoIndice LezioniLezione Successiva >>

Di Giampaolo Rossi

Sviluppatore software da oltre 16 anni.