2010-01-15 7 views
5

각 항목의 인터페이스는 IItem입니다. 이것뿐만 아니라 Item에서 상속 한 IDrawableItem이라는 인터페이스가 있습니다.캐스팅 및 인터페이스 상속

아래 코드는 드로어 블 아이템 그리기를 시도하고 있지만 컬렉션으로서이 클래스 스토어는 IItem 만 허용 할 수 없습니다. IItem에서 상속 한 항목을이 클래스에 추가 할 수 있지만 다른 방법을 사용하면 캐스팅을 통해서만 수행 할 수 있습니다.

foreach (var item in Items) { 
    item.Draw();    // The casting would go here. 
} 

나는, as 등 캐스팅 ...하지만이 허용하는 방법을 알고? 가장 좋은 방법입니까?

이러한 시나리오를 처리 할 수있는 다른 방법이 있는지 궁금합니다.

+0

아래 코드는 드로어 블 아이템을 그리려하고 있지만 콜렉션으로서이 클래스 스토어는 IItem만을 허용하지 않습니다. - 왜? 디자인에 대해 조금 알려주세요. 그것을 바꿀 수 있습니까? –

+0

Jason의 코드는 당신을 당신의 딜레마에서 벗어나게 할 것입니다. 문제는 이것이 여러분의 객체에 적합한 디자인인지 아닌지에 관한 것이며, 2 줄의 설명으로 말하기가 정말 어렵습니다. – hackerhasid

+0

대신 IDrawbleItem을 저장하는 컬렉션을 사용 하시겠습니까? –

답변

11

사용 Enumerable.OfType 구현 Items의 요소 만 추출하는 IDrawableItem :

:

foreach(var item in Items.OfType<IDrawableItem>()) { 
    item.Draw(); 
} 

Nanook에 위의 코드는 아마 다음 코드와 동등한로 변환됩니다 코멘트에 요청 문제를 해결하기 위해

foreach(var item in Items) { 
    if(item is IDrawableItem) { 
     ((IDrawable)item).Draw(); 
    } 
} 

물론 실제로는 다음과 같은 모양의 이터레이터가 있습니다.

public static IEnumerable<T> OfType<T>(this IEnumerable<TSource> source) { 
    if(source == null) { 
     throw new ArgumentNullException("source"); 
    } 
    foreach(TSource item in source) { 
     if(item is T) { 
      yield return (T)item; 
     } 
    } 
} 

따라서 표시된 것은 Items 번까지만 반복하는 것입니다. 물론, OfType이 위와 같이 구현되어야한다는 요구 사항은 없지만 이것은 합리적인 일입니다.

+0

이 예제는 실제로 2 개의 루프를 수행합니까? 1은 IDrawableItem을 가져오고 다른 하나는 IDL을 반환하고 Draw를 호출합니다. 그렇다면 이것은별로 좋은 결과가 아닙니다. – Nanook

+2

아니요, 결과를 스트리밍합니다. –

+0

Nop, 그렇지 않습니다. 모든 Linq.Enumerable 메서드는 사용자 지정 열거자를 사용하여 구현됩니다. 위의 코드는 foreach (항목의 var item)와 같은 것으로 해석됩니다 (항목이 IDrawableItem 인 경우 IDrawableItem으로 항목 반환). } – herzmeister

1

두 가지 다른 솔루션 :

  • 별도의 컬렉션의 드로어 블을 유지합니다.
  • IItemDrawIfPossible() 방법을 추가하십시오. IDrawableItem을 호출하여 Draw()을 호출해야하며 다른 IItem() 구현자는 빈 구현을 가져야합니다.

명시 적 유형 쿼리는 디자인에 문제가있을 수 있다는 신호로 간주됩니다.

+0

내가 말했듯이, 이것은 바뀔 가능성이있는 빠른 프로토 타입입니다. 비록 내가 디자인에 관한 당신의 마지막 점에 동의하지만. – Finglas

+0

비평으로서의 의미가 아니 었습니다. 유형 쿼리가 필요한 경우가 있습니다. 빠른 해킹, 'ICastItDownAsNeeded' 등으로 객체를 전달하는 프레임 워크 –

관련 문제