Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Visual C# 2011 Grundkurs

Subklassen sind Basisklassen

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Objekte von einem abgeleiteten Typ sind auch gleichzeitig vom Typ ihrer Basisklasse. Hört sich kompliziert an, ist es aber nicht! Dazu gibt?s ein Code-Beispiel.
07:48

Transkript

Wir kommen jetzt zu einem Thema, was im ersten Moment ein bisschen merkwürdig vielleicht erscheint, wenn man mit Klassen gerade erst begonnen hat. Aber auf der anderen Seite ist es eines der mächtigsten Features überhaupt, die es in der objektorientierten Programmierung gibt. Wenn man dieses Thema der "Subklassen sind Basisklassen" verstanden hat, dann hat man eigentlich ja einen der Knackpunkte der Objektorientiertheit gelöst. Bei diesem Thema geht es darum, dass abgeleitete Klassen auch vom selben Typ sind, wie von der Klasse von der sie abgeleitet sind. Was das jetzt genau heißt, schauen wir uns einmal an. Zunächst klären wir mal, was genau gemeint ist, wenn wir von Objekten und von Referenzen sprechen. Wir haben hier einen Stück Quellcode, den analysieren wir jetzt einmal schrittweise. Zunächst hier oben lege ich eine sogenannte Referenz an. Diese Referenz ist vom Typ "Person" und heißt "ich". Das sieht ungefähr so aus im Speicher. Danach gehe ich hin und reserviere Speicher für ein Objekt vom Typ Person und weisen diese Objekt der Referenz zu. Das heißt, dass diese Referenz von jetzt an auf diese Objekt zeigt, was irgendwo im Speicher ist. Immer wenn ich dann diese Referenz "ich" benutze z.B. in dieser Zeile mit "ich.name", dann greife ich in Wirklichkeit auf das Objekt zu und schreibe jetzt hier z.B. "David" rein. Das zu verstehen und das zu verinnerlichen ist ganz elementar wichtig, damit wir das Weitere jetzt hier verstehen und dass man mit Objekten und Klassen effektiv arbeiten kann. Wenn wir jetzt z.B. eine Referenz hätten vom Typ "auto", dann kann die selbstverständlich nicht auf ein Objekt der Klasse "person" zeigen. Das ginge nicht. Ist auf der einen Seite klar, aber auf der anderen Seite-- bei der nächsten Folie sehen wir, dass eine Referenz nicht immer denselben Typ haben muss, wie das Objekt, auf das es zeigt. Denn wenn ich z.B. sowas wie hier mache. Zunächst erstelle ich hier oben eine Referenz zusammen mit einem Objekt. Dann zeigt diese Referenz auf das Objekt, aber wenn jetzt z.B. die Klasse "person" von der Klasse "lebewesen" abgeleitet ist, dann ist ein Teil diese Personenobjektes gleichzeitig auch ein Objekt "lebewesen". Denn z.B. in "lebewesen" ist der Name definiert. In "person" der Nachname. D.h. dass dieses Objekt der Klasse "person" auch gleichzeitig immer ein Objekt der Klasse "lebewesen" in sich trägt. Nennen wir es mal, d.h. wenn ich jetzt mal hierhin gehe und sage, ich weise jetzt meine Referenz "ich" eine Referenz vom Typ "lebewesen" zu, dann zeigt diese Referenz "lebewesen" nicht auf das Objekt "person", sondern auf das darin enthaltene Objekt "lebewesen". Das, was dort steht, ist erlaubt, das würde kompilieren. Man muss sich an dieser Stelle bewusst machen, was genau passiert. Also noch mal. Oben haben wir eine Personenreferenz. Diese Personenreferenz zeigt auf ein Objekt vom Typ "person". Da "person" von "lebewesen" abgeleitet ist, ist das Objekt "person" quasi ein Objekt "lebewesen" enthalten. Weil wir ja die Eigenschaftenmethoden von der Klasse "lebewesen" geerbt haben usw. Wenn ich jetzt das Personenobjekt einer Lebewesenreferenz zuweise, dann zeigt diese Lebewesenreferenz auf den quasi innenliegenden Teil dieses Objekt "lebewesen" hin. Das war jetzt sehr theoretisch, aber wir schauen uns das Ganze mal in "Visual Studio" an und dann wird das Ganze ein bisschen einleuchtender. Dazu habe ich schon einmal ein bisschen Code vorbereitet. Zunächst haben wir eine Klasse "lebewesen". In dieser Klasse "lebewesen" sind Eigenschaften definiert, die eigentlich so jedes Lebewesen hat. Also Namen, Alter, ob es Hunger hat oder nicht und Energie. Zusätzlich noch eine Methode "laufe" an dieser Stelle, was die jetzt genau macht, spielt jetzt erst einmal keine Rolle. Wir klappen das mal mit einem Klick auf das Minus hier, einfach ein. Dann wird es ausgeblendet. Dann haben wir zusätzlich noch eine Klasse "person". Diese Klasse "person" ist von der Klasse"lebewesen" abgeleitet. Diese Person hat noch einen Konstruktor. Aber auch das ist jetzt erst einmal nicht wirklich relevant. Den blenden wir aus. Was relevant ist, zusätzlich hat sie eine Eigenschaft "nachname". So. Wenn wir jetzt hier in unser Main-Methode gehen, dann können wir uns von der "person" ein Objekt anlegen. "ich=new" und dann das Übliche: Mein Vorname und mein Nachname. So. Wenn ich auf diese Referenz vom Typ "person" den Punktoperator aufrufe, dann sehe ich, dass ich Zugriff habe auf die Eigenschaften aus der Basisklasse, also von "lebewesen" aber auch gleichzeitig auf die Eigenschaften der Klasse "person". Das war ja der Nachname. Ist logisch. So. Jetzt gehen wir hier mal hin und sagen, wir machen uns eine Lebewesenreferenz "leb" und weisen diese Referenz unser Personenobjekt zu. Erinnern Sie sich an die Folie, die wir gerade eben gesehen haben, jetzt zeigt diese Referenz in das Personenobjekt mehr oder weniger rein. Ich kann diesen Bereich adressieren, der in "lebewesen" definiert ist. Deshalb kann ich jetzt hier sagen "leb." und da kann ich dann auf Eigenschaften wie Alter, Energie, hat Hunger, Name und auf die Methode "laufe" zugreifen. Was ich nicht kann, das ist auf den Nachnamen zugreifen, denn der ist in dem Personenobjekt gespeichert und ich habe derzeit nur Zugriff auf die Sachen, die in dem Lebewesenobjekt sind. Und das Lebewesenobjekt ändern wir—und zwar in unserer Darstellung innerhalb vom Personenobjekt, aber unsere Referenz zeigt eben jetzt auf das Lebewesenobjekt und nicht auf das Personenobjekt. Aber sehr interessant ist, dass wir diese Informationen von diesem umgebenden Personenobjekt gar nicht verlieren. Wir können jetzt wieder hingehen und nehmen eine Personenreferenz "xyz" und weisen der diese Referenz "leb" zu. Man sieht jetzt auf den ersten Blick, wie das Ganze jetzt hier rot unterkringelt. Und das ist deshalb, weil, wenn ich ein Objekt von der Basisklasse eine Referenz von einer abgeleiteten Klasse zuweisen, dann muss ich ihm explizit, sagen - mit einem sogenannten "cast" - das er jetzt bitteschön ein Personenobjekt wird. Und wenn ich dann hier unten hingehe, kann ich mit "xyz" auf diese Werte zugreifen. Nachname. Und diese Informationen verlieren wir, wie gesagt, nicht. Wir gucken uns das mal an. Wir geben mal von "xyz" an dieser Stelle den Nachnamen aus, also das was quasi in unserer Klasse "person" definiert war. Und man könnte jetzt denken, indem ich hier von dem Personenobjekt in ein Lebewesenobjekt konvertiere, verliere ich evtl. die Information des Nachnamens, weil der ja in "person" definiert ist und wenn ich das jetzt hier wieder zurückcaste - nennt man das - dann wird diese Information wahrscheinlich immer noch weg sein. Dazu fügen wir uns noch ein Konsole "re-key" hinzu, das ist dafür da, dass sich die Konsole nicht schließt und dann testen wir das Ganze mal. Vorher schauen wir noch gerade hier drauf, das war der Nachname, den ich in meinem Personenobjekt gesetzt hatte. Wenn ich das Ganze dann ausführe, hier oben, dann sehe ich das eben dieser Name "Tielke" vorhanden ist noch. D.h. obwohl ich dieses Personenobjekt zwischendrin mal einer Referenz vom Typ "lebewesen" zugewiesen habe, ist dieses Objekt außenrum, wie wir es in unserer Darstellung hatten, immer noch da und wenn ich es zurück zur Personenreferenz caste, dann kann ich wieder auf alle Informationen zugreifen.  Wir haben uns in diesem Beispiel mal angeguckt, warum Subklassen gleichzeitig Basisklassen sind. Das ist elementar wichtig zu verstehen, um die Objektorientierung zu verstehen. Wir haben gesehen, dass wir von Objekten und Referenzen spreche, heißt das: Ich habe irgendwo eine Referenz und diese Referenz zeigt auf ein Objekt. Wenn die Klasse dieses Objektes von irgendeiner anderen Klasse abgeleitet ist, dann kann man es sich so vorstellen, als wenn dieses abgeleitete Objekt gleichzeitig noch ein Objekt von der Basisklasse enthält. Wenn ich dann dieses abgeleitete Objekt einer Basisklassenreferenz zuweise, dann zeigt diese Basisklassenreferenz nur auf das Objekt dieser Basisklasse. Die umgebenen Bereiche von der abgeleiteten Klasse sind nach wie vor noch da und auch, wenn ich später noch zurückcaste noch vorhanden, aber mit der Basisklassenreferenz kann ich natürlich nur auf die Elemente aus der Basisklasse zugreifen. Das ist, wie gesagt, am Anfang nicht ganz einfach zu verstehen. Das muss man ein paar Mal gemacht haben, muss man vielleicht verschiedene Male auch selber probiert haben. Aber wenn man das einmal verstanden hat, dann hat man einen Großteil der Objektorientiertheit durchschaut und kann sich getrost an die anderen Dinge wagen.

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!