Почему нам не разрешено указывать конструктор в интерфейсе? [дубликат]
Возможные Дубликаты:
интерфейс, определяющий подпись конструктора?
Я знаю, что вы не можете указать конструктор в интерфейсе в .Net, но почему мы не можем?
было бы очень полезно для моего текущего проекта, чтобы иметь возможность указать, что "движок" должен быть передан с конструктором, но поскольку я не могу, мне нужно достаточно с комментарием XML к классу.
7 ответов:
потому что интерфейс описывает поведение. Конструкторы-это не поведение. Способ построения объекта-это деталь реализации.
Как бы вы назвали конструктором? Когда вы используете интерфейсы, вы обычно передаете экземпляр интерфейса вокруг (или, скорее, ссылку). Также имейте в виду, что если один класс реализует интерфейс, производный класс наследует этот интерфейс, но не может иметь тот же набор конструкторов.
теперь я вижу использование того, что я называю статические интерфейсы для указания конструкторов и других по существу статических элементов для использования в универсальных методах. Смотрите мой сообщение в блоге По идее для получения дополнительной информации.
нет, вы не можете иметь конструкторы на интерфейсы по причинам, которые были размещены. Однако вы можете на абстрактных классах. Допустим, например, у вас есть этот базовый класс.
public abstract class ClassOne { protected int _x; protected string _s; public ClassOne(int x, string s) { _x = x; _s = s; } }
обратите внимание, что нет конструкторов, которые не принимают аргумент (конструктор по умолчанию), что означает, что любой класс, наследующий от ClassOne, должен вызывать конструктор, который имеет 2 аргумента.
Так что это не является допустимым и не будет компилироваться.
public class ClassTwo : ClassOne { public ClassTwo() { } }
однако это действительно и будет компилировать.
public class ClassTwo : ClassOne { public ClassTwo(int x, string s) : base(x, s) { } }
Я хотел бы отметить, что в C# вы можете наследовать только от одного базового класса. Это означает, что это может быть не правильное решение для конкретной ситуации, но есть о чем подумать.
Тони.
среди всех других причин, уже опубликованных, имейте также в виду, что класс a может легко реализовать несколько интерфейсов; какой конструктор следует использовать тогда?
другие ответы уже указали, почему не имеет смысла иметь объявление конструктора на интерфейсе. Но из вашего вопроса, я предполагаю, что вы, вероятно, ищет абстрактный узор завод.
чтобы привести пример, основанный на вашем вопросе: вы говорите, что хотите каким-то образом объявить, что "движок" должен быть передан конструктору. Вы можете сделать это, объявив отдельный интерфейс для строительной службы, такой как это:
public interface IGadgetFactory { IGadget CreateGadget(Engine engine); }
любой код, который должен создать
IGadget
экземпляры могут использоватьIGadgetFactory
экземпляр вместо вызова каких-либо конструкторов напрямую.