2010-04-30 22 views
14

Y a-t-il une pertinence d'un constructeur 'public' dans une classe abstraite? Je ne peux pas penser à une façon possible de l'utiliser, dans ce cas, ne devrait-il pas être traité comme une erreur par le compilateur (C#, pas sûr si d'autres langages le permettent).Pertinence du constructeur 'public' dans la classe abstraite

Exemple de code:

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

Le compilateur C# permet le code de compiler, alors qu'il n'y a aucun moyen que je peux appeler ce contructor du monde extérieur. Il peut être appelé à partir de classes dérivées uniquement. Il ne devrait donc pas permettre les modificateurs 'protected' et 'private' seulement. Veuillez commenter.

+0

duplication possible de http://stackoverflow.com/questions/260744/abstract-class-constructor-access-modifier –

+0

@JohnSaunders Oui, un doublon, bien que cette question concerne java. Mais il n'y a absolument aucune différence entre jav et C# à cet égard (je pense). –

Répondre

5

Il n'y a pas de raison pour un constructeur public pour une classe abstraite. Je suppose que la raison pour laquelle le compilateur ne se plaint pas est aussi simple qu'ils n'ont pas passé de temps à la couvrir puisque cela n'a pas vraiment d'importance s'il est public ou protégé.

1

Oui, un public ctor sur une classe abstraite n'a pas de sens et est un peu trompeur car il se comporte comme protégé en ce sens que seules les classes dérivées peuvent l'appeler.

Un private ctor aura peu de signification en dehors des cas intéressants de bord.

Un protected ctor aurait un sens si requis par les classes dérivées.

+1

Un constructeur 'private' a du sens dans une classe abstraite. – dan04

+0

@ dan- heureux? ;-) –

+0

@ dan04: Cela a-t-il du sens dans n'importe quelle situation autre que lorsque vous êtes enchainé à partir d'un autre constructeur? – supercat

1

Dupe: il y a une autre question sur le SO comme ceci: Abstract class constructor access modifier

Les réponses sur cette question se résument à la même chose à la fin: il ne compte pas vraiment si vous déclarez protected ou public.

Il semble également y avoir une certaine discussion à ce sujet dans la littérature (par exemple dans Framework Design Guidelines). Ceci est référencé dans ce blogpost: Good design or bad design of abstract class?

+0

Cette question concerne C#, et l'autre concerne Java. Par conséquent, ce n'est pas un doublon. – hypehuman

3

intérieur d'une classe abstraite, pour un constructeur d'instance, les modificateurs public, protected internal et protected sont tous équivalents. Puis internal est plus strict que eux, et private est l'accès le plus strict.

Si tous les constructeurs d'instance sont private, seules les classes imbriquées dans la classe en question peuvent en hériter.

Remarque: Si aucun constructeur d'instance n'est donné pour une classe non statique, le compilateur en générera un seul. C'est un constructeur qui prend zéro argument. Si la classe est abstraite, le constructeur généré automatiquement est protected. Sinon, il s'agit de public. La seule situation à laquelle je peux penser lorsqu'il s'agit d'un constructeur d'instance d'une classe abstraite est public ou protected, lorsque vous utilisez la réflexion. À titre d'exemple, en disant

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

donnera un tableau vide si le constructeur est seul protected, et un tableau de taille-1 si elle est public. Mais bien sûr, il y a des surcharges qui spécifient BindingFlags, donc ce n'est pas un problème, juste quelque chose à retenir si l'on utilise la réflexion.