4 Stimmen

Was ist der Vorteil der Verwendung von Interface?

Welchen Nutzen hat die Verwendung von Interface?

Ich habe gehört, dass es anstelle von Mehrfachvererbung verwendet wird und dass man damit auch Daten verstecken kann.

Gibt es noch andere Vorteile, wo werden Schnittstellen verwendet, und wie kann ein Programmierer erkennen, dass eine Schnittstelle benötigt wird?

Was ist der Unterschied zwischen explicit interface implementation y implicit interface implementation ?

5voto

ray Punkte 8301

Um die Frage implizit/explizit zu klären, nehmen wir an, dass zwei verschiedene Schnittstellen die gleiche Deklaration haben:

interface IBiographicalData

    {
       string LastName
       {
          get;
          set;
       }

    }

    interface ICustomReportData
    {
       string LastName
       {
          get;
          set;
       }
    }

Und Sie haben eine Klasse, die beide Schnittstellen implementiert:

class Person : IBiographicalData, ICustomReportData
{
    private string lastName;

    public string LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }
}

Klasse Person Implizit beide Schnittstellen implementiert, da Sie mit dem folgenden Code die gleiche Ausgabe erhalten:

Person p = new p();
IBiographicalData iBio = (IBiographicalData)p;
ICustomReportData iCr = (ICustomReportData)p;

Console.WriteLine(p.LastName);
Console.WriteLine(iBio.LastName);
Console.WriteLine(iCr.LastName);

Allerdings müssen ausdrücklich implementieren, können Sie die Klasse Person wie folgt ändern:

class Person : IBiographicalData, ICustomReportData
{
    private string lastName;

    public string LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }

    public string ICustomReportData.LastName
    {
        get { return "Last Name:" + lastName; }
        set { lastName = value; }
    }
}

Jetzt der Code:

Console.WriteLine(iCr.LastName);

Wird mit "Nachname:" vorangestellt.

http://blogs.msdn.com/b/mhop/archive/2006/12/12/implicit-and-explicit-interface-implementations.aspx

2voto

StuperUser Punkte 10141

Schnittstellen sind sehr nützlich für

  • Injektion von Abhängigkeiten
  • Umkehrung der Kontrolle
  • Test Isolierung

1voto

James Gaunt Punkte 14441

Eine Schnittstelle trennt einfach die Beschreibung einer Klassen-API von deren Implementierung. Es geht um die Trennung von Belangen, die für jedes robuste Softwareprojekt grundlegend ist. Sie können die implementierenden Klassen ersetzen, ohne anderen Code zu verändern.

Ein Bereich, in dem dies besonders hilfreich ist, sind die Unit-Tests, da Sie damit die Schnittstellen, die Sie nicht als Teil eines bestimmten Testfalls testen wollen, ausspotten können.

Wenn völlig unverbundene Klassen dieselbe Schnittstelle implementieren, können Sie auch Methoden schreiben, die auf verschiedene Klassen in verschiedenen Hierarchien wirken können (d.h. keinen gemeinsamen Vorfahren außer object), ohne dass sie object als Typ annehmen müssen. Sie können zum Beispiel eine Methode schreiben, die IEnumerable annimmt und ihr List, Array usw. übergeben. Ohne Schnittstellen oder einen gemeinsamen Basistyp wäre dies nicht möglich (außer durch Casting von object).

1voto

XIVSolutions Punkte 4332

In den grundlegendsten Begriffen kommen wir zurück zum OOP 101:

Vererbung: Objekt B "ist" ein Typ von Objekt A. Die von Objekt A implementierten Verhaltensweisen und Methoden werden von Objekt B geerbt, und zwar mit allen Implementierungen (mit etwas Spielraum für Overriding).

Schnittstelle: Objekt A und Objekt B "verhalten sich wie" Beispiele eines abstrakten Objekts, das durch eine gemeinsame Schnittstelle dargestellt wird. James Gaunt verwendet das obige Beispiel von Ienumerable. Andere Beispiele könnten IPrintable, IDisposable, etc. sein.

Für jede beliebige Klasse, die diese Schnittstellen implementiert, kann die Implementierung sehr unterschiedlich sein (denken Sie daran, wie Sie IDisposable in verschiedenen Klassen implementieren, die eine Dispose-Methode verwenden). Der Client-Code braucht jedoch nicht zu wissen oder sich darum zu kümmern, was der eigentliche Typ des Objekts ist - der Code kann einfach über die Schnittstelle auf die gewünschten Eigenschaften und Methoden zugreifen.

Vererbung wird oft als "magische" Antwort auf eine Vielzahl von Programmierproblemen angesehen, wird aber auch häufig als Mittel missbraucht, um das Schreiben von mehr Code zu vermeiden. Ich stimme nicht mit user492238 überein, dass Dinge, die mit Interfaces gemacht werden, genauso gut durch Vererbung erledigt werden können. Mit einem solchen Ansatz wird man oft in die Enge getrieben. Und, wie Jodrell bemerkt, ist Mehrfachvererbung kein Merkmal von .net (und das meiner Meinung nach zu Recht).

Wenn Sie dasselbe Verhalten in mehreren (oder vielen) ansonsten nicht verwandten Klassen implementieren müssen, sollten Sie eine Schnittstelle definieren, die die API für dieses Verhalten bereitstellt. Sie haben vielleicht mehrere Klassen: Person, Tier, Gebäude, usw. Alle benötigen möglicherweise eine Methode, um eine druckbare Ausgabe zu liefern. Sie können auch eine Methode haben, die IPrintableObject als Parameter akzeptiert. In diesem Fall können Sie IPrintableObject in jeder der zu druckenden Klassen implementieren, den Implementierungscode in jedem dieser Objekte bereitstellen und sie an den Client-Code weiterleiten.

0voto

user492238 Punkte 4024

Die meisten - wenn nicht sogar alle - Dinge, die mit Schnittstellen erledigt werden können, können genauso gut über Vererbung erledigt werden. Schnittstellen können verwendet werden, um ein Klassendesign mit abstrakten Basisklassen zu ersetzen. Was man vorzieht, ist meist eine Frage der persönlichen Erfahrung und des Geschmacks. (Natürlich gibt es Leute, die sehr strenge Regeln aufstellen, wann das eine dem anderen vorzuziehen ist).

Und es gibt Frameworks (oft in Verbindung mit DI-Containern), die Sie zur Verwendung von Schnittstellen zwingen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X