To jest pytanie dotyczące składni. Mam klasę ogólną, która dziedziczy z ogólnej klasy bazowej i stosuje ograniczenie do jednego z parametrów typu. Chcę również, aby klasa pochodna implementowała interfejs. Za całe życie nie potrafię znaleźć właściwej składni.
Oto co mam:
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... }
Pierwszą rzeczą, która przyszła mi do głowy, było to:
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... }
Ale to jest niepoprawne, ponieważ powoduje, że T2 musi zaimplementować zarówno IBar, jak i IFoo, a nie DerivedFoo, aby zaimplementować IFoo.
Próbowałem trochę googlować, używać dwukropków, średników itp., Ale wyszedłem krótko. Jestem pewien, że odpowiedź jest banalnie prosta.
c#
generics
inheritance
interface
constraints
Dan Rigby
źródło
źródło
Odpowiedzi:
Przed zdefiniowaniem ogólnych ograniczeń dołączasz cały podpis swojej klasy.
źródło
where T2 : IBar, IFoo
oznacza po prostu, żeT2
zamiastDerivedFoo<T1,T2>
implementować , musi zaimplementować oba interfejsyIFoo
Moja rada: jeśli masz pytanie dotyczące składni języka C #, przeczytaj specyfikację; dlatego to publikujemy. Będziesz chciał przeczytać sekcję 10.1.
Aby odpowiedzieć na Twoje konkretne pytanie, kolejność rzeczy w deklaracji klasy jest następująca:
Wszystko na tej liście jest opcjonalne z wyjątkiem „klasy”, nazwy i treści, ale wszystko musi pojawić się w tej kolejności, jeśli się pojawi.
źródło
źródło
To jest rozszerzenie istniejących odpowiedzi. Wartość domyślna to,
string
jeśli nie podasz typu. Nie zaimplementowałem interfejsu, ale nie powinno to wymagać niczego innego niż zwykle.źródło