15 Stimmen

Abstrakte Klasse ohne abstrakte Methode

Ich bin überrascht zu wissen, dass eine abstrakte Klasse in C# auch ohne abstrakte Methoden möglich ist.

abstract class AbstractDemo
{
 public void show()
  {
    Console.WriteLine("In Show Method"); 
   }
}
class MainDemo:AbstractDemo
{
 public static void Main()
 {
    Console.WriteLine("In Main Method");
 }
}

Gibt es dafür eine Erklärung?

33voto

Itay Karo Punkte 17380

Manchmal möchte man nicht die Möglichkeit geben, eine Klasse zu instanziieren, sondern man benötigt diese Klasse als Basisklasse für andere Klassen.

Der Grund für die Wahl abstrakter Klassen anstelle von Schnittstellen ist, dass Sie einige grundlegende Implementierungen anbieten können.

15voto

Jon Skeet Punkte 1325502

Dies ist durchaus sinnvoll und gelegentlich auch nützlich, wenn Sie ein ereignisähnliches Verhalten bereitstellen wollen: Stellen Sie eine abstrakte Klasse bereit, in der alle "Ereignisbehandler" als virtuelle Methoden implementiert sind, die standardmäßig nichts tun.

Ich habe auch persönlich verwendet diese eine Menge für abstrakte Remote-API-Client-Klassen, wo alle Methoden Ausnahmen werfen: Sie sind abstrakt für die Zwecke der Test-Doppel, in der Erwartung, dass unsere Implementierungen die einzige sein Produktion Implementierungen, sondern ermöglicht es den Benutzern, ihre eigenen Testdoubles entweder von Hand oder über Mocking-Frameworks zu erstellen. Die Methoden virtuell statt abstrakt zu machen, bedeutet, dass neue RPCs hinzugefügt werden können, ohne dass dies eine einschneidende Änderung darstellt.

Eine abgeleitete Klasse kann dann überschreiben algunos der Methoden, muss aber keine bestimmte Methode außer Kraft setzen, da nichts abstrakt ist. Es ist immer noch sinnvoll, dass die Klasse abstrakt ist, weil eine Instanz der Basisklasse sinnlos wäre (da alles ein No-op wäre).

Dieses Muster ist jedoch in Java viel verbreiteter als in C#, da man in C# normalerweise nur "richtige" Ereignisse verwenden würde.

5voto

Sruly Punkte 9910

Eine abstrakte Klasse ist eine Klasse, die erweitert werden muss, bevor sie verwendet werden kann. Dies bedeutet keineswegs, dass die Funktion selbst abstrakt sein muss.

Nehmen Sie zum Beispiel eine Tierklasse

public abstract class Animal
{
    void Move()
    {
        //whatever
    }
}

public class Fish : Animal
{
    void Swim()
    {

    }
}

public class Dog : Animal
{
    void Bark()
    {

    }
}

Alle Tiere können sich bewegen, aber nur der Fisch kann schwimmen und der Hund kann bellen.

Oder um ein Beispiel aus dem wirklichen Leben zu nennen. Ich habe einen Asp.net MVC Base Controller, den ich in meiner Anwendung verwende. Er hat einige grundlegende Methoden, die ich sehr oft benötige, wie GetCurrentUser() und eine Funktion, die ich geschrieben habe, um bei der Lokalisierung zu helfen. Sie kümmert sich auch um das Tracking, so dass ich diesen Code nicht in allen meinen Controllern neu schreiben muss. Die Klasse hat etwa 200 Zeilen Code, aber nicht eine einzige abstrakte Methode.

3voto

reko_t Punkte 53684

Ich glaube, Sie verwechseln abstrakte Klassen mit Schnittstellen. Interfaces können keine Methoden mit Body haben, abstrakte Klassen schon. Es gibt Fälle, in denen man verhindern möchte, dass ein Benutzer ein Objekt einer bestimmten Klasse instanziiert, aber dennoch eine gewisse Basisfunktionalität für die von ihr abgeleiteten Klassen bereitstellen möchte; dafür ist eine abstrakte Klasse nützlich.

2voto

Łukasz W. Punkte 9289

Wenn Ihre Klasse nur eine Basis für andere Klassen ist und keine volle Verwendbarkeit hat - mit anderen Worten, als Basis selbst überhaupt nicht verwendbar ist - dann wollen Sie verhindern, dass Instanzen von ihr erstellt werden. In diesem Fall können Sie eine abstrakte Klasse ohne abstrakte Mitglieder erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X