• Наследовать от универсального базового класса, применяются ограничения, и реализации интерфейса в C#

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

    Вот что у меня:

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

    Первое, что пришло на ум, была такова:

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

    Но это неверно, потому что это заставляет Т2 нужно реализовать оба Ибар и IFoo, не DerivedFoo реализовать IFoo.

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

  • Ответы

  • Вы включите всю объявлении класса перед вы определить общие ограничения.

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

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

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

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

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

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