Explicit interface implementation non consente di specificare alcun modificatore di accesso. Quando si implementa esplicitamente un membro dell'interfaccia (specificando il nome dell'interfaccia prima del nome del membro), è possibile accedere a quel membro utilizzando solo tale interfaccia. In sostanza, se si fa:
System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}
non si può fare:
MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface
Ci sono diversi casi di utilizzo per EII. Ad esempio, si desidera fornire un metodo Close
per la classe per liberare risorse acquisite ma si desidera comunque implementare IDisposable
. Si potrebbe fare:
class Test : IDisposable {
public void Close() {
// Frees up resources
}
void IDisposable.Dispose() {
Close();
}
}
In questo modo, i consumatori della classe possono chiamare solo Close
direttamente (e non saranno nemmeno vedere Dispose
nella lista Intellisense), ma è comunque possibile utilizzare la classe Test
ovunque ci si aspetta un IDisposable
(ad esempio in una dichiarazione using
).
Un altro caso d'uso per EII sta fornendo diverse implementazioni di un membro di interfaccia lo stesso nome per due interfacce:
interface IOne {
bool Property { get; }
}
interface ITwo {
string Property { get; }
}
class Test : IOne, ITwo {
bool IOne.Property { ... }
string ITwo.Property { ... }
}
Come si vede, senza EII E 'nemmeno possibile implementare entrambe le interfacce di questo esempio in una singola classe (poiché le proprietà differiscono solo nel tipo restituito). In altri casi, potresti volere intenzionalmente fornire un comportamento diverso per le singole visualizzazioni di una classe attraverso interfacce diverse.
fonte
2009-07-03 05:01:17
Questo non è un motivo molto forte, poiché è ancora necessario specificare manualmente il pubblico per tutti i membri implementati implicitamente. Se così fosse, il compilatore potrebbe automaticamente assumere anche quelli pubblici. –
Questo è sbagliato, dal momento che è possibile avere interfacce interne. –