Visual C# 2011 Grundkurs

Interfaces

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Interfaces bieten in C# die Möglichkeit, "Verträge" zu formulieren. Diese Verträge sagen nur aus, dass eine Funktionalität angeboten werden muss, allerdings nicht, auf welche Weise. Hier die Erläuterung!
10:18

Transkript

Wenn man in 2 oder mehreren Klassen gemeinsame Elemente findet, kann man diese Elemente in eine Basisklasse auslagern und die Klassen davon ableiten lassen. Dann kann ich diese Elemente der Basisklasse in den abgeleiteten Klassen nutzen. Das Konzept nennt sich "Vererbung". Manchmal möchte man ein ähnliches, aber etwas anderes Verhalten haben. Man möchte Verträge definieren - Verträge über Funktionalitäten - und bestimmte Klassen können diese Verträge dann unterzeichnen und verpflichten sich dann, diese Funktionalitäten anzubieten. Wie sie die anbieten, ist erst einmal vollkommen egal. Wie man so etwas mit Interfaces löst, schauen wir uns jetzt an: Diese Verträge sind erst nur reine Verträge über Funktionalitäten. Über Funktionalitäten heißt, dass wir einfach nur sagen: Die Klasse muss eine Funktionalität anbieten, die das und das beschreibt. Wie diese Funktionalität intern implementiert wird, steht in diesem Vertrag nicht drin. Allerdings, wenn die Klasse diesen Vertrag unterzeichnet, muss sie auf jeden Fall diese Funktionalität anbieten. Wir machen das Ganze an einem Beispiel: Wir haben einen Vertag und der heißt "Beschreibbar". In dem Vertrag steht: Die Klasse muss eine Eigenschaft "Beschreibung" enthalten, die einen String zurückgibt. Punkt, mehr nicht. Wir sagen nicht, wie diese Beschreibung bzw. der String, der zurückgegeben wird, genau auszusehen hat. So einen Vertrag können ganz unterschiedliche Arten von Klassen implementieren. Man kann z.B. sagen: Die Klasse "Hund" und die Klasse "Mensch" können diesen Vertrag unterzeichnen. Einen Mensch kann man beschreiben und einen Hund kann man beschreiben. Jetzt könnte man sagen: Gut, dann könnte man diese Eigenschaft "Beschreibbar" aber auch in die gemeinsame Basisklasse auslagern, "Lebewesen" z.B. Es gibt aber noch ganz andere Objekte, die beschreibbar sind: z.B. ein LKW, ein Baum, ein Haus, eine Wolke oder was auch immer. Das alles mit Basisklassen zu lösen, ist zu komplex. Komplex deshalb, weil man dann eine große gemeinsame Klasse haben müsste, von der alle möglichen erdenklichen Klassen ableiten können, die in irgendeiner Art und Weise beschreibbar sind. Nun sind manche Klassen aber schon von einer bestehenden Klasse abgeleitet. Eine Eigenschaft von C# ist, dass man eine Klasse in C# nur von einer einzigen Klasse ableiten kann und nicht von mehreren Klassen. Zusätzlich ist dieser Beschreibungs-String, der da drin ist, gar nicht genauer definiert wie er auszusehen hat, weil es eben ein Vertrag ist. So einen Vertrag definiert man in C# mit Interfaces. Auf der linken Seite haben wir unseren Vertrag. Wie gesagt, die Rahmenbedingungen haben wir erklärt und dazu bauen wir uns jetzt so ein Interface. Um diesen Vertrag zu visualisieren, einigen wir uns auf die folgenden Notationen: Wir haben wieder ein Rechteck. In diesem Rechteck steht oben der Name des Interfaces. Ein Interface in C# sollte immer mit dem Großbuchstaben "I" beginnen, damit man direkt sieht: Aha, hier handelt es sich um ein Interface. Darunter steht, dass es ein Interface ist. Dann haben wir die Eigenschaft "Beschreibung". Die Eigenschaft "Beschreibung" hat nur einen get-Bereich, keinen set-Bereich und liefert einen String zurück. Kein set-Bereich deshalb, weil der Vertrag nur sagt, er muss eine Beschreibung zurückgeben können, nicht, dass er auch eine setzen muss; deshalb nur der Getter. Wenn wir dieses Interface jetzt in C# haben, kann eine Klasse sagen: Diesen Vertrag, den dieses Interface beschreibt, möchte ich jetzt gerne unterzeichnen. Bei C# nennt man das: Die Klasse möchte dieses Interface implementieren. Das sieht so aus: Wir haben die Klasse "Person" und oben auf der Klasse "Person" sieht man einen kleinen Lollipop. Das heißt, dass diese Klasse ein Interface implementiert und rechts daneben steht: Es ist dieses "IBeschreibbar". Ganz wichtig bei den Interfaces ist wieder die Tatsache, dass Subklassen auch Basisklassen sind. Wenn wir im Quellcode eine Personenreferenz haben und dem ein Personenobjekt zuweisen, dann haben wir an dieser Stelle so eine Konstellation. Links ist die Referenz und die zeigt auf das Objekt "Person". Dieses Objekt "Person" hat jetzt einen Teilbereich, also ein Teil von diesem Objekt hat jetzt den Bereich "Beschreibung". Dieser Bereich "Beschreibung" kommt aus dem Interface. Das heißt, dass es jetzt ohne Weiteres möglich ist, in der 2. Zeile eine Referenz anzulegen vom Typ "IBeschreibbar", und dem die Referenz von unserem Personenobjekt zuzuweisen. Dann allerdings kann ich mit dieser Referenz von "IBeschreibbar" nur auf den Bereich in meinem Objekt zugreifen, der in diesem Interface "IBeschreibbar" definiert ist, eben auf diese Beschreibung. Hier demonstrieren wir das einmal an einem relativ praktischen Beispiel: Wir haben eine Klasse "Person", eine Klasse "Auto", beide implementieren dieses Interface "IBeschreibbar" und wir erstellen von beiden Klassen jeweils ein Objekt: "Ich" und "Auto". Am unteren Bereich haben wir eine Methode "Drucke". Diese Methode "Drucke" bekommt ein Objekt übergeben und dieses Objekt ist vom Typ "IBeschreibbar". Unten geben wir dann mit "Console.WriteLine" diese Beschreibung aus. Wenn ich diese beiden Objekte oben ausgeben will, kann ich das mit dieser Methode "Drucke" machen, weil diese Methode "Drucke" ein Objekt vom Typ "IBeschreibbar" erwartet. Beide Objekte implementieren dieses Interface, also sind sie auch gleichzeitig Objekte von "IBeschreibbar". Damit kann ich das dann ganz einfach ausgeben. Man muss jetzt aber immer aufpassen, wenn man von Objekten von "IBeschreibbar" redet,  das ist so nämlich nicht ganz richtig. Von Interfaces selber kann man keine Objekte erstellen. Interfaces sind einfach nur Verträge. Verträge werden von Klassen implementiert, aber man kann von ihnen keine Objekte erstellen, weil es davon z.B. keinen Constructor gibt. Das Ganze schauen wir uns jetzt in einem ebenso praktischen Beispiel wie gerade in Visual Studio an: Ich habe hier in Visual Studio schon ein bisschen Code vorbereitet. Ich habe jetzt das gemacht, was Sie nach Möglichkeit nicht machen sollen: ich habe mehrere Klassen - und vor allen Dingen auch ein Interface - zusammen in eine Datei gepackt. Das dient jetzt nur der Übersichtlichkeit, weil sonst einfach zu viele Dateien da wären. Zunächst haben wir eine Klasse "Auto" - jetzt ohne großartige Implementierung, die denken wir uns einfach dazu - und wir haben eine Klasse "Flasche", also eine Glasflasche, eine Plastikflasche, was auch immer Sie möchten. Wenn man da nach Gemeinsamkeiten suchen würde, wäre es relativ schwierig. Aber eine Eigenschaft haben sie schon gemeinsam: Beide von diesen Objekten sind zerstörbar. Man könnte eine Flasche zerstören und man könnte auch ein Auto zerstören. Deshalb haben wir hier oben einen Vertrag und dieser Vertrag heißt "IZerstörbar". "IZerstörbar" zwingt die Klasse, die diesen Vertag implementiert, also die, die das Interface implementiert, dazu, diese Methode hier anzubieten: "Zerstöre". Wir machen das jetzt einmal: Wir implementieren beide Interfaces. Das macht man wie beim Ableiten durch so einen Doppelpunkt. Wenn wir dieses Interface implementieren, sieht man hier schon an so einem Smart Tip, dass Visual Studio uns hier helfen möchte und sagt: "Diese IZerstörbar-Schnittstelle implementieren", denn wenn die Klasse das Interface implementiert, muss es auch die im Interface vorgeschriebenen Methoden und Eigenschaften implementieren. Das machen wir einmal und hier wurde das Interface dann implementiert. Dasselbe machen wir hier auch noch einmal: "IZerstörbar", hier wieder den Smart Tip und implementieren das Interface. Hier schreiben wir jetzt einfach rein mit: "Console.WriteLine("Auto zerstört")" und in der Flasche schreiben wir ebenfalls, dass diese Flasche zerstört wurde. Jetzt haben wir hier unten neben unserer Main-Methode noch eine 2. Methode, das ist unser Shredder. Shredder möchten von Natur aus gerne irgendetwas zerstören. Die können auch irgendetwas zerstören und hier unten bekommen sie ein zerstörbares Objekt übergeben, das sie dann zerstören können. Zum einen wird hier oben ausgegeben: "Zerstöre Objekt". Machen wir noch ein paar Punkte dahinter, damit es aussieht, als wenn es gerade dabei wäre. Dann gehen wir unten hin und rufen jetzt auf dieses Objekt die Zerstörer-Methode auf, denn das ist ja in diesem Interface implementiert. Deswegen kann ich das bei dieser "IZerstörbar-Referenz" auslösen. Jetzt gehe ich hier oben hin und in der Main-Methode lege ich ein Auto an: "new Auto". Und ich lege eine Flasche an: "= new Flasche". Beide Objekte schmeiße ich jetzt hier in unseren Shredder rein, zunächst das Auto und danach nehmen wir die Flasche. Da oben habe ich mich verschrieben, und dann passt es hier auch mit der Flasche. Wir führen das Ganze einmal wieder im Debugger aus, um uns anzugucken wie das Ganze funktioniert. Als Erstes gehen wir oben über diese beiden Zeilen, da stehen diese Objekte, einmal ein Auto und eine Flasche, und danach schmeißen wir das Ganze in den Shredder. Das können wir jetzt hier machen, also die Methode aufrufen, die ein Parameter von "IZerstörbar" war, weil unsere Auto-Klasse das Interface implementiert, und damit das Objekt "Auto" auch gleichzeitig die Funktionalität innehat, die "IZerstörbar" beschreibt. Also gehen wir hier mit F11 rein. Hier sieht man schon, dass hier ein Objekt drin ist. Man sieht, das dieses Objekt ursprünglich einmal ein Auto war. Hier gehe ich dann hin, gebe aus, dass ich das Objekt zerstöre und hier rufe ich jetzt auf dem Objekt "Zerstöre" auf. Obwohl es jetzt ein "IZerstörbar-Objekt" ist: Sobald ich "Zerstörer" aufrufe, springt er oben in die Klasse "Auto" rein. Hier kann ich jetzt quasi den Text ausgeben, der ausgegeben wird, wenn ein Auto zerstört wird. Und wenn ich hier die Flasche in den Shredder schmeiße, dann wird hier auf dieses Flaschen-Objekt "Zerstörer" aufgerufen, und dann springt er hier oben rein und zerstört die Flasche auf die Art und Weise, wie eine Flasche nun einmal zerstört wird. Wir haben uns in diesem Film noch einmal angeschaut, wie man solche Verträge in C# umsetzen kann. Wenn ich Verträge, also Interfaces, in C# definiere, dann benutze ich das Schlüsselwort "Interface", dann den Interface-Namen und stelle dem ein "I" voraus. Das ist wieder so eine Namenskonvention, die sich in .NET mehr oder weniger etabliert hat. Danach gebe ich diese Dinge an, die dieses Interface implementieren muss. Allerdings gebe ich dort immer - z.B. für die Methode - nur die Methodensignatur an, aber keine Implementierung, weil hier geht es um einen Vertrag; und ein Vertrag sagt nur, wie das Ganze aussehen muss und nicht, wie das Ganze umgesetzt wird. Dann implementiere ich diese Verträge in den Klassen und diese Klassen verpflichten sich dann dazu, diese Methoden oder Eigenschaften anzubieten. Wenn ich die dann implementiert habe, kann ich dieses Objekt einer Klasse in eine Interface-Referenz casten oder umwandeln. Dann kann jedes Objekt, dass dieses Interface implementiert hat, auch gleichzeitig an Stelle des Interfaces treten und z.B. bei solchen Methodenaufrufen übergeben werden.

Visual C# 2011 Grundkurs

Steigen Sie in die C#-Programmierung ein und lernen Sie sowohl die Grundlagen der Sprache C# als auch die Entwicklungsumgebung Visual Studio 2010 und .NET-Framework kennen.

7 Std. 28 min (81 Videos)
Derzeit sind keine Feedbacks vorhanden...
Hersteller:
Software:
Visual Studio Visual Studio 2010
Exklusiv für Abo-Kunden
Erscheinungsdatum:27.06.2011

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!