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

Duplication possible:
Interface définissant une signature de constructeur?

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

Il serait vraiment utile que mon projet actuel puisse spécifier qu’un “moteur” doit être passé avec le constructeur, mais comme je ne peux pas le faire, je dois me contenter d’un commentaire XML sur la classe.

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

Comment appelleriez-vous le constructeur? Lorsque vous utilisez des interfaces, vous transmettez 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’utilisation de ce que j’appelle des interfaces statiques pour spécifier des constructeurs et d’autres membres essentiellement statiques à utiliser dans les méthodes génériques. Voir mon blog sur l’idée pour plus d’informations.

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

public abstract class ClassOne { protected int _x; protected ssortingng _s; public ClassOne(int x, ssortingng s) { _x = x; _s = s; } } 

Notez qu’il n’y a pas de constructeur qui ne prenne 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.

Donc, ce n’est pas valide et ne comstackra pas.

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

Cependant, ceci est valide et comstackra.

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

Je voudrais souligner ici qu’en C # vous ne pouvez hériter que d’une classe de base. Ce qui signifie que ce n’est peut-être pas la solution correcte pour une situation particulière, mais il faut y penser.

Tony.

Parmi toutes les autres raisons déjà affichées, gardez à l’esprit qu’une classe peut facilement implémenter plusieurs interfaces; quel constructeur devrait être utilisé alors?

D’autres réponses ont déjà montré pourquoi cela n’a pas de sens d’avoir une déclaration de constructeur sur une interface. Mais d’après votre question, je suppose que vous recherchez probablement le modèle d’usine abstrait .

Pour donner un exemple basé sur votre question: vous dites que vous souhaitez en quelque sorte déclarer qu’un “moteur” doit être transmis au constructeur. Vous pouvez le faire en déclarant une interface distincte pour un service de construction comme celui-ci:

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

Tout code devant créer des instances IGadget peut alors utiliser une instance IGadgetFactory au lieu d’appeler directement des constructeurs.

Parce que vous ne pouvez pas instancier une interface, une construction prend tout son sens.

Outre les autres explications données ici, vous devrez inventer une nouvelle syntaxe pour les appeler de toute façon, car si vous avez deux ou plusieurs implémentations dans la ligne:

 Dim x as new IDoStuff() 

La mise en œuvre de ce nom est appelée?