2010-04-30 19 views
14

Gibt es eine Relevanz eines 'öffentlichen' Konstruktors in einer abstrakten Klasse? Ich kann mir keine Möglichkeit vorstellen, es zu benutzen, in diesem Fall sollte es nicht als Fehler vom Compiler behandelt werden (C#, nicht sicher, ob andere Sprachen dies zulassen).Relevanz des 'öffentlichen' Konstruktors in der abstrakten Klasse

Beispielcode:

internal abstract class Vehicle 
{ 
    public Vehicle() 
    {    
    } 
} 

Der C# Compiler ermöglicht es diesen Code zu kompilieren, während es keine Möglichkeit gibt, ich dieses contructor von der Außenwelt nennen kann. Es kann nur aus abgeleiteten Klassen aufgerufen werden. Also sollte es nicht nur "geschützte" und "private" Modifikatoren zulassen. Bitte kommentieren.

+0

möglich Duplikat von http://StackOverflow.com/Questions/260744/Abstract-Class-Constructor-Access-Modifier –

+0

@JohnSaunders Ja, ein Duplikat, obwohl diese Frage über Java ist. Aber in dieser Hinsicht gibt es absolut keinen Unterschied zwischen JAV und C# (glaube ich). –

Antwort

5

Es gibt keinen Grund für einen öffentlichen Konstruktor für eine abstrakte Klasse. Ich nehme an, dass der Grund, warum der Compiler sich nicht beschwert, so einfach ist, dass sie einfach keine Zeit damit verbracht haben, das zu bedecken, da es eigentlich egal ist, ob es öffentlich oder geschützt ist.

1

Ja, ein public ctor auf einer abstrakten Klasse ist bedeutungslos und ein bisschen irreführend, da es sich so verhalten wird, dass nur abgeleitete Klassen es aufrufen können.

Ein private ctor wird wenig Bedeutung haben außerhalb von interessanten Rand Fällen.

Ein protected ctor wäre sinnvoll, wenn dies von abgeleiteten Klassen gefordert wird.

+1

Ein 'privater' Konstruktor macht in einer abstrakten Klasse Sinn. – dan04

+0

@ dan- glücklich? ;-) –

+0

@ dan04: Macht es in irgendeiner Situation Sinn, außer wenn es von einem anderen Konstruktor verkettet wird? – supercat

1

Dupe: Es ist eine andere Frage auf SO wie folgt aus: Abstract class constructor access modifier

Die Antworten auf diese Frage auf die gleiche Sache am Ende kommen: es ist nicht wirklich wichtig, wenn Sie es protected oder public erklären.

Auch scheint es einige Diskussionen darüber in der Literatur zu geben (z.B. in Framework Design Guidelines). Dies ist in diesem Blogpost verwiesen: Good design or bad design of abstract class?

+0

Diese Frage bezieht sich auf C# und die andere bezieht sich auf Java. Daher ist dies kein Duplikat. – hypehuman

3

Innerhalb einer abstrakten Klasse, für eine Instanzkonstruktors, Modifikatoren public, protected internal und protected alle gleichwertig sind. Dann ist internal strenger als sie, und private ist der strengste Zugang.

Wenn alle Instanzkonstruktoren private sind, können nur innerhalb der betreffenden Klasse verschachtelte Klassen davon erben.

Hinweis: Wenn für eine nicht statische Klasse keine Instanzkonstruktoren angegeben sind, generiert der Compiler eine Instanz. Das ist ein Konstruktor, der keine Argumente annimmt. Wenn die Klasse abstrakt ist, lautet der automatisch generierte Konstruktor protected. Ansonsten ist es public.

Die einzige Situation, die ich mir vorstellen kann, wo es einen Unterschied macht, wenn ein Instanzkonstruktor einer abstrakten Klasse ist public oder protected, ist, wenn Sie Reflexion verwenden. Als Beispiel

ConstructorInfo[] ctors = typeof(Vehicle).GetConstructors(); 

ein leeres Array geben sagen, wenn der einzige Konstruktor protected ist und eine Länge-1-Array, wenn es public. Aber natürlich gibt es Überladungen, die BindingFlags angeben, also ist dies kein Problem, nur etwas zu erinnern, wenn man Reflexion verwendet.

Verwandte Themen