This article has been localized into German by the community.
Abstrakte Klassen
Abstrakte Klassen, die in der Klassendefinition durch das Schlüsselwort "abstract" gekennzeichnet sind, werden normalerweise verwendet, um eine Basisklasse in der Hierarchie zu definieren. Das Besondere daran ist, dass Sie keine Instanz von ihnen erstellen können - wenn Sie es versuchen, erhalten Sie einen Kompilierungsfehler. Stattdessen müssen Sie sie untergliedern, wie im Kapitel über die Vererbung beschrieben, und eine Instanz Ihrer Unterklasse erstellen. Wann brauchen Sie eine abstrakte Klasse? Es hängt wirklich davon ab, was Sie tun.
Um ehrlich zu sein, Sie können einen langen Weg gehen, ohne eine abstrakte Klasse zu benötigen, aber sie sind großartig für bestimmte Dinge, wie Frameworks, weshalb Sie ziemlich viele abstrakte Klassen innerhalb des .NET-Frameworks selbst finden. Eine gute Faustregel ist, dass der Name tatsächlich einen guten Sinn ergibt - abstrakte Klassen werden sehr oft, wenn nicht immer, verwendet, um etwas Abstraktes zu beschreiben, etwas, das eher ein Konzept als eine reale Sache ist.
In diesem Beispiel erstellen wir eine Basisklasse für vierbeinige Tiere und erstellen dann eine Dog-Klasse, die wie folgt davon erbt:
namespace AbstractClasses
{
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
Console.WriteLine(dog.Describe());
Console.ReadKey();
}
}
abstract class FourLeggedAnimal
{
public virtual string Describe()
{
return "Not much is known about this four legged animal!";
}
}
class Dog : FourLeggedAnimal
{
}
}
Wenn Sie es mit den Beispielen im Kapitel über die Vererbung vergleichen, werden Sie keinen großen Unterschied sehen. Tatsächlich ist das Schlüsselwort "abstract" vor der FourLeggedAnimal-Definition der größte Unterschied. Wie Sie sehen, erstellen wir eine neue Instanz der Dog-Klasse und rufen dann die geerbte "Describe()" -Methode von der FourLeggedAnimal-Klasse auf. Versuchen Sie nun, stattdessen eine Instanz der FourLeggedAnimal-Klasse zu erstellen:
FourLeggedAnimal someAnimal = new FourLeggedAnimal();
Sie werden diesen netten Compilier-Fehler erhalten.
Es kann keine Instanz der abstrakten Klasse oder Schnittstelle 'AbstractClasses.FourLeggedAnimal' erstellt werden
Wie Sie sehen, haben wir gerade die "Describe()" -Methode geerbt, aber sie ist in ihrer aktuellen Form für unsere Hundeklasse nicht sehr nützlich. Lass es uns überschreiben:
class Dog : FourLeggedAnimal
{
public override string Describe()
{
return "This four legged animal is a Dog!";
}
}
In diesem Fall führen wir eine vollständige Außerkraftsetzung aus. In einigen Fällen möchten Sie jedoch möglicherweise das Verhalten der Basisklasse zusätzlich zu neuen Funktionen verwenden. Dies kann mit dem Basisschlüsselwort erfolgen, das sich auf die Klasse bezieht, von der wir erben:
abstract class FourLeggedAnimal
{
public virtual string Describe()
{
return "This animal has four legs.";
}
}
class Dog : FourLeggedAnimal
{
public override string Describe()
{
string result = base.Describe();
result += " In fact, it's a dog!";
return result;
}
}
Jetzt können Sie natürlich weitere Unterklassen der FourLeggedAnimal-Klasse erstellen - vielleicht eine Katze oder ein Löwe? Im nächsten Kapitel werden wir ein fortgeschritteneres Beispiel machen und auch abstrakte Methoden einführen. Einfach weiter lesen.