"모든 제네릭 유형"정의가있는 C # 제네릭 "where constraint"?


113

예를 들어 보겠습니다.

  1. 일반적인 클래스 / 인터페이스 정의가 있습니다.

    interface IGenericCar< T > {...}

  2. 위의 클래스와 연결하려는 다른 클래스 / 인터페이스가 있습니다. 예를 들면 다음과 같습니다.

    interface IGarrage< TCar > : where TCar: IGenericCar< (**any type here**) > {...}

기본적으로 내 일반 IGarrage가 또는 IGenericCar여부에 관계없이 해당 유형에 대한 종속성이 없기 때문에 에 종속되기를 원합니다 .IGenericCar<int>IGenericCar<System.Color>

답변:


142

이를 달성하는 데 일반적으로 두 가지 방법이 있습니다.

Option1 : 제약 조건에 전달되어야 하는를IGarrage 나타내는 다른 매개 변수를 추가 합니다.TIGenericCar<T>

interface IGarrage<TCar,TOther> where TCar : IGenericCar<TOther> { ... }

Option2 : IGenericCar<T>일반적이지 않은 기본 인터페이스를 정의하고 해당 인터페이스에 대해 제한

interface IGenericCar { ... }
interface IGenericCar<T> : IGenericCar { ... }
interface IGarrage<TCar> where TCar : IGenericCar { ... }

6
내 제네릭 형식을 사용해야 할 경우 좋아,하지만 난 어떻게해야 T내부에 IGarage<TCar>? 옵션 2에서 가능성이 보이지 않습니다. 가장 좋은 해결책은 IGarage<TCar>type T을 분석하여 유형 을 찾는 것입니다 TCar.
pt12lol

2
후손의 경우 원시 제네릭 유형의 유형 매개 변수를 갖지만 런타임시에만 리플렉션을 사용하는 유형이 생성 될 수 있으며 원시 제네릭 유형 매개 변수는 완전한 정의 없이는 자동으로 생성 될 수 없기 때문에 생성 된 클래스를 생성 할 수 없습니다. ITS 각 유형 매개 변수의. 가장 바깥 쪽 클래스의 초 제네릭 정적 멤버 (예 : IGarage<IGenericCar<?>>.TellMeAboutCarsInGeneral()디자인 불량의 결과 일 수 있음)를 제외하고 이것이 어디에서 유용 할 수 있는지는 알 수 없지만 땜질에서 수행했습니다. 가능합니다.
Michael Hoffmann

누구나 IGenericCar 인터페이스를 클래스에 추가하고 예상치 못한 클래스로 제한된 메서드를 중단 할 수 있다고 가정합니다.
N-먹고

2
@ pt12lol : IGarrage<TCar>실제로 기본 제네릭 유형을 처리하는 경우 (예 : 해당 유형의 속성을 처리) 유형을 알아야합니다.이 경우 유형을 지정해야합니다 (옵션 1 (그때 유일한 실행 가능한 옵션)). 그러나 IGarrage<TCar>에서 기본 제네릭 유형을 직접 처리하지 않는 경우 (모든 IGarrage<TCar>코드는이 기본 유형과 무관 함) 옵션 2가 유효합니다.
Flater

6

다음과 같은 일을하는 것이 합리적일까요?

interface IGenericCar< T > {...}
interface IGarrage< TCar, TCarType > 
    where TCar: IGenericCar< TCarType > {...}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.