2009-03-17 7 views
7

Qual è lo scopo di scrivere un'interfaccia senza membri?Perché usiamo l'interfaccia memberless?

INamingContainer è un esempio in .NET Framework. Ed è descritto in MSDN come:

Identifica un controllo contenitore che crea un nuovo spazio dei nomi ID all'interno della gerarchia di controllo di un oggetto pagina. Questo è solo un'interfaccia marcatore.

viene usato proprio per questo tipo di blocchi:

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

o ci sono altri vantaggi di esso?

EDIT: E 'stato chiamato Marker Interface Pattern (grazie Preet)

risposta

8

Questo per garantire che si può trattare una collezione di oggetti come lo stesso tipo e quindi eseguire alcune operazioni su quel tipo (si sa che si deve eredita dall'oggetto).

Pensateci come attributi. È tipo metadati.

Si potrebbe anche voler eseguire un'operazione su un tipo noto (ad esempio System.Web.UI.Control) ma eseguire solo tale operazione se il tipo eredita da una determinata interfaccia (ad esempio INamingContainer).

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

In effetti, questo è il modo in cui applico gli "attributi" in C++, dal momento che non si ha il riflesso ma si dispone di RTTI. –

+0

punto eccellente - non avendo fatto C++ per quasi 8 anni mi dimentico di cose come questa. –

+0

Questa non sembra una risposta alla domanda. Ha chiesto informazioni sulle interfacce senza membri: quelle che non hanno operazioni o proprietà comuni. È stato accettato, tho ... –

10

Le interfacce senza membri sono utilizzate per fornire funzionalità di tipo mixin in C#. Quindi, data una classe A:

class A : B { ... } 

si può dare funzionalità extra (a-l'ereditarietà multipla) definendo un'interfaccia iStuff:

interface IStuff {} 

poi 'attuazione' in A:

class A : B, IStuff { ... } 

e quindi aggiungendo le funzioni extra

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

_very_ bel pensiero. Non avevo visto prima questa possibilità, ma ora cercherò opportunità. –

+1

ottima idea! –

+1

+1 Oh, questo è * malato * ... in senso buono! – TarkaDaal

8

È un'interfaccia marcatore. Può essere usato per decorare i tipi in modo che tu possa scoprire che il tipo è corretto in fase di esecuzione senza utilizzare la riflessione. lo usiamo per garantire che i tipi generici siano corretti nel callee.

+0

Buon punto sul vantaggio di non usare Reflection. –

+0

Reflection ha un notevole impatto sulle prestazioni. –

3

Confondere i pitonisti che pensano che la digitazione anatra sia fredda.

+1

+1 divertente (LOL per i bambini). – kenny