2010-08-01 5 views
2

나는 여기서 명백한 무엇인가를 놓치고 있을지도 모른다. 다음C#에서 제네릭 형식 매개 변수를 연결하지 않아도되는 방법이 있습니까?

public interface IResponse<out T> 
    where T : class 
{ 
    T Response 
    { 
     get; 
    } 
} 

그리고 제네릭 형식 매개 변수로 이러한 인터페이스를 사용하여 세 번째 인터페이스 :

public interface IRequest<out T> 
    where T : class 
{ 
    T Request 
    { 
     get; 
    } 
} 

그리고 : 나는 다음이있는 경우 만

public interface IResponder<in TRequest, TRequestValue, out TResponse, TResponseValue> 
    where TRequest : IRequest<TRequestValue> 
    where TResponse : IResponse<TResponseValue> 
    where TRequestValue : class 
    where TResponseValue : class 
{ 
    TResponse Query(TRequest request); 
} 

은 피할 수있는 방법이 있나요 TRequestValueTResponseValue을 일반 매개 변수로 IResponder에 전달해야하므로 (따라서 관련 제약 조건을 복제하지 않아도 됨) ?

기본적으로 나는 비슷한을 선호하려는 (나는이 순간에 컴파일되지 않을 것이다 실현) IResponder에 제네릭 형식 매개 변수의 수를 줄이기 위해 다음

public interface IResponder<in TRequest, out TResponse> 
    where TRequest : IRequest 
    where TResponse : IResponse 
{ 
    TResponse Query(TRequest request); 
} 

유일한 방법 I 이 일을 생각하면 두 개의 비 제너릭 인터페이스 (IRequestIResponse)를 작성한 다음 IRequest<T>IResponse<T>을 구현하면되지만 그 방법이 잘못되었다고 생각할 수 있습니다.

저는 여기에서 일하는 방식 때문에이 문제에 부딪 힐 수도 있다는 것을 충분히 알고 있습니다. 그래서 제가 잘못하고있는 것을 제안 해 주시기 바랍니다!

참고 : 전체 요청, 응답, 응답자 예제는 실제로 내가 작성한 코드가 아니라 내 질문을 시도하고 지원하는 예제입니다.

답변

1

제네릭이 아닌 별도의 인터페이스를 만드는 아이디어는 실제로 C#에서 일반적인 시나리오를 수용하는 일반적인 방법입니다. (예 : IList <T> 및 IList를 참조하십시오.) IMO, 제네릭이 현재 상황에서 많은 가치를 부여하지 않을 가능성이 있습니다. 실제로 코드를 재사용하고 코드를 단순화하기보다는 사람들이 클래스를 사용하는 방식을 제약하는 데 사용하는 것 같습니다. 제 제안은 제네릭이 아닌 IRequest 및 IResponse 인터페이스를 사용하고 Responder가 제네릭없이 직접 해당 인터페이스를 사용하도록하는 것입니다. Query 메소드가 모든 유형 변환을하지 않고도 정확한 유형을 갖는 것이 중요하다고 생각한다면, 모든 유형 제약 조건의 장황함을 받아 들여야합니다.

+0

건배 커크. 나는 네가 좋은 지적을했다고 생각한다. 내 디자인을 다시 보면, 두 개의 인터페이스가 실제로 일반화되어있는 이유가 무엇인지 불확실한 것으로 생각하지 않습니다. 그래서 우리가 말하는대로 다시 살펴 보겠습니다. – Dougc

1

아니요. IRequest가 IRequestValue와 관련되어있을 필요는 없습니다. 의 경우 사용자가이지만 이는 추상적 의미론 때문입니다. 컴파일러는 그것을 알 수 없습니다.

함수 매개 변수로 동일한 접근법을 사용했다면 고려해보십시오. 컴파일러가 부당한 인수를 추론 할 수 있다고 가정하는 것이 합리적일까요? 아닙니다. 수동으로 통과시켜야하며 주변에는 아무 것도 없습니다.

관련 문제