52 votes

Pourquoi ne sommes-nous pas autorisés à spécifier un constructeur dans une interface ?

Duplicata possible :
Interface définissant la signature d'un constructeur ?

Je sais que vous ne pouvez pas spécifier un constructeur dans une interface en .Net, mais pourquoi ne le pouvons-nous pas ?

Il serait vraiment utile pour mon projet actuel de pouvoir spécifier qu'un "moteur" doit être passé avec le constructeur, mais comme je ne peux pas, je dois me contenter d'un commentaire XML sur la classe.

90voto

cletus Points 276888

Parce qu'une interface décrit un comportement. Les constructeurs ne sont pas des comportements. La façon dont un objet est construit est un détail d'implémentation.

28voto

Jon Skeet Points 692016

Comment appelleriez-vous le constructeur ? Lorsque vous utilisez des interfaces, vous passez normalement une instance de l'interface (ou plutôt, une référence). Gardez également à l'esprit que si une classe implémente une interface, une classe dérivée hérite de cette interface, mais peut ne pas avoir le même ensemble de constructeurs.

Maintenant, je peux voir l'utilité de ce que j'appelle interfaces statiques pour spécifier les constructeurs et autres membres essentiellement statiques à utiliser dans les méthodes génériques. Voir mon billet de blog sur l'idée pour plus d'informations.

9voto

Tony Points 1012

Non, vous ne pouvez pas avoir de constructeurs sur les interfaces pour les raisons qui ont été affichées. Cependant, vous pouvez avoir des classes abstraites. Disons par exemple que vous avez cette classe de base.

public abstract class ClassOne
{
    protected int _x;
    protected string _s;

    public ClassOne(int x, string s)
    {
        _x = x;
        _s = s;
    }        
}

Remarquez qu'il n'y a pas de constructeur qui ne prend aucun argument (constructeur par défaut) ce qui signifie que toute classe qui hérite de ClassOne doit appeler le constructeur qui a 2 arguments.

Ce n'est donc pas valide et ne compilera pas.

public class ClassTwo : ClassOne
{
    public ClassTwo() 
    { }
}

Cependant, ceci est valide et compilera.

public class ClassTwo : ClassOne
{
    public ClassTwo(int x, string s) : base(x, s)
    {  }
}

Je tiens à souligner ici qu'en C#, vous ne pouvez hériter que d'une seule classe de base. Cela signifie que ce n'est peut-être pas la bonne solution pour une situation particulière, mais c'est une chose à laquelle il faut penser.

Tony.

8voto

Turro Points 554

Parmi toutes les autres raisons déjà évoquées, gardez également à l'esprit qu'une classe peut facilement implémenter plusieurs interfaces ; quel constructeur doit-on alors utiliser ?

6voto

Wim Coenen Points 41940

D'autres réponses ont déjà indiqué pourquoi il n'est pas logique d'avoir une déclaration de constructeur sur une interface. Mais d'après votre question, je devine que vous recherchez probablement la déclaration de constructeur de l'interface modèle de fabrique abstraite .

Pour donner un exemple basé sur votre question : vous dites que vous voudriez déclarer d'une manière ou d'une autre qu'un "moteur" doit être passé au constructeur. Vous pouvez le faire en déclarant une interface séparée pour un service de construction comme ceci :

public interface IGadgetFactory
{
   IGadget CreateGadget(Engine engine);
}

Tout code qui doit créer IGadget peuvent alors utiliser une IGadgetFactory au lieu d'appeler directement les constructeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X