2013-05-23 3 views
0

나는 List<object>의 목록을 가지고 있습니다. 어떻게하면 Class1Class2만을 사용해야한다는 것을 제한 할 수 있습니까?클래스 사용을 어떻게 제한 할 수 있습니까?

Class1Class2은 기본적으로 다릅니다. 나는이 클래스들 모두를위한 기본 클래스가 무엇인지를 추측 할 것이고리스트는 그것과 함께 작동하도록 제한 할 것이지만 실제로는 모른다.

+8

'공공 추상 클래스 ClassAbstract' 포장하여 서명을 확인 할 수 있습니다

이 당신이 시도 할 수있는 또 다른 방법, 그러나입니다. 'public class Class1 : ClassAbstract'입니다. 'public class Class2 : ClassAbstract'입니다. 'List '. 인터페이스에서도 동일한 작업을 수행 할 수 있습니다. – Fendy

+0

당신은 인터페이스라는 개념을 찾고 있습니다. http://msdn.microsoft.com/en-us/library/87d83y5b%28v=vs.80%29.aspx – Kta

+0

목록의 항목을 어떻게 사용하고 있습니까? 당신은 그들과 무엇을해야하는지보기 위해'is' 또는'as'을 사용하고 있습니까? 그것은 조금 이상하게 보입니다. –

답변

8

은 두 클래스가 목록에 참조 할 수있는 클래스의

public interface MyInterface 
{ 
} 

public class Class1 : MyInterface 
{ 
} 

public class Class2 : MyInterface 
{ 
} 

List<MyInterface> myList = new List<MyInterface>(); 

유일한 인스턴스를 구현하는 인터페이스가 MyInterface 인터페이스를 구현하는 것들이다합니다. 이 경우에만 Class1Class2입니다.

+0

"Class1과 Class2는 기본적으로 다릅니다"라는 점에 유의하십시오. 이는 상호 인터페이스 방식이 작동하지 않음을 나타낼 수 있습니다. :) – David

+0

@David 정말입니다. 'Class1'과'Class2'에는 같은 것이 없습니다. – kseen

+3

나는 둘 다 "목록에 들어가야한다"는 견해를 공유하지 않는다. 그래서 이것이 공통 속성입니다. 이를 반영하기 위해 인터페이스 자체가 비어있을 수 있습니다. 그것들이 너무 다르다면 인터페이스를 만드는 것이 의문의 여지가 없다면, 두 가지 유형 중 하나의 목록을 만드는 것이별로 의미가 없다. – Bazzz

2

나는 이러한 요구 사항을 처리하기 위해이 올바른 방법이라고 확신합니다. Bazz's answer입니다.

public class MyCustomList : ArrayList 
{ 
    public override void Add(object item){ 
     if(item is Class1 || item is Class2) { 
      base.Add(item); 
     } 
     else { 
      throw BadaboomException(); 
     } 
    } 
} 

또는 컬렉션을 완전히

public class MyCustomList : ICollection 
{ 
    private readonly ArrayList m_InnerList = new ArrayList(); 

    public virtual void Add(Class1 item) { 
     this.m_InnerList.Add(item); 
    } 
    public virtual void Add(Class2 item) { 
     this.m_InnerList.Add(item);   
    } 


    public void CopyTo(Array array, int index) { 
     m_InnerList.CopyTo(array, index); 
    } 

    public int Count { get { return m_InnerList.Count; } } 
    public bool IsSynchronized { get{ return m_InnerList.IsSynchronized; } } 
    public object SyncRoot { get{ return m_InnerList.SyncRoot; } } 

    public IEnumerator GetEnumerator(){ 
     return m_InnerList.GetEnumerator(); 
    } 

} 
+1

BadaboomComment – Bazzz

관련 문제