Ereditarietà e polimorfismo C# con esempi di programmi

⚡ Riepilogo intelligente

In C#, l'ereditarietà e il polimorfismo sono due principi fondamentali della programmazione orientata agli oggetti. L'ereditarietà permette a una classe figlia di riutilizzare i campi e i metodi di una classe padre, mentre il polimorfismo consente a un singolo nome di metodo di assumere diverse forme.

  • 🧬 Eredità: Una classe figlia eredita i campi e i metodi della classe padre e può aggiungerne di propri.
  • 🔒 Membri protetti: Contrassegnare i campi della classe padre come protetti consente a una classe figlia derivata di riutilizzarli direttamente.
  • 🧩 Polimorfismo: Il nome di un metodo può assumere diverse forme, pertanto una singola chiamata si comporta in modo diverso a seconda del contesto.
  • 🔀 Sovraccarico del metodo: Diversi metodi condividono lo stesso nome ma differiscono nei parametri, che vengono risolti in fase di compilazione.
  • 🧱 Code riutilizzo: Entrambi i principi eliminano il codice duplicato e mantengono la coerenza delle classi correlate.
  • 🤖 Assistenza AI: GitHub Copilot genera automaticamente le classi base e derivate; ML.NET riutilizza le gerarchie di classi come input per il modello.

Ereditarietà e polimorfismo in C#

Cos'è l'ereditarietà in C#?

Eredità è un concetto importante di C#. L'ereditarietà è un concetto in cui si definiscono classi genitore e classi figlie. Le classi figlie ereditano metodi e proprietà della classe genitore, ma allo stesso tempo possono anche modificare il comportamento dei metodi, se necessario. La classe figlia può anche definire metodi propri, se necessario.

Comprendiamo meglio l'ereditarietà C# tramite un esempio di programma:

Esempio di eredità C#

Vediamo ora come possiamo incorporare il concetto di ereditarietà nel nostro codice.

Passo 1) Il primo passo è modificare il codice per la nostra classe Tutorial. In questo passaggio, aggiungiamo il codice seguente al file Tutorial.cs.

Esempio di eredità C#

Tieni presente che ora dobbiamo aggiungere il modificatore di accesso 'protetto' sia al campo TutorialID che a TutorialName.

Ricorda che avevamo menzionato questo modificatore di accesso nel Tutorial sui modificatori di accessoEcco, qui si può capire lo scopo di questa impostazione. Solo quando è presente il modificatore di accesso (protected), la classe figlia può utilizzare i campi della classe padre.

Passo 2) Il secondo passo è aggiungere la nostra nuova classe figlia. Il nome di questa classe sarà "Guru99Tutorial”. In questo passaggio, aggiungiamo il codice seguente al file Tutorial.cs. Il codice deve essere posizionato dopo la definizione della classe Tutorial.

Esempio di eredità C#

Code Spiegazione:-

  1. Il primo passo è creare il Guru99Classe figlia Tutorial. Dobbiamo anche menzionare che questa classe sarà una classe figlia della classe Tutorial. Questo viene fatto tramite la parola chiave ':'.
  2. Successivamente, stiamo definendo un metodo chiamato RenameTutorial. Verrà utilizzato per rinominare il campo TutorialName. Questo metodo accetta una variabile stringa che contiene il nuovo nome del Tutorial.
  3. Abbiamo quindi assegnato il parametro pNewName al campo TutorialName. Note:: – Anche se non abbiamo definito il campo TutorialName nel “Guruclasse” 99Tutorial”, siamo ancora in grado di accedere a questo campo. Questo perché “Guru99Tutorial” è una sottoclasse della classe Tutorial. E poiché abbiamo reso i campi della classe Tutorial protetti, questi possono essere accessibili da questa classe.

Passo 3) L'ultimo passaggio consiste nel modificare il nostro file principale Program.cs. Nella nostra applicazione console, creeremo un oggetto del GuruClasse 99Tutorial. Con questo oggetto, chiameremo il metodo RenameTutorial. Successivamente, visualizzeremo il campo TutorialName con l'aiuto del metodo GetTutorial.

Esempio di eredità C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 public class Tutorial
 {
  protected int TutorialID; 
  protected string TutorialName;
  
  public void SetTutorial(int pID,string pName) 
  {
   TutorialID=pID;
   TutorialName=pName;
  }
  
  public String GetTutorial()
  {
   return TutorialName;
  }
 }
  public class Guru99Tutorial:Tutorial
  {
   public void RenameTutorial(String pNewName)
   {
    TutorialName=pNewName;
   }
  
  static void Main(string[] args) 
  {
   Guru99Tutorial pTutor=new Guru99Tutorial();
   
   pTutor.RenameTutorial(".Net by Guru99");
    
   Console.WriteLine(pTutor.GetTutorial());
    
   Console.ReadKey(); 
  }
 }
}

Code Spiegazione:-

  1. Il primo passo è creare un oggetto per il Guru99Classe Tutorial. Questo viene fatto tramite la parola chiave 'new'. Si noti che questa volta non stiamo creando un oggetto della classe Tutorial.
  2. Utilizziamo il metodo RenameTutorial del Guru99Classe Tutorial per modificare il campo TutorialName. Passiamo la stringa “.Net by Guru99” al metodo RenameTutorial.
  3. Successivamente chiamiamo il metodo GetTutorial. Nota che anche se questo metodo non è definito nel GuruNella classe 99Tutorial, siamo ancora in grado di accedere a questo metodo. L'output del metodo GetTutorial viene quindi visualizzato nella console tramite il metodo Console.WriteLine.

Se il codice sopra riportato viene immesso correttamente e il programma viene eseguito correttamente, verrà visualizzato il seguente output.

Produzione:

Esempio di eredità C#

Dall'output, possiamo vedere chiaramente che il campo TutorialName è stato rinominato in ".Net by Guru99”. Ciò è stato reso possibile dal metodo RenameTutorial chiamato dalla classe figlia.

Cos'è il polimorfismo in C#?

Polimorfismo in C# Il polimorfismo è un concetto della programmazione orientata agli oggetti (OOP) in cui un nome può avere molteplici forme. Ad esempio, si può utilizzare uno smartphone per comunicare. La modalità di comunicazione scelta può essere qualsiasi: una chiamata, un messaggio di testo, un messaggio con immagini, un'e-mail, ecc. L'obiettivo è lo stesso, ovvero comunicare, ma l'approccio è diverso. Questo concetto è chiamato polimorfismo.

Otterrai una migliore comprensione del polimorfismo C# dal seguente esempio di programma:

Esempio di polimorfismo C#

Vediamo ora come possiamo incorporare il concetto di Polimorfismo nel nostro codice.

Passo 1) Il primo passo è modificare il codice per la nostra classe Tutorial. In questo passaggio, aggiungiamo il codice seguente al file Tutorial.cs.

Esempio di polimorfismo C#

Code Spiegazione:-

1 e 2) Il primo passo è lo stesso dei nostri esempi precedenti. Stiamo tenendoping la definizione del metodo SetTutorial così com'è.

3) Questo metodo imposta il TutorialID e il TutorialName in base ai parametri pID e pName.

4) Qui è dove apportiamo una modifica alla nostra classe in cui aggiungiamo un nuovo metodo con lo stesso nome di SetTutorial. Solo che questa volta stiamo passando solo un parametro che è pName. In questo metodo, stiamo semplicemente impostando il campo TutorialName su pName.

Passo 2) L'ultimo passaggio consiste nel modificare il nostro file principale Program.cs. Nella nostra applicazione console, creeremo un oggetto del Guru99 Lezione di tutoraggio.

Esempio di polimorfismo C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 class Tutorial
 {
  public int TutorialID; 
  public string TutorialName;
  
  public void SetTutorial(int pID,string pName) 
  {
   TutorialID=pID;
   TutorialName=pName;
  }
  public void SetTutorial(string pName) 
  {
   TutorialName=pName;
  }
  public String GetTutorial()
  {
   return TutorialName;
  }
  
  static void Main(string[] args) 
  {
   Tutorial pTutor=new Tutorial();
   
   pTutor.SetTutorial(1,"First Tutorial");
   Console.WriteLine(pTutor.GetTutorial());
   
   pTutor.SetTutorial("Second Tutorial");
   Console.WriteLine(pTutor.GetTutorial());
    
   Console.ReadKey(); 
  }
 }
}

Code Spiegazione:-

  1. Nel primo passaggio utilizziamo il metodo SetTutorial con 2 parametri. Dove stiamo passando sia TutorialID che TutorialName a questo metodo.
  2. Nel secondo passaggio chiameremo ora il metodo SetTutorial con un solo parametro. Stiamo semplicemente passando TutorialName a questo metodo.

Se il codice sopra è stato inserito correttamente e il programma è stato eseguito, verrà visualizzato il seguente output. Se nel caso volessi anche recuperare l'ID del tutorial insieme al nome del tutorial, dovresti seguire il passaggio seguente

  1. Crea un metodo separato chiamato public int GetTutorialID
  2. In questo metodo scrivi la riga di codice "return TutorialID". Questo può essere utilizzato per restituire il TutorialID al programma chiamante.

Produzione:

Esempio di polimorfismo C#

Dall'output, possiamo vedere chiaramente che entrambi i metodi sono stati chiamati con successo. Per questo motivo sono state inviate alla console le stringhe “Primo Tutorial” e “Secondo Tutorial”.

DOMANDE FREQUENTI

C# supporta l'ereditarietà singola, multilivello e gerarchica tramite classi. L'ereditarietà multipla è possibile solo tramite interfacce.

No. Una classe AC# eredita da una sola classe base. L'ereditarietà multipla utilizza invece diverse interfacce.

L'overloading utilizza un nome con parametri diversi in fase di compilazione. L'overridefinisce un metodo base virtuale in fase di esecuzione.

La parola chiave `virtual` rende un metodo di base sovrascrivibile; la parola chiave `override` lo ridefinisce in una classe derivata.

La parola chiave `base` consente a una classe derivata di chiamare il costruttore della classe padre o di accedere a membri base nascosti o sovrascritti.

Contrassegna la classe come sigillata. Una classe sigillata non può essere una classe base, impedendo ulteriore ereditarietà e migliorando le prestazioni.

Sì. GitHub Copilot genera automaticamente la struttura delle classi base e derivate e aggiunge metodi virtuali e di override a partire da un commento o dal nome della classe.

ML.NET definisce classi di dati e di previsione che ereditano membri condivisi e la sua pipeline riutilizza un tipo base di trasformatore comune.

Riassumi questo post con: