2013-10-31 2 views
0

이의 내가 내가 정상에게처럼 내가 홀더 < T>를 사용할 수 있도록 홀더 <가 T>, T를 확장해야 할 그런 다음이 클래스당신은

public Holder<T> : IHolder 
{ 
    private mystring; 
    private myobj; 

    public Holder(T obj, string str) 
    { 
     mystring = str; 
     myobj = obj; 
    } 
} 

있다고 가정 해 봅시다 C#에서 제네릭 클래스를 연장 할 수 T.이 일을하는 방법이 있습니까?

예를 들어, Holder < int>를 int처럼 취급하고 싶습니다.

그냥 추가 : T는 작동하지 않지만 다른 방법이 있다면 궁금합니다. 내가 예를 들어,의는 IEnumerable < INT 갈 수 있도록하고 싶습니다으로

암시 적 변환은, 작동하지 않을 것입니다>

제네릭 .NET에서 구현되는 방식은 모든 Foo<T>이 크게 행동해야한다는 요구
+1

시도해보십시오 (대략 3 건의 키 스트로크로 작동하며 해당 오류 메시지가 나타납니다). 그러나 아마도 T 로의 암시 적 변환 *이 효과가 있을까요? – user2864740

+0

"T 연장"이란 무엇을 의미합니까? 상속 받습니까? – gunr2171

+0

그러면 홀더 을 int (예 : int)로 취급 하시겠습니까? –

답변

4

같은 방법으로 T에 관계없이. 무엇보다도 Foo<T>에는 동일한 멤버가 있어야하며 멤버에는 해당 정의에 T이 포함될 수 있습니다. Foo<T>T에서 상속받을 수있는 경우, Foo<T>에 노출 된 회원이 무엇인지 알기 위해서는 및 Foo<Cat>에 대해 완전히 다를 수있는 T 회원을 알 필요가 있습니다. Foo<T>이 예를 들어,에서 파생 된 유형에만 사용될 것이라는 것을 아는 경우. Animal 인 경우 class Foo<T> : Animal where T:Animal을 정의 할 수 있지만 Foo<Cat>Animal - Cat으로 사용되지 않습니다. 많은 경우에

은, 그러나, 정말로 필요한 것은 형식 실제로 T을 상속 Foo<T> 아니라 대부분 T과 같이 동작하는 객체를 생성 할 수 있지만, 일부 차이가 없습니다. .NET Framework에서는이 작업을 직접 수행 할 수 없지만 이러한 목적으로 프록시 개체를 자동으로 생성 할 수있는 라이브러리가 있습니다. 하나의 인터페이스와 하나 이상의 객체가 각각의 인터페이스 멤버를 구현하고 그것들을 집합 적으로 구현하면 프록시 생성기는 제공된 객체에 대한 참조를 보유하고 해당 인터페이스를 구현하는 새로운 클래스를 생성합니다 (런타임시!) 각 인터페이스 메소드에 대해 전달 된 오브젝트 중 하나에서 해당 메소드로 연결되는 클래스 메소드를 작성합니다.

이러한 새 클래스를 만드는 방법은 일반적이지만 일반적인 클래스는 아닙니다. myProxyMaker.Create<IFoo>(IFlyingMammal)proxy8675309을 반환하고 myProxyMaker.Create<ISwimmingMammal>proxy24601을 반환 할 수 있습니다. 그들은 완전히 다른 수업이므로 IFlyingMammalISwimmingMammal과 다른 회원을 가지므로 아무런 문제가 없습니다. 클래스가 추악한 컴퓨터 생성 이름을 가질 수도 있다는 사실은 중요하지 않습니다. 하나는 proxy8675309 또는 proxy24601 변수를 선언하지 않고 IFlyingMammalISwimmingMammal을 입력하기 때문입니다.