Почему нам не разрешено указывать конструктор в интерфейсе?

Возможный дубликат:
Интерфейс, определяющий подпись конструктора?

Я знаю, что вы не можете указать конструктор в интерфейсе в .Net, но почему мы не можем?

Было бы очень полезно, чтобы мой текущий проект мог указать, что "конструктор" должен быть передан вместе с конструктором, но, как я наклоняю, мне нужно получить комментарий XML к классу.

Ответ 1

Поскольку интерфейс описывает поведение. Конструкторы - это не поведение. Как объект построен - это деталь реализации.

Ответ 2

Как вы могли бы назвать конструктор? Когда вы используете интерфейсы, вы обычно передаете экземпляр интерфейса (или, скорее, ссылку). Также имейте в виду, что если один класс реализует интерфейс, производный класс наследует этот интерфейс, но может не иметь того же набора конструкторов.

Теперь я вижу, как я называю статические интерфейсы для указания конструкторов и других, по существу, статических элементов для использования в общих методах. Для получения дополнительной информации см. мое сообщение в блоге.

Ответ 3

Нет, у вас нет конструкторов на интерфейсах по причинам, которые были опубликованы. Однако вы можете на абстрактных классах. Скажем, например, у вас есть этот базовый класс.

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)
    {  }
}

Я хотел бы отметить здесь, что в С# вы можете наследовать только один базовый класс. Это означает, что это не может быть правильным решением для конкретной ситуации, но об этом можно подумать.

Тони.

Ответ 4

Среди всех других причин, которые уже были отправлены, помните, что класс может легко реализовать несколько интерфейсов; какой конструктор следует использовать тогда?

Ответ 5

В других ответах уже указано, почему нет смысла иметь объявление конструктора на интерфейсе. Но из вашего вопроса, я предполагаю, что вы, вероятно, ищете абстрактный шаблон factory.

Чтобы привести пример на основе вашего вопроса: вы говорите, что хотите как-то объявить, что "конструктор" должен быть передан конструктору. Вы можете сделать это, объявив отдельный интерфейс для службы строительства следующим образом:

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

Любой код, который должен создавать экземпляры IGadget, может затем использовать экземпляр IGadgetFactory вместо прямого вызова каких-либо конструкторов.

Ответ 6

Потому что вы не можете создать интерфейс, поэтому конструктор doenst имеет смысл.

Ответ 7

Помимо других объяснений, приведенных здесь, вам придется изобретать новый синтаксис для их вызова в любом случае, поскольку, если у вас есть две или более реализаций в области видимости в строке:

Dim x as new IDoStuff()

Вызывается whice-реализация?