2012-12-15 3 views
6

C#에서 컨테이너/구성 요소 모델이 서로 상호 작용하는 방식을 이해하는 데 약간의 어려움이 있습니다. 구성 요소에 컨테이너 및 구성 요소에 대한 정보가있는 사이트 개체가 어떻게 포함되어 있는지 알 수 있습니다. 그러나, 나는 다음과 같은 코드를 가지고 가정 :이 문제없이 작동System.ComponentModel 작업

using System; 
using System.ComponentModel; 

public class Entity : Container { 
    public string Foo = "Bar"; 
} 

public class Position : Component { 
    public int X, Y, Z;  
    public Position(int X, int Y, int Z){ 
     this.X = X; 
     this.Y = Y; 
     this.Z = Z; 
    } 
} 

public class Program { 

    public static void Main(string[] args) { 

     Entity e = new Entity(); 
     Position p = new Position(10, 20, 30); 

     e.Add(p, "Position");    

    }  

} 

, 그것은 컨테이너 (법인) 및 그 안에 포함 된 구성 요소 (위치)를 정의합니다.

그러나 내가 p.Site.Container을 호출하면 Entity가 반환되지만 IContainer는 반환됩니다. 즉, Foo에 액세스하려면 명시 적으로 (Console.WriteLine(p.Site.Container as Entity).Foo);과 같은 작업을 수행해야합니다. 이것은 꽤 성가시다.

내가 누락되었거나 내가 원하는 것을 할 수있는 더 좋은 방법이 있습니까?

답변

2

당신은 아무것도 놓치지 않았습니다. 컴퍼넌트가 내부에있을 수있는 컨테이너에 관한 인터페이스 계약은 없습니다. 컨테이너에 추가 할 수있는 구성 요소의 종류를 제한하려면 Add 메서드를 오버로드하고 추가 할 구성 요소 유형을 검사 할 수 있습니다.

public class Entity : Container { 
    public string Foo = "Bar"; 

    public virtual void Add(IComponent component) { 
     if (!typeof(Position).IsAssignableFrom(component.GetType())) { 
      throw new ArgumentException(...); 
     } 
     base.Add(component); 
    } 
} 
+0

기본적으로 IComponent를 수락하지 않고 다음을 필요로합니다. 그것의 더 전문화 한 버전은 내가 찾고있는 것을 가지고있다? 유형 제약 조건이있는 제네릭 유형을 요구하는 것과는 대조적으로 유형에 대한 예제 점검간에 큰 차이가 있습니까? 나는 거기에 있다고 추측 할 것이다. 그러나 순간에 미묘함은 나를 잃어버린다. –

+1

제네릭을이 시나리오에 적용하는 것이 좋겠지 만 불행히도 제네릭은 .NET 2.0에 도입되었지만 ComponentModel은 .NET 1.0에서 제네릭을 사용할 수 없었습니다. – Eilon

+0

@yilon 왜'is' 연산자를 사용하지 않을까요? IsAssignableFrom보다 훨씬 더 깨끗합니다. – Jordan