implementazione implicita vs interfaccia esplicita

Possibile duplicato:
C #: Interfacce: implementazione implicita ed esplicita

Qualcuno potrebbe spiegare le differenze tra queste due bestie e come usarle. AFAIK, molte classi pre.2.0 sono state implementate senza tipi generici, facendo in modo che quest’ultima versione implementasse entrambi i tipi di interfacce. È l’unico caso per cui bisognerebbe usarli?

Puoi anche spiegare in dettaglio come usarli?

Grazie

C’è un post di blog buono e abbastanza dettagliato su questo.

Fondamentalmente con l’implementazione implicita dell’interfaccia si accede ai metodi e alle proprietà dell’interfaccia come se fossero parte della class. Con le implementazioni esplicite dell’interfaccia è ansible accedervi solo quando lo si considera come tale interfaccia.

In termini di utilizzo dell’uno sull’altro, a volte è necessario utilizzare l’implementazione esplicita dell’interfaccia poiché si dispone di una proprietà / metodo con la stessa firma dell’interfaccia oppure si desidera implementare due interfacce con le stesse firme e disporre di implementazioni diverse per quelle proprietà / metodi che corrispondono.

Le regole seguenti sono tratte dal blog di linee guida sulla progettazione di Brad Abrams.

  • Non utilizzare membri espliciti come limite di sicurezza. Possono essere richiamati da qualsiasi client che esegue il cast di un’istanza nell’interfaccia.
  • Utilizzare membri espliciti per hide i dettagli di implementazione
  • Utilizzare membri espliciti per approssimare le implementazioni dell’interfaccia privata.
  • Esporre un modo alternativo per accedere a tutti i membri esplicitamente implementati che le sottoclassi possono ignorare. Utilizzare lo stesso nome del metodo a meno che non si verifichi un conflitto.

Nei commenti nel blog di Brad è anche menzionato il coinvolgimento del pugilato quando si utilizza l’implementazione esplicita sui tipi di valore, quindi sii consapevole del costo delle prestazioni.

In parole povere, se una class eredita da 2 o più interfacce e se le interfacce hanno gli stessi nomi di metodo, la class non sa quale metodo di interfaccia viene implementato se si utilizza l’implementazione implicita dell’interfaccia. Questo è uno degli scenari in cui implementeresti esplicitamente un’interfaccia.

Implementazione implicita dell’interfaccia

public class MyClass : InterfaceOne, InterfaceTwo { public void InterfaceMethod() { Console.WriteLine("Which interface method is this?"); } } interface InterfaceOne { void InterfaceMethod(); } interface InterfaceTwo { void InterfaceMethod(); } 

Implementazione esplicita dell’interfaccia

 public class MyClass : InterfaceOne, InterfaceTwo { void InterfaceOne.InterfaceMethod() { Console.WriteLine("Which interface method is this?"); } void InterfaceTwo.InterfaceMethod() { Console.WriteLine("Which interface method is this?"); } } interface InterfaceOne { void InterfaceMethod(); } interface InterfaceTwo { void InterfaceMethod(); } 

Il seguente link ha un video eccellente che spiega questo concetto
Implementazione esplicita dell’interfaccia

C’è un altro modo per vederlo, dalla stessa implementazione labirintica, qui: http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx .

Ma in breve, l’implementazione implicita fornisce una conversione di tipo is-a, l’implementazione esplicita non sarà accessibile a meno che l’object non venga esplicitamente inserito nel tipo di interfaccia.