Подтвердить что ты не робот

Что означает "новое" ключевое слово при использовании внутри интерфейса в С#?

Разработав общий интерфейс, я хотел объявить конструктор в интерфейсе, но он говорит, что там запрещены конструкторы. Затем я попытался объявить статический метод factory, но он говорит, что ни один из статических методов не разрешен и предполагает использование ключевого слова 'new'. Но я понятия не имею, что может означать "новое" ключевое слово, когда оно используется внутри интерфейса в С#. У вас есть?

UPDATE:

Я не размещал какой-либо пример кода, потому что не хотел смешивать 2 вопроса - как указать конструктор / factory в интерфейсе И что означает "новое" ключевое слово в интерфейсах. Я даже был вынужден указать первую часть, потому что StackOverflow не принял второй вопрос в чистой форме, заявив, что он не соответствует стандартам качества.

Но, как вы требуете, я попробую, что я пытаюсь добиться:

Interface IMyInterface <T, U, V>
{
    IMyInterface (T, U, U);
    // OR
    static IMyInterface GetNewIMyInterface (T, U, U);
}

Я просто хочу, чтобы каждый производный класс реализовал такой конструктор.

4b9b3361

Ответ 1

Ключевое слово new сообщает компилятору, что ваше определение скрывает определение, содержащееся в интерфейсах, которые может расширять ваш интерфейс.

Ответ 2

Ответ Bala правильный, но может быть полезно узнать, почему вы хотите это сделать. Рассмотрим проблему, с которой сталкивались дизайнеры BCL при разработке библиотек для версии CLR версии 2. Был существующий интерфейс:

interface IEnumerable
{
  IEnumerator GetEnumerator();
}

Теперь вы хотите добавить:

interface IEnumerable<T> : IEnumerable
{
  new IEnumerator<T> GetEnumerator();
}

Новый интерфейс отличается от старого только в возвращаемом типе.

Каковы ваши варианты?

1) Отметьте новый GetEnumerator как "новый", чтобы компилятор знал, что это новый метод, который не конфликтует со старым методом с тем же именем, но с другим возвращаемым типом.

2) Измените имя на GetEnumerator2.

3) Не наследуйте от исходного IEnumerable.

Варианты 2 и 3 ужасны. Вариант 1 является удивительным: новые перечисляемые данные работают с кодом, ожидающим старые перечисления, но код, написанный для использования новых счетчиков, получает по умолчанию "новое" общее поведение.

Ответ 3

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

void Foo<T>() where T : new()
{
    T t = new T();
    // Do stuff with t
}

Это то, о чем вы думаете?

Ответ 4

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

http://msdn.microsoft.com/en-us/library/87d83y5b(v=vs.80).aspx

Ответ 5

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

Ответ 6

С# и .NET не позволяют объявлять конструктор на интерфейсе.

Это просто должно быть заявлено ограничение реализации этого интерфейса (см. ISerializable в библиотеках .NET).

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