2009-08-10 10 views

risposta

58

Il motivo di un'implementazione esplicita dell'interfaccia è evitare collisioni di nomi con il risultato finale che l'oggetto deve essere espressamente trasmesso a quell'interfaccia prima di chiamare tali metodi.

Si può pensare a questi metodi non come pubblici sulla classe, ma legati direttamente all'interfaccia. Non vi è alcun motivo per specificare pubblico/privato/protetto poiché sarà sempre pubblico poiché le interfacce non possono avere membri non pubblici.

(Microsoft ha un overview on explicit interface implementation)

+1

per l'interfaccia implicita, non è inoltre necessario specificare come pubblico, ma è consentito farlo e in realtà deve farlo. Quindi l'interfaccia che implica la logica pubblica non spiega realmente la domanda originale che vorrei dire. – liang

+0

Per le interfacce implicite, il metodo è semplicemente un metodo che potrebbe essere privato. Solo la firma lo rende un'implementazione del metodo di interfaccia. Una definizione di interfaccia esplicita non può essere altro che pubblica. Vedo il tuo punto, ma il fatto che TBH autorizzi il pubblico sui metodi impliciti probabilmente si riferisce solo all'ordine in cui il compilatore fa le cose. –

+0

'" ... poiché sarà sempre pubblico ... "'; Tecnicamente questo non è corretto, perché non è possibile chiamare la funzione esplicitamente implementata dall'esterno finché non si lancia l'oggetto per l'interfaccia. –

23

L'implementazione membro explict permettono disambiguazione dei membri di interfaccia con la stessa firma.

Senza implementazioni di membri dell'interfaccia di esplict sarebbe impossibile per una classe o una struttura avere implementazioni differenti di membri di interfaccia con la stessa firma e tipo di ritorno.

Perché l'implementazione esplicita di un'interfaccia non può essere pubblica? Quando un membro viene implementato esplicitamente, non è possibile accedervi tramite un'istanza di classe, ma solo attraverso un'istanza dell'interfaccia.

public interface IPrinter 
{ 
    void Print(); 
} 
public interface IScreen 
{ 
    void Print(); 
} 

public class Document : IScreen,IPrinter 
{ 
    void IScreen.Print() { ...} 
    void IPrinter.Print() { ...} 
} 

..... 
Document d=new Document(); 
IScreen i=d; 
IPrinter p=d; 
i.Print(); 
p.Print(); 
..... 

Le implementazioni dei membri dell'interfaccia di esplicazione non sono accessibili tramite istanze di classe o di struttura.

+9

La maggior parte delle persone non sono d'accordo con te? Lo trovo difficile da credere, considerando che è esattamente il motivo per cui esistono implementazioni esplicite dell'interfaccia. http://msdn.microsoft.com/en-us/library/ms173157.aspx –

Problemi correlati