C#-Vererbung und Polymorphismus mit Programmbeispielen

⚡ Intelligente Zusammenfassung

Vererbung und Polymorphismus sind zwei zentrale Prinzipien der objektorientierten Programmierung in C#. Vererbung ermöglicht es einer Kindklasse, die Felder und Methoden einer Elternklasse wiederzuverwenden, während Polymorphismus es einem Methodennamen erlaubt, verschiedene Formen anzunehmen.

  • 🧬 Erbe: Eine Kindklasse erbt die Felder und Methoden ihrer Elternklasse und kann eigene hinzufügen.
  • 🔒 Geschützte Mitglieder: Durch die Kennzeichnung von Feldern der Elternklasse als geschützt können diese von einer abgeleiteten Kindklasse direkt wiederverwendet werden.
  • 🧩 Polymorphismus: Ein Methodenname kann viele Formen annehmen, daher verhält sich ein einzelner Aufruf je nach Kontext unterschiedlich.
  • 🔀 Methodenüberladung: Mehrere Methoden haben zwar denselben Namen, unterscheiden sich aber in ihren Parametern, die zur Kompilierzeit aufgelöst werden.
  • 🧱 Code Wiederverwendung: Beide Prinzipien vermeiden doppelten Code und sorgen für Konsistenz zwischen verwandten Klassen.
  • 🤖 KI-Unterstützung: GitHub Copilot generiert Basis- und abgeleitete Klassen; ML.NET verwendet Klassenhierarchien als Modelleingabe wieder.

Vererbung und Polymorphismus in C#

Was ist Vererbung in C#?

Erbe ist ein wichtiges Konzept von C#. Vererbung ist ein Konzept, bei dem Sie übergeordnete und untergeordnete Klassen definieren. Die untergeordneten Klassen erben Methoden und Eigenschaften der übergeordneten Klasse, können aber gleichzeitig bei Bedarf auch das Verhalten der Methoden ändern. Die untergeordnete Klasse kann bei Bedarf auch eigene Methoden definieren.

Lassen Sie uns die C#-Vererbung anhand eines Programmbeispiels besser verstehen:

Beispiel für eine C#-Vererbung

Sehen wir uns nun an, wie wir das Konzept der Vererbung in unseren Code integrieren können.

Schritt 1) Der erste Schritt besteht darin, den Code für unsere Tutorial-Klasse zu ändern. In diesem Schritt fügen wir den folgenden Code zur Datei Tutorial.cs hinzu.

Beispiel für eine C#-Vererbung

Beachten Sie, dass wir jetzt den Zugriffsmodifikator „protected“ sowohl zum TutorialID- als auch zum TutorialName-Feld hinzufügen müssen.

Erinnern Sie sich, dass wir diesen Zugriffsmodifikator bereits erwähnt hatten? Tutorial zu ZugriffsmodifikatorenHier wird der Sinn dieser Zugriffsmodifizierer deutlich. Nur mit diesem Zugriffsmodifizierer (protected) kann die Kindklasse auf die Felder der Elternklasse zugreifen.

Schritt 2) Der zweite Schritt besteht darin, unsere neue Kindklasse hinzuzufügen. Der Name dieser Klasse lautet „Guru99Tutorial“. In diesem Schritt fügen wir den folgenden Code in die Datei Tutorial.cs ein. Der Code sollte nach der Definition der Tutorial-Klasse eingefügt werden.

Beispiel für eine C#-Vererbung

Code Erläuterung:-

  1. Der erste Schritt besteht darin, die Guru99. Tutorial-Klasse. Diese Klasse ist eine Unterklasse der Tutorial-Klasse. Dies geschieht durch das Schlüsselwort ':'.
  2. Als Nächstes definieren wir eine Methode namens RenameTutorial. Es wird verwendet, um das Feld „TutorialName“ umzubenennen. Diese Methode akzeptiert eine String-Variable, die den neuen Namen des Tutorials enthält.
  3. Anschließend haben wir dem Feld TutorialName den Parameter pNewName zugewiesen. Hinweis: – Obwohl wir das Feld TutorialName in der „GuruIn der Klasse „99Tutorial“ können wir weiterhin auf dieses Feld zugreifen. Dies liegt daran, dass „GuruDie Klasse „Tutorial“ ist eine Unterklasse der Klasse „Tutorial“. Da die Felder der Klasse „Tutorial“ als geschützt deklariert wurden, können sie von dieser Klasse aus aufgerufen werden.

Schritt 3) Im letzten Schritt müssen wir unsere Hauptdatei Program.cs anpassen. In unserer Konsolenanwendung werden wir ein Objekt des Typs erstellen. Guru99Tutorial-Klasse. Mit diesem Objekt rufen wir die Methode RenameTutorial auf. Anschließend zeigen wir das Feld TutorialName mithilfe der Methode GetTutorial an.

Beispiel für eine C#-Vererbung

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 Erläuterung:-

  1. Der erste Schritt besteht darin, ein Objekt für die Guru99Tutorial-Klasse. Dies geschieht über das Schlüsselwort „new“. Beachten Sie, dass wir diesmal kein Objekt der Tutorial-Klasse erstellen.
  2. Wir verwenden die RenameTutorial-Methode. GuruDie Klasse 99Tutorial ändert das Feld TutorialName. Wir übergeben die Zeichenkette „.Net by Guru99” zur RenameTutorial-Methode.
  3. Anschließend rufen wir die Methode „GetTutorial“ auf. Beachten Sie, dass diese Methode zwar nicht in der Dokumentation definiert ist, aber… GuruIn der Klasse 99Tutorial können wir weiterhin auf diese Methode zugreifen. Die Ausgabe der Methode GetTutorial wird anschließend über die Methode Console.WriteLine in der Konsole angezeigt.

Wenn der obige Code richtig eingegeben und das Programm erfolgreich ausgeführt wird, wird die folgende Ausgabe angezeigt.

Ausgang:

Beispiel für eine C#-Vererbung

Aus der Ausgabe ist deutlich zu erkennen, dass das Feld „TutorialName“ von „.Net“ umbenannt wurde. Guru99”. Dies wurde durch die von der Kindklasse aufgerufene Methode RenameTutorial ermöglicht.

Was ist Polymorphismus in C#?

Polymorphie in C# Polymorphismus ist ein Konzept der objektorientierten Programmierung (OOP), bei dem ein Name mehrere Formen annehmen kann. Stellen Sie sich beispielsweise ein Smartphone zur Kommunikation vor. Die gewählte Kommunikationsart kann beliebig sein: Anruf, SMS, MMS, E-Mail usw. Das Ziel ist also immer dasselbe – die Kommunikation –, aber die Vorgehensweise ist unterschiedlich. Dies nennt man Polymorphismus.

Mit dem folgenden Programmbeispiel erhalten Sie ein besseres Verständnis des C#-Polymorphismus:

Beispiel für C#-Polymorphismus

Sehen wir uns nun an, wie wir das Konzept des Polymorphismus in unseren Code integrieren können.

Schritt 1) Der erste Schritt besteht darin, den Code für unsere Tutorial-Klasse zu ändern. In diesem Schritt fügen wir den folgenden Code zur Datei Tutorial.cs hinzu.

Beispiel für C#-Polymorphismus

Code Erläuterung:-

1 & 2) Der erste Schritt ist derselbe wie in unseren vorherigen Beispielen. Wir sind keeping die Definition der SetTutorial-Methode, wie sie ist.

3) Diese Methode legt die TutorialID und den TutorialName basierend auf den Parametern pID und pName fest.

4) Hier nehmen wir eine Änderung an unserer Klasse vor, indem wir eine neue Methode mit dem gleichen Namen SetTutorial hinzufügen. Nur übergeben wir dieses Mal nur einen Parameter, nämlich den pName. Bei dieser Methode setzen wir lediglich das Feld von TutorialName auf pName.

Schritt 2) Im letzten Schritt müssen wir unsere Hauptdatei Program.cs anpassen. In unserer Konsolenanwendung werden wir ein Objekt des Typs erstellen. Guru99. Tutoriumskurs.

Beispiel für C#-Polymorphismus

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 Erläuterung:-

  1. Im ersten Schritt verwenden wir die SetTutorial-Methode mit 2 Parametern. Dabei übergeben wir sowohl die TutorialID als auch den TutorialName an diese Methode.
  2. Im zweiten Schritt rufen wir nun die SetTutorial-Methode mit nur einem Parameter auf. Wir übergeben lediglich den TutorialName an diese Methode.

Wenn der obige Code richtig eingegeben und das Programm ausgeführt wird, wird die folgende Ausgabe angezeigt. Wenn Sie neben dem Tutorial-Namen auch die Tutorial-ID abrufen möchten, sollten Sie den folgenden Schritt ausführen

  1. Erstellen Sie eine separate Methode namens public int GetTutorialID
  2. Schreiben Sie in diese Methode die Codezeile „return TutorialID“. Dies kann verwendet werden, um die TutorialID an das aufrufende Programm zurückzugeben.

Ausgang:

Beispiel für C#-Polymorphismus

Aus der Ausgabe können wir deutlich erkennen, dass beide Methoden erfolgreich aufgerufen wurden. Aus diesem Grund wurden die Zeichenfolgen „First Tutorial“ und „Second Tutorial“ an die Konsole gesendet.

Häufig gestellte Fragen

C# unterstützt einfache, mehrstufige und hierarchische Vererbung über Klassen. Mehrfachvererbung ist nur über Schnittstellen möglich.

Nein. Die AC#-Klasse erbt nur von einer Basisklasse. Mehrfachvererbung verwendet stattdessen mehrere Schnittstellen.

Beim Überladen wird zur Kompilierzeit ein Name mit unterschiedlichen Parametern verwendet. Beim Überschreiben wird zur Laufzeit eine virtuelle Basismethode neu definiert.

Das Schlüsselwort virtual macht eine Basismethode überschreibbar; das Schlüsselwort override definiert sie in einer abgeleiteten Klasse neu.

Das Schlüsselwort base ermöglicht es einer abgeleiteten Klasse, den Konstruktor der Elternklasse aufzurufen oder auf versteckte oder überschriebene Basisklassenmember zuzugreifen.

Markieren Sie die Klasse als versiegelt. Eine versiegelte Klasse kann keine Basisklasse sein, wodurch weitere Vererbung verhindert und die Leistung verbessert wird.

Ja. GitHub Copilot generiert Basis- und Unterklassen und fügt virtuelle und überschreibbare Methoden aus einem Kommentar oder Klassennamen hinzu.

ML.NET definiert Daten- und Vorhersageklassen, die gemeinsame Member erben, und seine Pipeline verwendet einen gemeinsamen Transformer-Basistyp wieder.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: