2013-01-09 5 views
0

별도의 표를 채울 데이터가 포함 된 2 개의 클래스가 있습니다. 그리드는 매우 비슷하지만 클래스가 2 개인 클래스를 사용해야합니다. 두 그리드에는 "GetDuplicates"라는 함수가 있으며이 클래스를 구현할 때 클래스에 중복이 있는지 확인하고이를 나타내는 메시지를 반환하는 메서드가 있습니다.일반 메서드 제약?

private bool HasDuplicates(FirstGridList firstList) 
{ 
    var duplicates = firstList.FindDuplicates(); 
    if (duplicates.Count > 0) 
    { 
     // Do Something 
     return true; 
    } 
    return false; 
} 

나는 FirstGridList과 SecondGridList 모두를 사용하여 해당 메소드를 호출 할 수 있도록하고 싶습니다. 필자는 제네릭 제약 조건을 올바르게 구현 한 다음 제네릭 입력 매개 변수를 올바른 형식으로 캐스팅하는 방법을 알지 못합니다. 유사 항목 :

private bool HasDuplicates<T>(T gridList) 
{ 
    // Somehow cast the gridList to the specific type 
    // either FirstGridList or SecondGridList 

    // Both FirstGridList and SecondGridList have a method FindDuplicates 
    // that both return a List<string> 
    var duplicates = gridList.FindDuplicates(); 
    if (duplicates.Count > 0) 
    { 
     // Do Something 
     return true; 
    } 
    return false; 
} 

위와 같은 방법으로 동일한 작업을 수행 할 수 있습니다. 그러므로 저는 이것을 두 번 만들고 싶지 않습니다. 나는 이것이 가능하다고 생각하지만 잘못 생각하고있다. 제네릭에 대해서는 아직 정확하게 경험하지 못했습니다. 고맙습니다.

+1

'FirstGridList'와'SecondGridList'는 같은 기본 클래스를 공유합니까? –

답변

7

당신은 가질 수 모두 당신의 그리드와 같은 공통 인터페이스를 구현 :이 인터페이스를 기반으로 제네릭 제약 조건을

public interface IGridList 
{ 
    public IList<string> FindDuplicates(); 
} 

다음 정의 : 분명히

private bool HasDuplicates<T>(T gridList) where T: IGridList 
{ 
    // Both FirstGridList and SecondGridList have a method FindDuplicates 
    // that both return a List<string> 
    var duplicates = gridList.FindDuplicates(); 
    if (duplicates.Count > 0) 
    { 
     // Do Something 
     return true; 
    } 
    return false; 
} 

모두 당신의 FirstGridListSecondGridList는 구현해야합니다 IGridList 인터페이스와 FindDuplicates 메소드가 있습니다.

또는 당신도이 단계에서 제네릭을 제거 할 수 : 그것은 당신의 응용 프로그램에 많은 가치를 제공하지 않는 한 당신도 HasDuplicates 방법 제거 할 수있는이 단계에서 그런데

private bool HasDuplicates(IGridList gridList) 
{ 
    // Both FirstGridList and SecondGridList have a method FindDuplicates 
    // that both return a List<string> 
    var duplicates = gridList.FindDuplicates(); 
    if (duplicates.Count > 0) 
    { 
     // Do Something 
     return true; 
    } 
    return false; 
} 

.

IGridList gridList = ... get whatever implementation you like 
bool hasDuplicates = gridList.FindDuplicates().Count > 0; 

는 합리적이고 기본적인 C#을 문화와 모든 개발자 충분히 읽을 것 같다 : 제네릭 또는 LINQ와 같은 일이 왜 그것을 사용하지 전에 내가 지향 프로그래밍 객체 오랫동안 존재 의미한다. 물론 두 줄의 코드가 필요 없습니다. 그리고 더 많은 코드를 작성할수록 실수를 할 확률이 높아집니다.

+3

이 시점에서 일반 ''을 없애고'IGridList'에 직접 입력하면됩니다. –

+0

오, 예, 크리스, 당신은 완벽합니다. 귀하의 발언을 포함하도록 답변을 업데이트했습니다. 이것을 지적 해 주셔서 감사합니다. –

+0

@ChrisSinclair는 T가 메소드 내부에서 사용되었고 인터페이스 제약 조건을 가졌기 때문에 발생했습니다. 클래스 또는 인터페이스 제약 조건을 사용할 때 입력으로 사용되는 일반 유형을 사용할 필요가 없다는 것을 일반화하고 말할 수 있습니까? – MBen