2 Stimmen

Abstrakte Basisklasse und Sichtbarkeit des Konstruktors

Ich mache normalerweise eine Basisklasse abstract um das Signal zu geben Dies ist eine Basisklasse - Sie können mich nicht instanziieren! auch wenn sie keine abstrakten Methoden enthält.

Außerdem mache ich den Konstruktor der Basisklasse immer geschützt, obwohl es keine wirkliche funktionale Notwendigkeit dafür gibt - ich möchte nur noch einmal darauf hinweisen, dass Dies ist eine Basisklasse - Sie können mich nicht instanziieren!

Mache ich dabei einen Luftsprung? Was machen Sie?

9voto

Jon Skeet Punkte 1325502

Das scheint eine vernünftige Sache zu sein, ja. Es gibt keinen funktionalen Unterschied, ob der Konstruktor öffentlich oder geschützt ist, aber wenn er geschützt ist, gibt es einen klareren Hinweis auf den Verwendungszweck.

2voto

Dave Turvey Punkte 2711

Ich bin mir nicht sicher, ob Sie die Klasse als abstrakt einstufen sollten, wenn es keine abstrakten Methoden gibt. Wenn sie eine vollständige Implementierung der Funktionalität hat, die von den von ihr abgeleiteten Klassen erwartet wird, warum sollte sie dann nicht instanziiert und so verwendet werden können? Wenn dies nur ein Weg ist, um die Funktionalität über eine Reihe von Klassen zu teilen, dann ist ein kompositionsbasierter Entwurf vielleicht angemessener, d.h. jede "abgeleitete" Klasse muss auf diese Klasse verweisen, anstatt von ihr abzuleiten.

Haben Sie ein bestimmtes Szenario im Kopf, für das sich dieses Design eignen würde?

Editar
Das einzige Szenario, das ich gefunden habe, wo eine abstrakte Klasse ohne abstrakte Methoden Sinn macht, ist, wenn die abstrakte Klasse teilweise eine Schnittstelle implementiert. Die abgeleiteten Klassen sind erforderlich, um die Implementierung zu vervollständigen.

Link zum Beispiel (edit: Seite verschwunden, Dieser Blogbeitrag scheint eine Kopie des Inhalts zu sein)

1voto

SiN Punkte 3644

In einer abstrakten Klasse gibt es keinen Unterschied zwischen einem öffentlichen und einem geschützten Konstruktor. Ich bin sogar der Meinung, dass der Compiler eine Warnung oder einen Fehler ausgeben sollte, wenn der Konstruktor einer abstrakten Klasse als öffentlich definiert wird. Schade, dass er das nicht tut.

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