Наследовать от базового базового класса, применить ограничение и реализовать интерфейс в С#

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

Это то, что у меня есть:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... }

Первое, что пришло в голову, было следующее:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... }

Но это неверно, поскольку это приводит к тому, что T2 необходимо реализовать как IBar, так и IFoo, а не DerivedFoo для реализации IFoo.

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

Ответ 1

Перед определением общих ограничений вы включаете всю подпись своего класса.

class DerivedFoo<T1, T2> : ParentFoo<T1, T2>, IFoo where T2 : IBar
{
    ...
}

Ответ 2

Моя рекомендация: когда у вас возник вопрос о синтаксисе языка С#, прочитайте спецификацию; почему мы его публикуем. Вы хотите прочитать раздел 10.1.

Чтобы ответить на ваш конкретный вопрос, порядок вещей в объявлении класса:

  • в квадратных скобках
  • ( "public", "static" и т.д.)
  • "частичный"
  • "класс"
  • имя класса
  • разделенный запятыми список объявлений параметров типа внутри угловых скобок
  • двоеточие следует за разделенным запятыми списком базовых типов (базовый класс и реализованные интерфейсы, базовый класс должен идти первым, если он есть)
  • ограничения параметров типа
  • тело класса, окруженное фигурными скобками
  • точка с запятой

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

Ответ 3

public interface IFoo {}
public interface IBar {}

public class ParentFoo<T,T1> { }
public class DerivedFoo<T, T1> : ParentFoo<T, T1>, IFoo where T1 : IBar { }