2010-10-13 7 views
12

Sono un po 'confuso suQual è la necessità dell'interfaccia marker quando gli attributi servono allo scopo?

Lo scopo di Marker Interface Vs attributi.

Il loro scopo è uguale a me (scusatemi se ho torto).

Qualcuno può spiegare come differiscono nello scopo?

+0

Attributi? Intendi annotazioni? – EJP

+2

@EJP, in .net quelli sono chiamati attributi. Ma i ragazzi di Java dovevano trovare un nome diverso per la stessa cosa quando finalmente li implementarono anche dopo aver detto a tutti che era una sciocchezza ... – Lucero

+0

@EJP: Attributi in. Net: http://msdn.microsoft. it/it/us/library/aa288454 (VS.71) .aspx – Manish

risposta

13

Ecco alcuni vantaggi di entrambi.

interfacce Marker:

  • sono un po 'più facile controllare per l'utilizzo di controlli di tipo dinamici ('obj è IMarker');
  • consentire l'estensibilità funzionale e dei dati in futuro (ovvero trasformare un'interfaccia "marcatore" in un'interfaccia "completa" che dichiara effettivamente alcuni membri);
  • può essere utilizzato in vincoli di tipo generico;

D'altra parte, attributi:

  • forniscono una chiara separazione dei metadati;
  • consentire di specificare ulteriori informazioni tramite i loro costruttori o proprietà;
  • consentire più applicazioni a un'entità;
  • sono di uso generale in termini di applicabilità a diversi tipi di entità, non solo classi;

Dipende pesantemente dall'architettura e dalla particolare architettura dell'applicazione se è appropriato utilizzare un'interfaccia marcatore o un attributo in un caso particolare.

9

Alcuni anni fa, nell'era precedente a Java 5, Java non supportava gli attributi. Pertanto, per "etichettare" una classe o un'interfaccia in modo che possano essere verificate in fase di esecuzione, si useranno interfacce marcatore, che è fondamentalmente un'interfaccia vuota, ma è ancora possibile controllare se un'istanza può essere trasmessa a questa interfaccia.

In .NET, le interfacce marcatore non devono essere utilizzate ad eccezione di casi di utilizzo speciale (come ad esempio l'uso di metodi di estensione), poiché gli attributi forniscono un modo migliore per contrassegnare le classi (e molto altro) con la metainformazione. Lo stesso vale per Java 5 e versioni successive, in cui sono state introdotte le annotazioni che dovrebbero invece essere utilizzate.

+0

Sono parzialmente in disaccordo. Le Interfacce Marker sono ancora utili e in uso oggi. Ad esempio ICommand è un'interfaccia Marker come IDisposable, INotifyPropertyChanged e così via ... e non sono assolutamente interfacce vuote. Ma naturalmente gli attributi sono la scelta preferita in .NET per aggiungere metadati. – RonaldV

+10

@RonaldV: IMO, le interfacce marcatore sono vuote * per definizione *. Pertanto, se un'interfaccia non è vuota, ne consegue che non deve essere un'interfaccia marcatore. Direi sicuramente che nessuna delle interfacce che hai menzionato sono assolutamente interfacce marcatori. Questo è particolarmente vero nel caso di IDisposable, che ha metodi che vengono chiamati da primitive del linguaggio. –

+0

Hai controllato e hai ragione. Sembra che molte persone stiano usando il termine in modo approssimativo e scorretto. – RonaldV

9

Se è possibile utilizzarlo, è preferibile un attributo.

Ma ci sono alcune caratteristiche relative alla tipizzazione statica solo un'interfaccia in grado di offrire:

  1. È possibile aggiungere i metodi di estensione ad esso
  2. è possibile utilizzarlo come un vincolo generico
+0

+1 per sottolineare i vantaggi delle interfacce marker. – TomTom

7

Per inciso, è molto più veloce per verificare un'interfaccia, poiché la CLI è progettata per questo e dispone di codici opzionali per esso (così come C#: è/come).

Il controllo degli attributi richiede la riflessione; molto più lento.

Guardando se l'altro risponde alla maggior parte dei punti, ma anche: gli attributi sono molto più limitati in termini di quali valori si possono passare in essi; principalmente primitivi e stringa.

+2

Se la riflessione per gli attributi dovrebbe diventare un problema di prestazioni, si può facilmente usare un dizionario con la chiave Type come una cache. Di conseguenza, il solo vantaggio prestazionale di solito non dovrebbe far usare l'interfaccia invece di un Attributo. – CodesInChaos

+2

Anche l'accesso al dizionario è molto lento rispetto a un semplice controllo RTTI –

Problemi correlati