In C# kannst du eine Klassen-Hierarchie mithilfe von Vererbung definieren. Eine abgeleitete Klasse (Car) erbt dabei das Verhalten und die Daten ihrer Elternklasse (Vehicle). Wenn keine Elternklasse angegeben ist, erbt die Klasse von der object-Klasse.
Elternklassen können abgeleiteten Klassen auf drei Arten Funktionalität bereitstellen:
virtual-Methode. Sie ist wie eine normale Methode, aber abgeleitete Klassen können sie ändern.abstract-Methode. Das ist eine Methode ohne Implementierung, die abgeleitete Klassen implementieren müssen. Eine Klasse mit abstract-Methoden muss ebenfalls als abstract gekennzeichnet sein. Abstrakte Klassen kannst du nicht instanziieren.Mit dem Zugriffsmodifikator protected kannst du in einer abgeleiteten Klasse auf ein Mitglied der Elternklasse zugreifen. Von anderen Klassen aus ist dieser Zugriff aber blockiert.
Abgeleitete Klassen können über das Schlüsselwort base auf Mitglieder der Elternklasse zugreifen.
// Inherits from the 'object' class
abstract class Vehicle
{
// Can be overridden
public virtual void Drive()
{
}
// Must be overridden
protected abstract int Speed();
}
class Car : Vehicle
{
public override void Drive()
{
// Override virtual method
// Call parent implementation
base.Drive();
}
protected override int Speed()
{
// Implement abstract method
}
}
Der Konstruktor einer abgeleiteten Klasse ruft automatisch den Konstruktor ihrer Elternklasse auf, bevor er die eigene Logik ausführt. Mit dem Schlüsselwort base kannst du Argumente an den Konstruktor der Elternklasse übergeben:
abstract class Vehicle
{
protected Vehicle(int wheels)
{
Console.WriteLine("Called first");
}
}
class Car : Vehicle
{
public Car() : base(4)
{
Console.WriteLine("Called second");
}
}
Wenn mehr als eine Klasse von einer Basisklasse abgeleitet ist, implementieren diese zwei (oder mehr) Klassen oft unterschiedliche Versionen einer Methode der Basisklasse. Das ist ein sehr wichtiges Prinzip, das man Polymorphismus nennt. An einer Variation des obigen Beispiels zeigen wir, wie Code, der Vehicle verwendet, sein Verhalten ändern kann, je nachdem, welcher Fahrzeugtyp instanziiert wurde.
abstract class Vehicle
{
public abstract string GetDescription();
}
class Car : Vehicle
{
public Car()
{
}
public override string GetDescription()
{
return "Runabout";
}
}
class Rig : Vehicle
{
public Rig()
{
}
public override string GetDescription()
{
return "Big Rig";
}
}
Vehicle v1 = new Car();
Vehicle v2 = new Rig();
v1.GetDescription();
// => Runabout
v2.GetDescription();
// => Big Rig
In dieser Übung spielst du ein Rollenspiel namens „Wizard and Warriors“, in dem du entweder als Wizard oder als Warrior spielst.
Für Warriors und Wizards gelten unterschiedliche Regeln, die bestimmen, wie viele Schadenspunkte sie verursachen.
Für einen Warrior gelten diese Regeln:
Für einen Wizard gelten diese Regeln:
Normalerweise sind Figuren nie verwundbar. Allerdings sind Wizards verwundbar, wenn sie keinen Zauberspruch vorbereitet haben.
Du hast sechs Aufgaben, die mit Warrior- und Wizard-Figuren arbeiten.
Überschreibe die Methode ToString() der Klasse Character, sodass sie eine Beschreibung der Figur zurückgibt, formatiert als "Character is a <CHARACTER_TYPE>".
var warrior = new Warrior();
warrior.ToString();
// => "Character is a Warrior"
Stelle sicher, dass die Methode Character.Vulnerable() immer false zurückgibt.
var warrior = new Warrior();
warrior.Vulnerable();
// => false
Implementiere die Methode Wizard.PrepareSpell(), damit ein Wizard im Voraus einen Zauberspruch vorbereiten kann.
var wizard = new Wizard();
wizard.PrepareSpell();
Stelle sicher, dass die Methode Vulnerable() true zurückgibt, wenn der Wizard keinen Zauberspruch vorbereitet hat, und andernfalls false.
var wizard = new Wizard();
wizard.Vulnerable();
// => true
Implementiere die Methode Wizard.DamagePoints(), sodass sie die verursachten Schadenspunkte zurückgibt: 12 Schadenspunkte, wenn ein Zauberspruch vorbereitet wurde, 3 Schadenspunkte, wenn nicht.
var wizard = new Wizard();
var warrior = new Warrior();
wizard.PrepareSpell();
wizard.DamagePoints(warrior);
// => 12
Implementiere die Methode Warrior.DamagePoints(), sodass sie die verursachten Schadenspunkte zurückgibt: 10 Schadenspunkte, wenn das Ziel verwundbar ist, 6 Schadenspunkte, wenn nicht.
var warrior = new Warrior();
var wizard = new Wizard();
warrior.DamagePoints(wizard);
// => 10
Melde dich bei Exercism an, um C# mit 62 Konzepte178 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.