2012-02-21 3 views

답변

0

그렇지 않은 : 그래서 난 내 코드에서이 가질 수

public class A<T> : B<U> 
{ 
... 
} 

을 (클래스 이름은 도움이되지 않습니다. 내 뇌는 클래스 T와 어려움을 겪고있었습니다). Roy Dictus가 당신이 원하는대로 대답합니까, 아니면 Chris의 대답이 당신이 찾고있는 것이 었나요? 나는 interfaces support covariance, classes do not 것을 인이

public class MyBaseClass {} 

    public class MyClass : MyBaseClass {} 

    interface IB<out T>{} 

    public class B<T> : IB<T> { } 

    public class A<T> : B<T> {} 

    static void Main(string[] args) 
    { 
     IB<MyBaseClass> myVar = new A<MyClass>(); 
    } 

열쇠처럼, 이전 중 하나에서 다른 방법으로 문제를 해석했다.

2

당신은 당신이 그것을 쓰기 정확히처럼 가질 수 없습니다,하지만 당신은이 작업을 수행 할 수 있습니다 다음

public class A<T, U> : B<U> where T : U 
{ 
    ... 
} 

B<U> x = new A<T, U>(); 
+0

그는 그가 쓴대로 정확하게 가질 수 있습니다. 단지 그가 원했던 것을 의미하지 않을 수도 있습니다. 그러나 그는 원하는 경우 C#으로 유효한 내용을 정확하게 입력 할 수 있습니다. :) – Chris

+0

좋아요, 내가 쓴 것은 정확히 내가 의미하는 것이 아니 었습니다. – jambodev

1

초기 코드가 잘 작동 않습니다 않는 ...이 있지만 아마도 당신이 사용한 용어로 인해 약간의 혼동이 될 것입니다 ...

필자가 작성한 코드는 다음과 같이 더 명확하게 다시 작성 될 수 있다고 생각합니다.

void Main() 
{ 
    B<Foobar> x = new A<Wibble>(); 

} 

// Define other methods and classes here 
public class Foobar 
{ 
} 

public class Wibble : Foobar 
{ 
} 

public class B<U> 
{ 
} 

public class A<T> : B<Foobar> 
{ 
} 

중요한 점은 generic 매개 변수의 컨텍스트에서 U를 사용하고 때로는 구체적인 클래스로 사용한다는 것입니다.

void Main() 
{ 
    B<U> x = new A<T>(); 

} 

// Define other methods and classes here 
public class U 
{ 
} 

public class T : U 
{ 
} 

public class B<U> 
{ 
} 

public class A<T> : B<U> 
{ 
} 

만 마지막 두 개의 클래스가 일반 매개 변수를 사용하고 마지막 클래스가 U는 정의하지 않습니다

위의 코드에 (LINQPad가 그것을 컴파일하는 IL 기준)과 동일 generic 매개 변수이므로 구체적인 클래스로 취급합니다. 당신이 원한 것을 우리에게 말하지 않았기 때문에 이것이 당신이 원한 것인지 아닌지 말하기 어렵습니다. 우리에게 몇 가지 코드 만 보여주었습니다. 아마도 @Roy Dictus가 대답하는 두 가지 일반적인 매개 변수 솔루션을 원하지만 아마도 이것을 원할 수도 있습니다. 말하기 어렵다. ;-)

삭제 된 이전 답변에 부분적으로이 답변에 동의합니다. 그 대답은 실제 코드를 테스트하도록 영감을 준 코드가 잘 컴파일되었다고 지적했습니다. 슬프게도 대답은 삭제되어서 영감을 얻기 위해 문제의 사람에게 신용을 줄 수는 없습니다.

감사합니다. Chris는 아래의 A<T> 생성자에서 T의 생성자를 호출 할 수 있다면 내 문제를 해결합니다. public class A<T> : B<Foobar> {} 어떻게하면됩니까? - jambodev 1 분 전

이 경우 T는 일반적인 매개 변수이므로 컴파일러에게 T가 확실히 생성 가능하다는 사실을 알려줘야합니다. 이렇게하려면 생성자가 있는지 확인하기 위해 T를 제한해야합니다.그럼 언제든지 새 인스턴스를 만들 수 있어야합니다. (예 : T foo = new T();

A는 기본 클래스의 생성자를 체인하는 것과 같은 방식으로 물론 호출 할 수 없습니다. A는 어느 클래스에서든지 T에서 파생되지 않기 때문입니다. 방법은, 단지 그것의 일반적인 패턴 타입 T의 객체를 사용한다.

public class A<T> : B<Foobar> where T :new() 
{ 
    public T MyInstance {get; set;} 
    public A() 
    { 
     MyInstance = new T(); 
    } 
} 

void Main() 
{ 
    B<Foobar> x = new A<Wibble>(); 
    Wibble y = ((A<Wibble>)x).MyInstance; 
} 

Y가 생성 Wibble 유형의 목적

주 (코드 내에서 첫 번째 코드 블록에서 해당 방법을 대체) x의 conscructor에서. 왜냐하면 나는 접근하기 전에 x를 캐스팅해야했기 때문이다. B<Foobar>은 제네릭 종류 Wibble의 사용법에 대해 아무것도 모릅니다.

+0

감사합니다. 크리스이 내 문제는 내가 밑에 의 생성자에서 T의 생성자를 호출 할 수 있음을 제공 해결 : 대중 A 급 : B { } 내가 어떻게 할 수 있습니까? – jambodev

+0

내 대답에 대한 업데이트에 귀하의 질문에 답변했습니다. – Chris

+0

Chris에게 다시 한 번 감사드립니다. – jambodev