Vererbung und Polymorphie Marc Satkowski, Sascha Peukert 29. September 2016 C# Kurs
Gliederung 1. Methodenüberladung 2. Vererbung Polymorphie Methoden- & Eigenschaftsüberschreibung Weitere Schlüsselwörter 3. Abstrakt 4. Interface 1
Methodenüberladung
Methodenüberladung Mehrere Methoden können den selben Namen haben Diese Unterscheiden sich dann in dem Rückgabewert und/oder den Übergabeparametern (Reihenfolge beachten!) Wird genutzt wenn es mehrere Wege gibt eine Berechnung/Algorithmus auszuführen 1 public int addieren ( int a, int b) 2 { 3 return a + b; 4 } 5 6 public float addieren ( float a, float b) 7 { 8 return a + b; 9 } 2
Vererbung
Vererbung Ermöglicht das definieren von Klassen die auf anderen basieren Diese erben die Funktionalitäten der Basisklasse und können diese benutzen oder erweitern Es wird alles vererbt, doch einige Member sind von dem Erben nicht sichtbar Alle Klassen erben von der Klasse Object Klassen können maximal von einer Klasse erben Die Klasse die Verhalten vererbt heiß Basisklasse und die Klasse, die es erbt, heißt abgeleitete Klasse Syntax: class <Klassenname> : <Basisklasse> 1 public class einebasisklasse 2 { } 3 public class EineKlasse : einebasisklasse 4 { } 3
Polymorphie Zu dt. Vielgestaltigkeit Instanzen abgeleitete Klassen können auch immer als Instanzen einer ihrer Basisklassen betrachtet werden Basisklassen können Methoden und Eigenschaften besitzen, die von den abgeleiteten Klassen überschrieben werden können Während der Nutzung eines Objekts als Basisklasse wird der Laufzeittyp ermittelt und die überschrieben/veränderten Methoden und Eigenschaften genutzt Alle nicht überschriebenen Methoden oder Eigenschaften sind identisch mit denen der Basisklasse 4
Methoden- & Eigenschaftsüberschreibung virtual Erlaubt das Überschreiben einer Methode Wird an die Methoden einer Basisklasse geschrieben 1 public class EineKlasse 2 { 3 // Die Methode darf ueberschrieben werden. 4 public virtual int EineMethode () 5 { 6 // Code 7 } 8 // Die Methode darf nicht ueberschrieben werden. 9 public float AndereMethode () 10 { 11 // Code 12 } 13 } 5
Methoden- & Eigenschaftsüberschreibung override new Gibt an, dass es sich um eine Überschreibung einer Methode aus der Basisklasse handelt Es darf bloß überschrieben werden, wenn die Methode in der Basisklasse ein virtual hat Wird an die Methoden in der abgeleiteten Klasse geschrieben Gibt an ob eine neue Methode mit selber Signatur wie in einer Basisklasse erzeugt wird Die ursprüngliche Methode wird bei der Nutzung der abgeleiteten Klasse ausgeblendet 6
Methoden- & Eigenschaftsüberschreibung 1 public class AndereKlasse : EineKlasse 2 { 3 // Die beiden Methoden werden ueberschrieben. 4 public override int EineMethode () 5 { 6 // Neuer Code 7 } 8 public new float AndereMethode () 9 { 10 // Neuer Code 11 } 12 } 7
Weitere Schlüsselwörter sealed Modifikator für Klassen und Methoden Verhindert das von einer Klasse geerbt werden kann Bei Methoden wird verhindert, dass diese weiter überschrieben werden können 1 public class EineKlasse 2 { } 3 // Keiner kann mehr von dieser Klasse erben. 4 public sealed class AndereKlasse : EineKlasse 5 { } 8
Weitere Schlüsselwörter as Wird als Casting-Operator zwischen vererbten Klassen genutzt Syntax: (<Variable> as <Datentyp/Klasse>) Nach der Klammer kann auf die Variable als der neue Typ zugegriffen werden Falls die Umwandlung nicht möglich ist, wird die Operation als null ausgewertet 1 // Durch Polymorphie ist der Typ im Code " EineKlasse " 2 // aber zur Laufzeit " AndereKlasse ". 3 EineKlasse variable = new AndereKlasse (); 4 // Umwandlung der Varaible in " AndereKlasse ". 5 AndereKlasse anderevariable = ( variable as AndereKlasse ); 9
Weitere Schlüsselwörter base Ist eine Referenz auf die Member der Basisklasse Ermöglicht es auf die Methoden- und Eigenschaftsimplementationen der Basisklasse zuzugreifen Muss genutzt werden, wenn die Basisklasse einen Konstruktor mit Übergabeparametern hat Dabei wird der Konstruktor der Basisklasse vor dem eigenen aufgerufen Syntax: Klasse([Übergabeparameter-B][Übergabeparameter]) : base([übergabeparameter-b]) { <Code> } 10
Weitere Schlüsselwörter 1 public EineKlasse 2 { 3 public EineKlasse ( int parameter1, int parameter2 ) 4 { /* Code */ } 5 public virtual float EineMethode ( int a) 6 { /* Code */ } 7 } 8 9 public AndereKlasse : EineKlasse 10 { 11 public AndereKlasse ( int par1, int par2, string par3 ) 12 : base (par1, par2 ) 13 { /* Anderer Code */ } 14 public override float EineMethode ( int a) 15 { 16 // Hier wird die Basismethode aufgerufen. 17 base. EineMethode (a - 5); 18 // Neuer Code 19 } 20 } 11
Abstrakt
Abstrakt Schlüsselwort abstract Kann für Klassen, Methoden und Eigenschaften genutzt werden Gibt an ob keine Implementierung existieren darf Von Klassen die abstract sind, können keine Objekte initialisiert werden Dementsprechend muss von diesen geerbt werden um sie zu nutzen Methoden und Eigenschaften besitzen keinen Körper wenn diese abstract sind Dementsprechend wird eine Klasse, die davon erbt, gezwungen diese Methoden und Eigenschaften zu überschreiben und zu implementieren Eigenschaften können dennoch entscheiden ob sie ein get oder set brauchen und die abgeleitete Klasse darf nur die vorgegebenen implementieren 12
Abstrakt 1 public abstract class EineKlasse 2 { 3 // Eine abstrakte Methode ohne Koerper. 4 public abstract int EineMethode (); 5 public virtual float AndereMethode () 6 { 7 // Code 8 } 9 } 10 11 public class AndereKlasse : EineKlasse 12 { 13 // Diese Methode muss implementiert werden, 14 // die " AndereMethode " nicht. 15 public override float EineMethode () 16 { 17 // Code 18 } 19 } 13
Interface
Interface Zu dt. Schnittstelle Enthält nur die Signaturen von Methoden und Eigenschaften Das heißt diese haben alle keinen Körper Interfaces und Klassen können von beliebig vielen Interfaces erben Die Klassen, die von Interfaces erben, müssen alle in den Interfaces definierten Methoden und Eigenschaften implementieren 14
Interface 1 public interface EinInterface 2 { 3 // Nur Signaturen ohne Koerper. 4 public string EinString { get ; set ; } 5 public bool EineMethode (); 6 } 7 8 public class EineKlasse : EinInterface 9 { 10 // Diese Member muessen nun implementiert werden. 11 public string EinString 12 { 13 get { /* Code */ } 14 set { /* Code */ } 15 } 16 public bool EineMethode () 17 { 18 // Code 19 } 20 } 15