2009-11-05 4 views
25

Wenn ein öffentlicher Konstruktor in einer abstrakten Klasse nur von seinen abgeleiteten Klassen aufgerufen werden kann, sollte er funktionell einem geschützten Konstruktor entsprechen. Recht?Was ist der Nutzen öffentlicher Konstruktoren in abstrakten Klassen in C#?

Besteht ein Unterschied darin, einen öffentlichen Konstruktor statt eines geschützten Konstruktors in einer abstrakten Klasse zu deklarieren? Wofür würden Sie es verwenden? Warum reklamiert der Compiler nicht?

Danke

Antwort

21

Absolut korrekt. Sie sollten den geschützten Konstruktor bevorzugen.

EDIT: nein der Compiler nicht beschweren, aber Tools wie FxCop (& Code Analysis) tun. Ich glaube, es gibt einige seltsame Reflektionstricks, die man mit öffentlichen Konstruktoren für abstrakte Klassen machen kann, aber von einem Standpunkt aus, wo man anderen Entwicklern, die Subklassen schreiben, nur die Basisklassenfunktionalität bietet, bleibe bei dem geschützten Konstruktor.

+0

vereinbart. Dies ist detaillierter: http://stackoverflow.com/questions/2700256/why-cant-create-object-of-an-abstract-class –

2

Ja, Sie haben Recht, praktisch öffentlichen Konstruktor hat keinen Nutzen in der Abscract-Klasse, wie Sie sie nicht erstellen können.

Compiler wird sich jedoch nicht beschweren, weil es so viele nutzlose Dinge gibt, die Sie im Kontext von C# schreiben können, aber es wird nicht in der Lage sein, seine logische Bedeutung zu überprüfen, es kann nur die Parserregeln überprüfen, für die es eingestellt ist .

Und sicher C# Schöpfer haben sich darauf konzentriert, Kompilierungsgrammatik (Regeln) zu erstellen, die tatsächlich schädlich sind und den Sprachgebrauch verletzen.

4

Sie haben Recht. Ein öffentlicher Konstruktor in einer abstrakten Klasse entspricht funktionell einem geschützten Konstruktor.

Ich bevorzuge in diesem Fall einen geschützten Konstruktor.

Es stimmt zwar, dass der Compiler sich nicht darüber beschwert, dass Sie dies tun, aber der Compiler wird sich beschweren, dass er versucht, eine Instanz der abstrakten Klasse zu generieren. Visual Studio ist auch schlau genug, Intellisense nicht zur Verfügung zu stellen, wenn Sie versuchen, die abstrakte Klasse zu instanziieren.

+0

Es gibt einige Randfälle mit Reflektion, die durch abstrakte Konstruktoren vereinfacht werden können öffentlich ... aber sie sind außergewöhnlich selten. Ich stimme generell zu, dass Konstruktoren in abstrakten Klassen geschützt werden sollten (oder privat, wenn sie von anderen Überladungen des Konstruktors aufgerufen werden). – LBushkin

Verwandte Themen