2009-12-03 8 views

risposta

8

(personalmente) Vedo solo la necessità di implementazioni esplicite quando c'è uno scontro tra metodi con la stessa firma.

Ad esempio, quando si implementa IEnumerable<T>, è necessario implementare 2 metodi GetEnumerator() che hanno la stessa firma, ad eccezione del tipo restituito. Quindi si dovrà implementare IEnumerable.GetEnumerator() esplicitamente:

public abstract class MyClass<T> : IEnumerable<T> 
{ 
    public IEnumerator<T> GetEnumerator() 
    { 
     return ...; 
    } 

    IEnumerator IEnumerable.GetEnumerator() // explicit implementation required 
    { 
     return GetEnumerator(); 
    } 
} 

Un altro uso per un'implementazione esplicita è che se non si desidera che il metodo da chiamare attraverso un'istanza di un oggetto, ma solo attraverso un'interfaccia. Personalmente ritengo che questo non abbia molto senso, ma in alcuni casi molto rari, può essere utile.

3

La risposta di Philippe è una soluzione pratica, tuttavia esistono anche considerazioni di architettura.

Le interfacce vengono utilizzate per rendere le classi compatibili in modo che possano essere utilizzate da altri oggetti. Se solo gli utenti che consumano gli oggetti hanno bisogno della funzionalità dell'interfaccia, allora dovrebbe essere limitato in questo modo dal principio del minimo privilegio. Se non fosse necessario esporre tale metodo di interfaccia a tutti gli altri utenti della classe.

Paul

+0

Riesci a pensare a un esempio in cui questo potrebbe essere applicato? – jasonh

+0

Web dev. Se una classe è progettata per fornire servizi attraverso il web, ci possono essere metodi per dire la verifica dell'identità in un'interfaccia di sicurezza che può essere utilizzata in nessun'altra circostanza (localmente). Questa è una caratteristica C# poco conosciuta che penso sia spesso ignorata. Altri esempi là fuori? – Paul

1

Un altro caso per le interfacce esplicite è dove l'oggetto deve implementare un'interfaccia per accettare le chiamate da un oggetto interno, ma non si vuole esporre quelli come parte della vostra API.

Problemi correlati