2011-11-07 3 views
2

내 클래스에서 사용할 제네릭 인터페이스의 구현을 지정하고자한다고 가정 해 보겠습니다.비공개 형식의 사용자 지정 제네릭 인터페이스 구현을 사용하려면 어떻게해야합니까?

class Foo<T> where T : IList<Bar>, new() 
{ 
    private T _list = new T(); 
} 
class Bar{} 

우리는 다음과 같은 foo는의 새로운 인스턴스를 만들 수 있습니다 : new Foo<List<Bar>>()

을하지만 무슨 일 Bar 인 클래스가 다른 공공 유형을 저장하는 데 사용하는 경우이 단순 (조금 못생긴 경우)입니다 Foo 내 개인 클래스 : Foo이 형 제약에서 Bar를 노출 할 수 없기 때문에

class Foo<T> where T : IList<Bar>, new() 
{ 
    private T _list = new T(); 
    class Bar{} 
} 

은 분명히이 실패하고,를 인스턴스화 할 수있는 방법이 없습니다

class Foo<T> where T : IList<object>, new() 
{ 
    private T _list = new T(); 
    class Bar{} 
} 

을하지만 그때 나는 Barobject에서 나는 인터페이스를 사용할 때마다 캐스팅 해요 :

나는 object 노출을 고수 할 수있다.

내 최고의 옵션은 무엇입니까?

답변

1

private의 목적은 동일한 클래스의 코드에서만 액세스를 허용합니다. 단순히 당신이하려는 것은 정확하지 않습니다. 귀하의 요구 사항에 따라 다른 액세스 한정자에 더 비공개로 변경하십시오. 다음

class Foo<TList, TItem> where TList : IList<TItem>, new() 
{ 
    private IList<TItem> _list = new TList(); 

    public Foo() 
    { 
    } 


    public void Add(TItem item) 
    { 
     _list.Add(item); 
    } 
} 

그리고

class BarFoo : Foo<List<BarFoo.Bar>, BarFoo.Bar> 
{ 
    class Bar { } 
} 
+0

나는 '바'를 노출하려고하지 않습니다. 나는하지 않을 것을 원합니다. 전달 된 제네릭 형식으로 내부적으로 사용하면됩니다. – dlras2

0

당신의 최선의 선택은 다음과 같습니다.

class Foo 
{ 
    private List<Bar> _list = List<Bar>(); 
    class Bar{} 
} 

내가 할 수있는 유일한 이유는 Foo를 private, nested 클래스의 목록을 래핑하는 제네릭 클래스로 만들려면 Bar inheritors가있는 개인 중첩 클래스 계층 구조가 있어야합니다. 그리고 이것이 사실이라면 Foo에게 서브 클래스 클라이언트가 원하는 것을 알리는 데 필요한 매개 변수를 취하는 일종의 팩토리 메소드를 노출 할 수 있습니다. 목록의 유형과 목록을 모두 비공개로 유지하는 경우 클래스의 공개 API를 제네릭으로 만드는 것이 타당하지 않습니다 (IMO). 클라이언트가 액세스 권한이 없거나 제어 할 수있는 유형을 고객에게 제공 할 것을 요구하고 있습니다.

+0

풀 답변을 한꺼번에 게시하지 않으려 고 죄송합니다. 복사/붙여 넣기에 문제가 발생했습니다. – Polity

0

처럼 줄을 보유하기위한 구체적인 클래스를 만들 : 컬렉션의 인스턴스 유형을 노출 푸 클래스의 두 번째 유형 매개 변수를 노출에 대해 뭔가처럼 무엇

관련 문제