90 lines
2.7 KiB
Markdown
90 lines
2.7 KiB
Markdown
|
# Heredity
|
|||
|
|
|||
|
Die Vererbung ist wohl das mächtigste Tool für C#.\
|
|||
|
Es bedeutet, dass man von Mutter klassen zu Tochter klassen alle Eigenschaften weitergeben kann.
|
|||
|
|
|||
|
In meinem Beispiel, werde ich dass aufzeigen anhand eines Zoo's mit Tieren und den Kategorien welche es da gibt.
|
|||
|
|
|||
|
## Mutter Klasse
|
|||
|
|
|||
|
Wir haben ein Tier, dieses kann ein Geräusch machen mit der Methode `MakeNoise()`.\
|
|||
|
Wenn ich nun ein Säugetier erstellen will, macht dieses ja ein anderes Geräusch als ein Vogel.
|
|||
|
|
|||
|
Wichtig ist: Bei einer Mutter klasse schreiben wir immer da das Keyword `virtual` hin, wo wir die Möglichkeit haben wollen, in der Tochter klasse dies zu bearbeiten oder ganz zu verändern.
|
|||
|
|
|||
|
```
|
|||
|
namespace Zoo.Animals
|
|||
|
{
|
|||
|
public abstract class Animal
|
|||
|
{
|
|||
|
public virtual string name { get; set; } = "animal";
|
|||
|
public virtual string foodType { get; } = "Animalfood";
|
|||
|
public virtual string habitat { get; } = "Cage";
|
|||
|
|
|||
|
public virtual void MakeNoise()
|
|||
|
{
|
|||
|
Debug.Write($"{this.name} makes a Noise: ");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Wir lassen jetzt das Säugetier von Animal erben.\
|
|||
|
Dies geht, indem wir nach dem Klassennamen die zu erbende Klasse nach einem : einfügen. Hier mit: `Mammal : Animal`
|
|||
|
|
|||
|
```
|
|||
|
namespace Zoo.Animals
|
|||
|
{
|
|||
|
public abstract class Mammal : Animal
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Nun können wir einige der Properties und Methoden verändern bzw. überschreiben.\
|
|||
|
Wir ändern `foodType` & `habitat` so wie die Methode `MakeNoise()`.\
|
|||
|
Mit dem Keyword `override`.
|
|||
|
|
|||
|
```
|
|||
|
namespace Zoo.Animals
|
|||
|
{
|
|||
|
public abstract class Mammal : Animal
|
|||
|
{
|
|||
|
public override string foodType => "Mammalfood";
|
|||
|
public override string habitat => "Cage";
|
|||
|
|
|||
|
public override void MakeNoise()
|
|||
|
{
|
|||
|
Debug.WriteLine($"{this.name} makes a Noise: Mammal Noise");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Wenn wir uns den Code der Methode `MakeNoise()` von Animal anschauen sehen wir, dass wir ein `Debug.Write` verwenden dies könnten wir weiterverwenden, mit `this.base()`
|
|||
|
|
|||
|
```
|
|||
|
namespace Zoo.Animals
|
|||
|
{
|
|||
|
public abstract class Mammal : Animal
|
|||
|
{
|
|||
|
public override string foodType => "Mammalfood";
|
|||
|
public override string habitat => "Cage";
|
|||
|
|
|||
|
public override void MakeNoise()
|
|||
|
{
|
|||
|
this.MakeNoise();
|
|||
|
Debug.WriteLine("Mammal Noise");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Mit diesem Code wird erst die Methode `MakeNoise()` von Animal aufgerufen. Was dazu führt, dass in die Konsole `{this.name} makes a Noise: ` geschriben wird.\
|
|||
|
Im nächsten Schritt wird mit `Debug.WriteLine("Mamal Noise")` Mamal Noise auf der gleichen Zeile ausgegeben und eine neue Zeile begonnen.
|
|||
|
|
|||
|
Die Ausgabe wird `{this.name} makes a Noise: Mamal Noise` sein.
|
|||
|
|
|||
|
Es sind 2 Wege zum gleichen Ziel.
|