2011-04-05 2 views
14

두 가지 일반 기본 클래스가 있습니다. 두 번째 일반 클래스에는 첫 번째 클래스의 매개 변수에 대한 제약 조건이 있습니다.일반 매개 변수 및 추상 클래스가있는 일반 본

abstract class FirstClass<T> {...} 

abstract class SecondClass<U> where U : FirstClass {...} 

FirstClass가 정의되어 있지 않아서 작동하지 않습니다. 그래서 나는 이것을해야한다.

abstract class FirstClass<T> {...} 

abstract class SecondClass<U, T> where U : FirstClass<T> {...} 

다음 중 어떤 것입니까? 그러나 이로 인해 이러한 추상 클래스가 추악하게 구현됩니다.

class SomeClass {...} 

class MyFirstClass : FirstClass<SomeClass> {...} 

class MySecondClass : SecondClass<MyFirstClass, SomeClass> {...} 

SomeClass를 두 번 지정했기 때문에 이것은 과장된 것 같습니다. FirstClass의 T가 자동으로 SecondClass의 U라는 방식으로이를 선언하는 방법이 있습니까? 내가 이렇게 보이기를 정말로 좋아할 것입니다.

class SomeClass {...} 

class MyFirstClass : FirstClass<SomeClass> {...} 

class MySecondClass : SecondClass<MyFirstClass> {...} 

이 정확한 시나리오가 의심 스럽지만, 내가하고 싶은 일을 어떻게해야할까요?

편집

몇몇 사람들은 IFirstClass 인터페이스을 제안했다. 그러나 나의 정의는 이것에 더 가깝다.

class FirstClass<T> 
{ 
    public T MyObj { get; set; } 
} 

class SecondClass<U, T> where U : FirstClass<T> 
{ 
    U MyFirstClass { get; set; } 
} 

인터페이스를 사용하면 SecondClass의 MyFirstClass.MyObj에 액세스 할 수 없습니다. IFirstClass에 object T MyObj { get; set; }을 만들 수 있지만 new을 사용하면 그것을 숨길 수 있습니다. 이렇게하면 실버 라이트가 바인딩에 적합합니다.

+0

질문에서 silverlight는 언급하지 않지만 실버 라이트 프로젝트입니다. 이것이 해결책을 제한 할 지 모르겠습니다. – cadrell0

+0

제네릭은 WCF 또는 WCF RIA 서비스로 노출 될 수 없기 때문에 WCF RIA Services의 TypeOf 을 POCO 클래스로 마샬링하려고하면 솔루션이 제한됩니다 (주요 해결 방법은 없음). –

+0

FirstClass 에 대한 특정 유형의 정보를 사용하고 있습니까? 그렇지 않은 경우 FirstClass 을 일부 IGenericFirstClass 인터페이스와 일치시킨 다음 IGenericFirstClass로 제약 조건을 지정하면됩니다. U 형 종속성을 숨 깁니다. –

답변

4

FirstClass에 대한 제네릭 형식 인수를 실제로 사용하고있는 경우 (편집에서 본 것처럼 들린다), 그렇다면 원하는 것은 아쉽게도 불가능합니다. 컴파일러는 관련있는 형식 인수와 그렇지 않은 형식 인수를 구별하지 않습니다.

+1

그건 내가 생각한 것이지만, 희망이 없다면 우리는 무엇을 가지고 있을까? – cadrell0

+0

@ cadrell0 : careers.stackoverflow.com;) 물론 이러한 답변 중 하나를 수락하는 것을 잊지 마십시오. 이들은 거의 유일한 옵션입니다. –

10

내 경험에 비선형 인터페이스를 제네릭 클래스에 만드는 것이 가장 쉽습니다. 또한 일반 유형을 모른 채 기본 클래스로 형변환해야 할 때 문제를 해결합니다.

interface IFirstClass {...} 

abstract class FirstClass<T> : IFirstClass {...} 

abstract class SecondClass<T> where T : IFirstClass {...} 
+0

제 편집을보세요. 기본 클래스로 캐스팅해야하는 문제가 발생하지 않았습니다. – cadrell0

2

FirstClass가 구현하는 인터페이스를 만듭니다. 그런 다음 SecondClass를 인터페이스로 제한 할 수 있습니다.

관련 문제