2009-03-17 17 views
7

メンバーを持たないインターフェイスを作成するポイントは何ですか?なぜメンバレスインターフェイスを使用しますか?

INamingContainerは、.NET Frameworkの一例です。そして、それは次のようにMSDNで説明しています:

は が Pageオブジェクトのコントロール階層内に新しいID名前空間を作成するコンテナーコントロールを識別します。この はマーカインタフェースのみです。

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

それとも他の利点があります。

は、それがブロックのちょうどこの種のために使用されていますか?

EDIT:は、それがこれはそれが必要であることは知っている(あなたが同じタイプとしてオブジェクトのコレクションを扱い、その種類にいくつかの操作を実行できるようにすることですMarker Interface Pattern(感謝プリート)

答えて

8

と呼ばれていましたオブジェクトから継承します)。

属性と同様に考えます。タイプメタデータです。

既知の型(System.Web.UI.Controlなど)に対して操作を実行したいが、その型が特定のインタフェース(INamingContainerなど)から継承する場合にのみその操作を実行することもできます。

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

実際には、これはC++で「アトリビュート」を適用する方法です。リフレクションを持たないがRTTIを持っているからです。 –

+0

優秀な点 - できなかったC++ほぼ8年間このような事を忘れてしまいます。 –

+0

これは答えのようには思われません。彼は、一般的な操作やプロパティを持たないメンバーレスインターフェイスについて尋ねました。それは受け入れられました... –

10

メンバーレスインターフェイスは、C#でmixinのような機能を提供するために使用されます。 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面白い(子供のための笑)。 – kenny

関連する問題