Jeder echte Beispiel für die Verwendung der Schnittstelle mit mehreren Vererbung
Ich m versuchen zu verstehen, Schnittstellen, so dass ich diese auch umsetzen in meinen Programmen, aber ich m nicht in der Lage, sich vorzustellen, wie sollte ich Sie nutzen.
Auch geben Sie mir einige zB der mit Ihnen, mit Mehrfachvererbung in C#
- Es gibt keine solche Sache wie eine multiple Vererbung in C#. Sie können nur ableiten von einer Klasse, aber Sie implementieren können, so viele Schnittstellen, wie Sie möchten.
- Gut, das implementieren von Schnittstellen angesehen werden können, da die mehrfache Vererbung von Schnittstelle, aber nicht die Umsetzung. Es ist eine Grauzone.
- Da eine Schnittstelle mit Schwerpunkt auf der Interaktion, mehr die Umsetzung, ich kann sehen, warum Sie so denken. Ich habe öfter gehört, es erklärt die Art und Weise @dsimcha kommentierte obwohl, also ich war nicht verwirrt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein gutes Beispiel für eine Schnittstelle ist ein repository-pattern. Ihre Schnittstelle definieren Methoden wie Get, GetAll, Update, Delete, etc. Keine Implementierung, nur Signaturen von Funktionen.
Dann können Sie schreiben, eine "konkrete" Implementierung der Klasse zur Arbeit mit, sagen wir, MySQL. Ihre Benutzeroberfläche sollte beziehen sich nur auf die Schnittstelle, aber.
Später, wenn Sie sich entscheiden, zu ändern, zu Microsoft SQL, schreiben Sie eine weitere konkrete Umsetzung, aber Ihre UI-code nicht zu ändern (viel).
Mehrfachvererbung existiert nicht in C#, in dem Sinne, dass Sie nur Erben aus einer 'konkreten' Klasse; obwohl Sie Erben kann (oder 'wenden'), so viele Schnittstellen, wie Sie wollen.
Schreibe ich ein video-Spiel. In diesem video-Spiel, das ich für die verschiedenen Kräfte, um Objekte im Spiel. Schub Kräfte, Kräfte, Gravitationskräfte. Sie werden zwar unterschiedlich berechnet, Sie haben alle den gleichen grundlegenden Elementen. Muss ich anrufen eine update-Funktion, die wird die Bewertung der Kraft, und fügen Sie die Kraft auf das Objekt, das es angefügt wurde.
So, was ich getan habe ist, erstellen Sie ein IForce-interface, das eine update-Funktion für seine Unterschrift. Alle meine Kräfte, die diese Schnittstelle implementieren:
Hier ist eine Beispiel-Implementierung.
Die update-Funktion hat eine vereinfachte spring force update zu machen, es leichter zu verstehen.
Hilft dies in ein paar Möglichkeiten.
Ich kann völlig verändern die Art und Weise wird eine Kraft berechnet, ohne Einfluss auf andere Teile von meinem code. Ich Mach das die ganze Zeit. Entlang den gleichen Linien, ist es rediculously einfach für mich, um neue Kräfte. Solange es implementiert die IForce-interface, ich weiß, es wird Masche auch mit meinem vorhandenen code.
Anderen Weg, es hilft bei der Handhabung einer großen Anzahl von Kräften. Ich habe eine Kraft, die Registrierung, die eine Liste von IForce. Da alle Kräfte implementieren, die Schnittstelle und haben eine Update-Funktion ist es sehr einfach zu aktualisieren, alle Kräfte in meinem Spiel. Wenn ich die Kraft, die ich zur Liste hinzufügen. Dann habe ich eine Schleife durch die Liste und rufen Sie die einzelnen Elemente update-Funktion, ohne sich Gedanken über welche Art von Kraft es ist, und alle meine Kräfte update.
Ich die Verwendung von Schnittstellen, die jeden Tag in vielen verschiedenen Situationen. Sie sind fantastisch!
Hinweis :die Schnittstelle wird verwendet, um zu beschränken und den Zugriff auf die Methoden oder Ereignisse usw. von verschiedenen Klassen um jeden Preis, Es bedeutet, dass wir viele mehr Methoden innerhalb einer Klasse, aber wenn wir das aufrufen von Methoden durch das Interface heißt, wir wollen nur andere als eingeschränkte Methoden. In der folgenden Programm User1 verwenden können, Lesen & Schreiben, aber User2 können Schreiben und Ausführen. Dieses Programm finden Sie unten.........
Ausgabe:
Schnittstellen definieren Sie einfach eine Vertrag der öffentlichen Elemente (z.B. Eigenschaften, Methoden, Ereignisse) für das Objekt, nicht Verhalten.
UPDATE
In der "realen Beispiele" verwende ich interfaces mit:
- Unit Testing
- GENERIKA (z.B. Repository -, Gateway-Einstellungen)
Hier ist ein (in Java, aber das ist nicht wichtig, denn Sie sind ähnlich):
In meinem Projekt habe ich erstellt einfache Schnittstelle:
Einfachen Ersatz für einige Arten von Anmerkungen. Der nächste Schritt: ich habe alle entity-Klassen dieses interface implementieren.
Der Dritte Schritt ist, zu schreiben, syntax-Zucker-ähnliche Methoden:
Dies war nur ein Beispiel.
Den komplexeren Beispiel ist so etwas wie die Validierung Regeln: Sie haben einige validation engine (wahrscheinlich von Ihnen geschrieben) und eine einfache Schnittstelle für diese Regel:
So, in diesem Motor erfordert, die Regeln umgesetzt werden, indem Sie. Und natürlich gibt es auch Mehrfachvererbung, da Sie sicherlich wollen mehr als eine einzige Regel.
Mehrfache Vererbung ist über eine Klasse verwendbar, in mehreren Situationen: [pseudo-code]
Die Idee ist, dass Sie Ihre Circle-Klasse implementiert zwei verschiedene Schnittstellen, die verwendet werden, in sehr unterschiedlichen Situationen.
Manchmal zu Abstrakt wird nur in der Weise und mit Bezug auf die Einzelheiten der Implementierung tatsächlich klärt die Dinge. Daher werde ich die in der Nähe der Metall-Erläuterung von Schnittstellen, machte mich endlich verstehen Sie.
Schnittstelle ist nur ein Weg, zu erklären, daß eine Klasse implementiert einige virtuelle Funktionen sind und wie diese virtuelle Funktionen ausgelegt sein sollte in der Klasse vtable. Wenn Sie deklarieren Sie ein interface, Sie sind im wesentlichen eine high-level Beschreibung eines virtual-function-Tabelle, die für den compiler. Wenn Sie eine Schnittstelle implementieren, sagen Sie dem compiler, dass die vtable bezeichnet, die Schnittstelle in Ihrer Klasse.
Den Zweck von interfaces ist, dass Sie implizit cast eine Klasse implementiert die Schnittstelle, die ich an eine Instanz der Schnittstelle I:
Die einfache Antwort, meiner Meinung nach, und etwas neues zu interfaces selbst ist, die Implementierung einer Schnittstelle in einer Klasse bedeutet im wesentlichen: "Diese Klasse definieren MÜSSEN, die Funktionen (und die Parameter) in die Schnittstelle".
Aus, dass, folgt, dass, wenn eine bestimmte Klasse, die die Schnittstelle implementiert, können Sie sicher sein, Sie sind in der Lage, die Funktionen aufgerufen.
Wenn mehrere Klassen, die sonst anders implementieren die gleiche Schnittstelle, können Sie 'Stimmen' Sie alle in die Schnittstelle, und rufen Sie alle interface-Funktionen auf Sie, die könnte verschiedene Auswirkungen haben, da jede Klasse eine andere Implementierung der Funktionen.
Zum Beispiel, ich habe ein Programm erstellt, welches es ermöglicht, einen Benutzer zu generieren 4 verschiedene Arten von Karten. Für die, die ich angelegt habe 4 verschiedene Art von generator-Klassen. Sie alle implementieren das "IGenerator" - Schnittstelle wenn:
Erzählt, die Sie zum definieren von mindestens einem "öffentlichen generateNow(int Zeit)" - Funktion.
Was auch immer-generator, die ich ursprünglich hatte, nachdem ich warf es auf ein "IGenerator", die ich anrufen kann "generateNow(4)" auf. Ich will nicht, um sicher zu sein, welche Art von generator kehrte ich zurück, was im wesentlichen bedeutet, nicht mehr "variable instanceof-Class1", "variable instanceof Class2" etc. in eine gigantische if-Anweisung nicht mehr.
Werfen Sie einen Blick auf etwas, das Sie sind vertraut mit - ie eine Liste der Sammlung in C#. Listen definieren, die die IList-Schnittstelle, und generische Listen definieren, die die IList-Schnittstelle. IList stellt Funktionen wie Hinzufügen, Entfernen, und die Liste implementiert diese Funktionen. Es gibt auch BindingLists, die IList implementieren, die in einer etwas anderen Weise.
Ich würde auch empfehlen,Head First Design Patterns. Die code-Beispiele in Java, sind aber leicht übersetzt in C#, plus, Sie wird Ihnen die wahre Leistungsfähigkeit von Schnittstellen und design-patterns.