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