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: