2009-04-17 7 views

Antwort

62

Einfach deshalb, weil es in einer abstrakten Klasse keinen Sinn macht öffentlich zu sein. Eine abstrakte Klasse kann per Definition nicht direkt instanziiert werden. Es kann nur von einer Instanz eines abgeleiteten Typs instanziiert werden. Daher sind die einzigen Typen, die Zugriff auf einen Konstruktor haben sollten, seine abgeleiteten Typen, und daher sind geschützte Objekte viel sinnvoller als öffentliche. Es beschreibt genauer die Zugänglichkeit.

+8

Mit anderen Worten: Warum möchten Sie die IntelliSense anderer Menschen mit nutzlosem Müll verschmutzen? –

+3

@Andre-Konstruktoren werden nur in IntelliSense für neue und Basisaufrufe angezeigt. In der Regel werden abstrakte Klassen aus neuen Filtern herausgefiltert, bevor die Barrierefreiheit berücksichtigt wird, da die Überprüfung auf Abstrakt sehr einfach und kostengünstig ist. – JaredPar

+5

Also, sollte dies nicht der Compiler erzwingen, dass abstrakte Klassen ** ** öffentliche Konstruktoren nicht haben können? – Yuck

1

Es ist eine gute Übung.

public abstract class ExampleAbstractClass 
{ 
    protected ExampleAbstractClass() 
    { 
     // ::: 
    } 
} 

Sie möchten nur, dass die erbenden untergeordneten Klassen Zugriff auf den Konstruktor haben. Der einzige Weg, dies zu tun, besteht darin, den Konstruktor zu schützen.
Denken Sie daran, wenn Sie diesen Konstruktoren Parameter hinzufügen, ist dies eine völlig andere Diskussion.

+2

Was unterscheidet das beim Hinzufügen von Parametern? Der Konstruktor wird nur noch von abgeleiteten Klassen aufgerufen. –

+0

Erzwingt, dass alle Erbauerkonstruktoren den Parameter in ihrer Signatur haben, ob benötigt oder nicht. –

+1

@SrikarDoddi: Nein, tut es nicht. Die vererbten Konstruktoren müssen einfach ': base (...)' aufrufen und etwas übergeben, aber dieses Etwas kann auch Konstanten oder Werte sein, die von anderswo abgerufen werden. –

12

Es macht technisch keinen Unterschied, wenn Sie den Konstruktor public anstelle von protected für eine abstrakte Klasse erstellen. Die Erreichbarkeit/Sichtbarkeit des Konstruktors ist immer noch genau dieselbe: die gleiche Klasse oder die abgeleiteten Klassen. Die zwei Schlüsselwörter haben für alle Absichten und Zwecke nicht unterscheidbare Effekte.

Also, diese Wahl ist nur eine Frage des Stils: Geben Sie protected, um die Object Oriented versierte Menschen zu befriedigen.


Reflection wird standardmäßig enthalten nur den Konstruktor, wenn es public ist, aber Sie können diesen Konstruktor sowieso nicht nennen.

IntelliSense zeigt den public-Konstruktor bei der Eingabe von new, aber Sie können diesen Konstruktor trotzdem nicht aufrufen.

Die Metadaten der Assembly spiegeln die Tatsache wider, dass der Konstruktor öffentlich oder geschützt ist.

+0

Abgesehen davon, dass die Sichtbarkeit als "öffentlich" nicht wahrheitsgemäß ist. –

+1

Seine Antwort gibt die funktionalen Unterschiede zwischen den beiden, die genau das ist, was ich suchte. Ob es wahrheitsgemäß ist, spielt keine Rolle, und außerdem ist das ein Problem für die C# -Sprache, nicht Entwickler. – aaaaaa