Explicit interface implementation ne vous permet pas de spécifier des modificateurs d'accès. Lorsque vous implémentez un membre d'interface explicitement (en spécifiant le nom de l'interface avant le nom de membre), vous pouvez accéder à ce membre uniquement en utilisant cette interface. En gros, si vous le faites:
System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}
Vous ne pouvez pas faire:
MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface
Il existe plusieurs cas d'utilisation pour EII. Par exemple, vous souhaitez fournir une méthode Close
à votre classe pour libérer des ressources acquises, mais vous souhaitez toujours implémenter IDisposable
. Vous pourriez faire:
class Test : IDisposable {
public void Close() {
// Frees up resources
}
void IDisposable.Dispose() {
Close();
}
}
De cette façon, les consommateurs de la classe ne peuvent appeler directement Close
(et ils ne seront même pas voir Dispose
dans la liste IntelliSense) mais vous pouvez toujours utiliser la classe Test
où un IDisposable
devrait (par exemple dans une instruction using
).
Un autre cas d'utilisation pour EII fournit différentes implémentations d'un membre d'interface portant le même nom pour deux interfaces:
interface IOne {
bool Property { get; }
}
interface ITwo {
string Property { get; }
}
class Test : IOne, ITwo {
bool IOne.Property { ... }
string ITwo.Property { ... }
}
Comme vous le voyez, sans EII il est même pas possible à mettre en œuvre les deux interfaces de cet exemple une classe unique (car les propriétés diffèrent simplement en type de retour). Dans d'autres cas, vous pouvez intentionnellement fournir un comportement différent pour les vues individuelles d'une classe via différentes interfaces.
Ce n'est pas une raison très forte car vous devez toujours spécifier manuellement public pour tous les membres implémentés implicitement. Si tel était le cas, le compilateur pourrait automatiquement supposer ceux-ci aussi publics. –
Ceci est faux, car vous pouvez avoir des interfaces internes. –