2009-10-18 12 views
13

Warum implementieren wir zum Beispiel ICloneable oder IDisposable. Ich frage nicht, was ICloneable oder IDisposable tun, aber ich möchte lernen, was ein guter Grund ist, diese Interfaces zu implementieren, anstatt nur eine Methode zu schreiben, die unsere Objekte disponiert oder klont.Warum implementieren wir Schnittstellen?

Antwort

20

Durch die Verwendung von Schnittstellen bleibt die Verwendung dieser Funktionen konsistent. Auf diese Weise kann eine andere Klasse, die Ihre Klasse verwenden möchte/muss, als klonbares, entsorgbares Objekt agieren, ohne sich um Ihre speziellen Implementierungsdetails kümmern zu müssen.

+2

Ich dachte manchmal dasselbe, aber ich war mir nicht ganz sicher, ob es etwas anderes geben würde, aber ich hatte recht mit meinem Gedanken :) Vielen Dank. – Tarik

2

Lesen Sie unter anderem über den using Block.

+0

Ich denke, dass es für die Beseitigung der nicht referenzierten Objekte verwendet wird. Aber ich habe das nicht gefragt :) Nun danke für Ihre Zeit :) – Tarik

5

Weil Sie möchten, dass der gleiche Code für Instanzen verschiedener Klassen verwendet wird. Beispielsweise möchte eine Formularbereinigungsroutine über alle Komponenten iterieren und sie verwerfen. Dazu muss es sich auf die Komponenten über einen Typ beziehen: entweder eine gemeinsame Basisklasse oder eine Schnittstelle. Eine einzelne Vererbung bedeutet, dass eine gemeinsame Basisklasse nicht immer durchführbar ist (angenommen, mein Formular hat sowohl einen FileStream als auch einen Button - welche gemeinsame Basisklasse könnte sie haben, auf die die Aufräumroutine durch sie zugreifen würde?); daher Schnittstellen.

10

Durch die Implementierung einer bekannten Schnittstelle können Sie Polymorphie haben, mit der Sie generischen Code schreiben können, der auf jede Instanz einer Klasse einwirken kann, die eine bestimmte Schnittstelle implementiert.

Sie können die Wikipedia article on polymorphism für mehr überprüfen.

2

Phoebus gab eine gute Antwort, aber ein bisschen mehr hinzuzufügen.

Es zwingt Sie, die Methoden zu schreiben, die zum Klonen oder zur Herstellung von etwas, das entsorgt werden kann, erwartet werden. Wenn Sie nur die Methode schreiben müssten, würden Sie immer alle notwendigen Methoden einbeziehen, oder wäre die Signatur immer die gleiche?

Wenn ein neues Framework vorhanden ist und etwas hinzugefügt wird, um sicherzustellen, dass die Vorgänge korrekt ausgeführt werden, müssen Sie neue Änderungen implementieren, da Ihre Anwendung nicht mehr kompiliert wird.

2

Zusammengefasst trennt die Schnittstelle die Implementierung und definiert die Struktur, und dieses Konzept ist sehr nützlich in Fällen, in denen die Implementierung austauschbar sein soll. Abgesehen davon ist eine Schnittstelle sehr nützlich, wenn sich die Implementierung häufig ändert.

Schnittstelle kann verwendet werden, um eine generische Vorlage und dann eine oder mehrere abstrakte Klassen zu definieren, um partielle Implementierungen der Schnittstelle zu definieren.

Schnittstellen geben nur die Methodendeklaration an (implizit öffentlich und abstrakt) und können Eigenschaften enthalten (die auch implizit öffentlich und abstrakt sind). Die Schnittstellendefinition beginnt mit der Schlüsselwortschnittstelle. Eine Schnittstelle wie die einer abstrakten Klasse kann nicht instanziiert werden.

3

Um mehr Schnittstellenwissen hinzuzufügen, können Schnittstellen als Verträge zwischen Verbrauchercode und Dienstcode verwendet werden. Anstatt zu sagen, dass dies ein Objekt ist, mit dem wir es zu tun haben werden, mit Schnittstellen, die die Übereinstimmung ist, sieht das Objekt aus, das ich zurückgebe.In Code, könnte es so etwas wie:

Servicecode

public IEnumerable<int> GetNumbers(){ return new []{1,2,3,4,5}; } 

Client-Code:

var result = serviceProxy.GetNumbers(); 

Hier ist der Code-Dienst kann Implementierung ändern jede Klasse zurückzugeben, ohne zu brechen Client-Code IEnumerable erfüllt .

Neben all dem haben Sie weitere Anwendungen wie IoC DI, Unit Testing, Object Mocking. All dies ernten Vorteile der polymorphen Güte.

2

Eine Schnittstelle trennt, was getan wird, wie es gemacht wird. Clients befassen sich mit dem Schnittstellentyp, ohne zu wissen, was die Implementierungsklasse ist, da sie sich auf den durchgesetzten Vertrag verlassen können.

Dies ist wichtig für Situationen, in denen dynamische Proxies generiert werden. Kunden müssen nicht wissen, dass sie mit einem Proxy arbeiten, was Ihnen die Freiheit gibt, das gewünschte Verhalten zu injizieren. Es ist eine gängige Technik für die aspektorientierte Programmierung.

Verwandte Themen