2010-03-31 4 views
8

J'ai une structure de classe commePourquoi le constructeur base() n'est-il pas nécessaire?

abstract class Animal { 
    public Animal(){ 
    //init stuff.. 
    } 
} 

class Cat : Animal { 
    public Cat(bool is_keyboard) : base() //NOTE here 
    { 
    //other init stuff 
    } 
} 

Maintenant, regardez la ligne noté. Si vous supprimez : base() alors il compilera sans erreur.

Pourquoi est-ce? Est-il possible de désactiver ce comportement?

Répondre

7

Il existe un : base() implicite si vous n'ajoutez rien d'autre (: base(...) ou : this(...)). Pour le forcer à être explicite, ajoutez un paramètre au (x) constructeur (s) de base. Alors ça ne peut pas être implicite.

Par exemple:

public Animal(string name) {...} 
+1

Cool, vous apprenez quelque chose tous les jours ... J'ai toujours mis explicitement la base(), probablement continuer à le faire parce que combien de développeurs se rendent compte là-bas est un appel implicite à cela? – slugster

+0

Aussi, j'ai trouvé l'article astucieux de Skeet qui m'a tout raconté: http://www.yoda.arachsys.com/csharp/constructors.html – Earlz

+0

@slugster, je ne m'en suis pas rendu compte ... alors oui. – Earlz

0

Pourquoi?

Cette article l'explique.

Est-il possible de désactiver ce comportement ?

Nope. Je suis désolé (mais ... Voir la réponse de la marque pour une solution de contournement:)

1

17.10.4 Default Constructors:

Si une classe contient aucune instance déclarations du constructeur, un défaut constructeur d'instance est automatiquement fourni. 2 Ce constructeur par défaut appelle simplement le constructeur sans paramètre de la classe de base directe. 3 Si la classe de base directe n'a pas de constructeur d'instance sans paramètre accessible, une erreur de compilation se produit. 4 Si la classe est abstraite, l'accessibilité déclarée pour le constructeur par défaut est protégée. 5 Dans le cas contraire, l'accessibilité déclarée pour le constructeur par défaut est public

+1

Bien que vrai, c'est la mauvaise section pour ce qui se passe quand ': base()' est supprimé. Cette section indique ce qui se passe si le constructeur entier est supprimé. –

Questions connexes