2009-03-17 7 views
7

회원이없는 인터페이스를 작성하는 요령은 무엇입니까?회원없는 인터페이스를 사용하는 이유는 무엇입니까?

INamingContainer은 .NET Framework의 한 가지 예입니다.

이 가 Page 개체의 컨트롤 계층 구조 내에 새 ID 네임 스페이스를 만드는 컨테이너 컨트롤을 식별 : 그리고 그것은으로 MSDN에 설명합니다. 이 은 마커 인터페이스입니다.

if (myControl is INamingContainer) 
{ 
    // do something 
} 

또는 그것의이 다른 장점은 다음과 같습니다

는 블록의 단지 이런 종류의 사용인가?

편집 : 그것은 불렀다 Marker Interface Pattern (감사 Preet)

이 같은 유형으로 개체의 컬렉션을 처리 할 수 ​​있도록하고 그 유형에 몇 가지 작업을 수행하는 것입니다

답변

8

가 (당신이해야합니다 알고 객체로부터 상속).

속성과 비슷합니다. 형식 메타 데이터입니다.

알려진 유형 (예 : System.Web.UI.Control)에서 작업을 수행하고 유형이 특정 인터페이스 (예 : INamingContainer)에서 상속하는 경우에만 해당 작업을 수행 할 수 있습니다.

foreach(var ctrl in this.Controls) 
{ 
    if (ctrl is INamingContainer) 
    { 
     // Do something on the control 
    } 
} 
+0

실제로 리플렉션이 없지만 RTTI를 사용하기 때문에 C++에서 "속성"을 적용하는 방법입니다. –

+0

훌륭한 점 - 거의 8 년 동안 C++을하지 못했지만 이런 것들을 잊어 버렸습니다. –

+0

이것은 대답과 같은 질문이 아닙니다. 그는 구성원이없는 인터페이스 (일반적인 조작이나 속성이없는 인터페이스)에 대해 물었습니다. 그것은 받아 들여지고, tho ... –

10

멤버리스 인터페이스는 C#에서 믹스 인 같은 기능을 제공하는 데 사용됩니다. IStuff 인터페이스를 정의하여

class A : B { ... } 

당신은 그것을 추가 기능 (- 라 다중 상속)을 제공 할 수 있습니다 : 그래서 클래스 A를 주어진

:

interface IStuff {} 

은 그것의 '실행'

class A : B, IStuff { ... } 

다음 추가 추가 기능

class Methods { 
    public static void Something(this IStuff stuff) { 
    // some functionality here 
    } 
} 
+1

_very_ 좋은 생각. 전에는이 가능성을 보지 못했지만 지금은 기회를 찾습니다. –

+1

아주 좋은 아이디어! –

+1

+1 아, 그건 아프다 * ... 좋은쪽으로! – TarkaDaal

8

마커 인터페이스입니다. 리플렉션을 사용하여 런타임에 유형이 올바른지 알아낼 수 있도록 유형을 장식하는 데 사용할 수 있습니다. 피 호출자에서 제네릭 형식이 올바른지 확인하는 데 사용합니다.

+0

Reflection을 사용하지 않는 장점에 대해 좋은 점. –

+0

반사에는 중요한 성능 저하가 있습니다. –

3

오리 타이핑이 멋지다고 생각하는 파이썬 스타를 혼동스럽게합니다.

+1

+1 재미있다 (아이들을위한 LOL). – kenny

관련 문제