문제

이것이 속임수라면 실례합니다. 그러나 다양한 유형의 제약 조건과 제네릭 질문을 필터링하기 위해 키워드의 올바른 콤보를 얻을 수 없었습니다.

두 개의 인터페이스가 있습니다 이온 라인 그리고 ioffline.

그것들은 거의 동일한 계약을 설명한다는 점에서 밀접한 관련이 있지만, 이들 사이의 주요 차이점 중 하나는 콘크리트 구현이 사용되는 맥락입니다. 정확히 내 상황은 아니지만 문제를 잘 보여줍니다.

그런 다음 이러한 인터페이스의 콘크리트 구현 자에 대해 작동하는 몇 가지 방법이 있습니다. 때때로 이러한 방법은 한 유형만이 아니라 다른 유형을 다루기를 원합니다.

충분히 간단 :

public void DoStuff<T>(string foo) where T : IOnline {}

키커는 어느 유형에서도 작동 할 수있는 메소드 코드를 구현하고 있습니다. 나는 이것이 정확하다고 생각했지만 컴파일 오류를 읽을 때, 제약 조건이 "Ionline 또는 ioffline을 구현할 경우 어떤 유형 T가 일반적으로 여기에서 사용될 수 있도록하는"것으로 해석 될 것이라는 기대는 실제로 "모든 유형 허용으로 해석됩니다. t가 둘 다 구현하는 경우 일반적으로 사용됩니다. "

public void DoStuff<T>(string foo) where T : IOnline, IOffline {}

분명한 모호성 문제가 있기 때문에 이름이 동일한 이름을 가진 두 개의 별도의 방법을 구현하려고 시도하는 것이 실패합니다. 파라미터 목록이 동일하기 때문에 과부하가 발생하지 않습니다 (원하는 동작이 동일하기 때문에).

~할 수 있었다 각각 적절한 제약 조건을 가진 두 가지 다른 방법에 대해 두 가지 다른 이름을 사용하지만, 이는 kludgy처럼 보이고 다른 것들을 엉덩이에 고통으로 만들 수 있지만 이상적이지는 않습니다.

나는 여기에 빠진 것이 있어야한다고 생각합니다 ... 일반 땅에서 완벽하게 편안하다고 느낍니다. 그러나 이것은 내가 후에 내가 무엇을 달성해야했고, 나는 단지 내 회전하는 것처럼 느낍니다. 바퀴 ATM.

도움이 되었습니까?

해결책

두 번째 예제에서와 같이 여러 제약 조건을 제공하는 것은 실제로 첨가제입니다. 그만큼 일반적인 제약 조건에 대한 MSDN 페이지 이것에 대해 조금 있습니다.

두 인터페이스를 기본 인터페이스에서 상속하고 메소드를 기본 유형으로 제한 할 수 있습니까?

다른 팁

이것은 아마도 당신의 질문에 대한 답이 아니지만, 나는 당신이 당신의 인터페이스를 리팩터링하고 싶다는 느낌을 자발적으로 얻습니다. 귀하의 질문에서 :

그것들은 거의 동일한 계약을 설명한다는 점에서 밀접한 관련이 있지만, 이들 사이의 주요 차이점 중 하나는 콘크리트 구현이 사용되는 맥락입니다.

인터페이스에 대한 내 견해는 그 것입니다 그들은 계약입니다. 그들은 어떻게 해야하는지 정의합니다 바라보다, 정확히 어떻게 해야하는지는 아닙니다 행동하다; 그것이 구현의 과제입니다. 이제 응용 프로그램이나 문제 도메인에 대한 정보가 없지만 해당 인터페이스의 동일한 부분을 식별하고 단일 인터페이스로 이동하는 데 시간을 보내고 다른 인터페이스로만 유지하려고 노력할 것입니다. 이렇게하면 이러한 종류의 문제를 더 쉽게 지나치게 탐색 할 수 있습니다.

이를 수행하는 .NET의 표준 방식은 Ionline 및 Ioffline 함수를 모두 포함하는 하나의 인터페이스와 특정 클래스에서 실제로 어떤 함수가 구현되는지 말하는 속성을 갖는 것입니다. 이 패턴은 .NET의 다양한 장소에서 구현 될 수도 있고 구현되지 않을 수있는 것과 같은 것과 테스트 할 수있는 속성과 같은 것들을 가지고 있습니다.

아마도 가장 깨끗한 oo 디자인은 아니지만 작동합니다.

컴파일 타임 확인을 잃어 버리지 만 그 주위에 어떤 방법이 있는지 볼 수 없습니다 ... 당신은 당신이 사용하는 것을 선택해야합니다. (선호도가 온라인 상태라고 가정합니다) :

public void DoStuff<T>(string foo)
{
    Type type = typeof(T);
    if(type.GetInterfaces().Contains(typeof(IOnline)))
         doStuffOnline<T>(foo);
    else if(type.GetInterfaces().Contains(typeof(IOffline)))
         doStuffOffline<T>(foo);
    else
         throw new Exception("T must implement either IOnline or IOffline");
}

private void doStuffOnline<T>(string foo){ // can assume T : IOnline }
private void doStuffOffline<T>(string foo){ // can assume T : IOffline }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top