Grund Nr. 1
Ich neige dazu, explizite Schnittstellenimplementierungen zu verwenden, wenn ich vom "Programmieren auf eine Implementierung" abraten möchte ( Entwurfsprinzipien von Entwurfsmustern ).
Zum Beispiel, in einem MVP -basierte Webanwendung:
public interface INavigator {
void Redirect(string url);
}
public sealed class StandardNavigator : INavigator {
void INavigator.Redirect(string url) {
Response.Redirect(url);
}
}
Nun kann eine andere Klasse (z. B. eine Präsentator ) ist weniger von der StandardNavigator-Implementierung als vielmehr von der INavigator-Schnittstelle abhängig (da die Implementierung in eine Schnittstelle umgewandelt werden müsste, um die Redirect-Methode nutzen zu können).
Grund #2
Ein weiterer Grund für die Verwendung einer expliziten Schnittstellenimplementierung wäre, die "Standard"-Schnittstelle einer Klasse sauberer zu halten. Wenn ich zum Beispiel eine Klasse entwickeln würde ASP.NET Server-Kontrolle, möchte ich vielleicht zwei Schnittstellen:
- die primäre Schnittstelle der Klasse, die von Webseitenentwicklern verwendet wird; und
- Eine "verborgene" Schnittstelle, die vom Moderator verwendet wird und von mir entwickelt wurde, um die Logik des Steuerelements zu handhaben
Es folgt ein einfaches Beispiel. Es handelt sich um ein Kombinationsfeld-Steuerelement, das Kunden auflistet. In diesem Beispiel ist der Webseitenentwickler nicht daran interessiert, die Liste aufzufüllen; stattdessen möchte er nur in der Lage sein, einen Kunden nach GUID auszuwählen oder die GUID des ausgewählten Kunden zu erhalten. Ein Presenter würde das Feld beim ersten Laden der Seite auffüllen, und dieser Presenter ist durch das Steuerelement gekapselt.
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; }
}
Der Präsentator füllt die Datenquelle auf, und der Webseitenentwickler braucht von ihrer Existenz nichts zu wissen.
Aber es ist keine silberne Kanonenkugel
Ich würde nicht empfehlen, immer explizite Schnittstellenimplementierungen zu verwenden. Dies sind nur zwei Beispiele, bei denen sie hilfreich sein könnten.
0 Stimmen
Vollständigen Artikel über C#-Schnittstellen lesen : planetofcoders.com/c-schnittstellen
1 Stimmen
Ja, explizite Schnittstellen sollten vermieden werden, und ein professionellerer Ansatz wäre die Implementierung von ISP (Schnittstellentrennungsprinzip) - hier ein ausführlicher Artikel dazu codeproject.com/Artikel/1000374/
0 Stimmen
In den meisten Fällen werden Schnittstellen nicht benötigt, denken Sie darüber nach, wer Ihren Code verwendet, niemand, also verschwenden Sie keine Zeit mit dem Versuch, die besten Schnittstellen zu implementieren, Schnittstellen erhöhen nur die Komplexität des Projekts und führen zu mehr Funktionsfehlern, als es sein sollte