Это вопрос синтаксиса. У меня есть общий класс, который наследуется от универсального базового класса и применяет ограничение к одному из параметров типа. Я также хочу, чтобы производный класс реализовал интерфейс. Да хоть убей, я не могу понять правильный синтаксис.
Вот что у меня есть:
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... }
Первое, что пришло в голову:
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... }
Но это неверно, так как это приводит к тому, что T2 необходимо реализовать как IBar, так и IFoo, а не DerivedFoo для реализации IFoo.
Я пробовал немного погуглить, использовать двоеточия, точки с запятой и т. Д., Но у меня не получилось. Я уверен, что ответ невероятно прост.
c#
generics
inheritance
interface
constraints
Дэн Ригби
источник
источник
Ответы:
Вы включаете всю подпись своего класса, прежде чем определять общие ограничения.
источник
where T2 : IBar, IFoo
просто означает, чтоT2
необходимо реализовать оба интерфейса вместоDerivedFoo<T1,T2>
реализацииIFoo
Моя рекомендация: если у вас есть вопрос о синтаксисе языка C #, прочтите спецификацию; поэтому мы его публикуем. Вы захотите прочитать раздел 10.1.
Чтобы ответить на ваш конкретный вопрос, порядок вещей в объявлении класса:
Все в этом списке необязательно, кроме «класса», имени и тела, но все должно появиться в этом порядке, если оно появляется.
источник
источник
Это расширение существующих ответов. По умолчанию используется значение,
string
если вы не указываете тип. Я не реализовал интерфейс, но для этого не должно требоваться ничего, кроме обычного.источник