Raison n ° 1
J'ai tendance à utiliser d'interface explicite de mise en œuvre lorsque je veux décourager "la programmation pour une mise en œuvre" (http://www.artima.com/lejava/articles/designprinciples.html).
Par exemple, dans un titre de MVP à base de web app
public interface INavigator {
void Redirect(string url);
}
public sealed class StandardNavigator : INavigator {
void INavigator.Redirect(string url) {
Response.Redirect(url);
}
}
Maintenant, une autre classe (par exemple en tant que présentateur) est moins susceptible de dépendre du StandardNavigator la mise en œuvre et plus susceptibles de dépendre de la INavigator interface (depuis la mise en œuvre devra être exprimées à une interface de rendre l'utilisation de la méthode de Redirection).
Raison n ° 2
Une autre raison, j'irai peut-être avec une interface explicite la mise en œuvre serait de garder une classe "par défaut" de l'interface plus propre. Par exemple, si je développais une ASP.NET contrôle de serveur, je pourrais avoir besoin de deux interfaces:
- La classe principale de l'interface, qui est utilisé par la page web des développeurs; et
- "Caché" de l'interface utilisée par le présentateur que je développe pour prendre le contrôle de la logique
Voici un exemple simple. C'est une zone de liste modifiable listes de clients. Dans cet exemple, la page web du développeur n'est pas intéressé dans le remplissage de la liste; au lieu de cela, ils veulent juste être en mesure de sélectionner un client par le GUID ou pour obtenir le client sélectionné est GUID. Un présentateur permettraient d'alimenter la boîte sur le premier chargement de la page, et ce présentateur est encapsulé par le contrôle.
public sealed class CustomerComboBox : ComboBox, ICustomerComboBox {
private readonly CustomerComboBoxPresenter presenter;
public CustomerComboBox() {
presenter = new CustomerComboBoxPresenter(this);
}
protected override void OnLoad() {
if (!Page.IsPostBack) presenter.HandleFirstLoad();
}
// primary interface used by web page developers
public Guid ClientId {
get { return new Guid(SelectedItem.Value); }
set { SelectedItem.Value = value.ToString(); }
}
// "hidden" interface used by presenter
IEnumerable<CustomerDto> ICustomerComboBox.DataSource { set; }
}
Le présentateur remplit la source de données, et la page web du développeur n'a jamais besoin d'être conscient de son existence.
Mais Ce n'est Pas un Argent Boulet de canon
Je ne recommanderais pas toujours employant explicite des implémentations d'interface. Ce sont juste deux exemples où ils pourraient être utiles.