2016-10-25 5 views
1

Представьте, что всякий раз, когда вы создали общий класс MyClass<T>, автоматически генерируется интерфейс MyClass<>, который имеет все методы и свойства , которые не используют общие параметры или возвращаемые значения.Будет ли какой-либо фундаментальный недостаток в переменном типе, который может содержать общие классы произвольных типов T?

Это избавит меня от такой большой работы по созданию одноразовых интерфейсов, чтобы иметь возможность обрабатывать общие объекты разных типов T. Существует ли фундаментальная проблема с идеей, которая является причиной того, что она не является частью языка, или просто случай «это не было приоритетом или считается важным»?

Когда я говорю «интерфейс», я не имею в виду, что это обязательно будет классифицироваться и называется «интерфейсом». Это был простой способ объяснить, что я имею в виду. Еще одним способом думать об этом может быть абстрактный абстрактный базовый класс. Если бы эта функция существовала, вы бы не думали об этом как о генерируемых интерфейсах, а именно о том, что, например, переменная типа List<> может, конечно, провести любой общий список, например List<int> или List<MyElement>, и тогда вы можете называть его вещами, как Count, Clear(), Capacity и т. д., потому что им не нужны знания типа T.

Просто, чтобы понять, почему это не обсуждение нить, но вопрос с четким ответом:

Мой вопрос, есть ли недостаток в самой идее, что делает его несовместимым с типом-безопасности или аналогично, или нет фундаментальных недостатков в нем.

Пример использования:

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

Для простых случаев общий класс базового класса с общим классом является общим подходом. Однако, если MyClass<T> уже унаследовано от MyBaseClass<T>, то размещение не общего класса между ними невозможно, и только интерфейс может быть использован.

+4

Я читал ваш вопрос три раза, и я до сих пор абсолютно не знаю, о чем вы спрашиваете. –

+0

Согласен, что вы спрашиваете? –

+0

Я спрашиваю, может ли такая функция концептуально правдоподобна для добавления в C#, или если есть фундаментальные недостатки в идее, что означает, что такая функция языка никогда не будет добавлена ​​в C#. – runevision

ответ

2

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

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

Но если вы построили такой язык на .Net, вы, вероятно, не могли бы назвать его MyClass<>, потому что он уже используется для представления открытого общего типа (что делает typeof(MyClass<>) допустимым выражением).

+0

Я предполагаю, что вопрос о естественном вопросе «почему мы не можем объявить переменную открытого типа?» – Superpig

+0

@Superpig Поскольку объект не может быть назначен такой переменной. Если вы спрашиваете: «Почему объекту с некоторым закрытым родовым типом не присваивается переменная, тип которой соответствует соответствующему открытому родовому типу?», То я думаю, что это довольно нетривиальная функция с сомнительной полезностью. – svick

+0

@svick Это особенность, которую я имел в виду. Поскольку открытые общие типы в настоящее время не используются в языке для целей типа переменной, он не должен конфликтовать и, на мой взгляд, будет интуитивно понятным, если закрытый обобщенный объект может быть назначен переменной открытого типа общего типа. Открытый общий тип менее ограничительный, чем объект, так же как интерфейс менее ограничительный. Когда я впервые узнал о открытых родовых типах, я предположил, что вы можете сделать именно это. – runevision