Swift 2 lernen

Vererbung: Wesentliches Paradigma der objektorientierten Programmierung

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Alles, was an einer Klasse mit viel Mühe und Testaufwand bereits realisiert wurde, kann anderen Klassen vererbt werden. So profitieren neue Klassen von einer starken Basis.
12:27

Transkript

In diesem Video beschäftigen wir uns mit der Vererbung, also einem objektorientierten Prinzip hier in der Programmierung, und wir wollen eine Klasse schaffen, die Eigenschaften einer anderen Klasse erbt. Dazu erzeugen wir uns einen neuen Playground, das ist dann unsere "Vererbung", und auch diese legen wir einfach im Projektordner ab, und können uns dann hier gleich mit diesem spannenden Konzept beschäftigen. Zunächst einmal gehen wir her, und beschreiben uns noch mal eine einfache Klasse Rechteck, die habe ich jetzt hierher gehext, das ist okay, denn es geht ja nur darum, dass wir eine Klasse Rechteck haben, die besitzt zwei properties, laenge und breite, einen designated Initializer, einen Convenience-Initializer, und unser Rechteck ist in der Lage, eine Fläche zu berechnen. Nun ist es so, dass wir unsere Anwendung geliefert haben, der Kunde war eine Woche lang sehr glücklich, und dann kommt natürlich die nächste Anforderung auf uns zu, alles muss dreidimensional werden, wir brauchen jetzt Quader. Und ein Quader ist ja eigentlich wie ein Rechteck, hat nur zusätzlich noch eine Höhe. Wie definiert man dann so etwas in Swift? Nun, dann gehen wir her und sagen, okay, es gibt eben eine Klasse Quader, und die soll alles können, was ein Rechteck schon kann. Und damit habe ich tatsächlich hier schon alles so weit geschaffen, dass ich sagen kann, wir haben hier: einQuader = Quader() und wir können dann von diesem Quader auch schon eine flaeche ausgeben, und das ist 1. Nun, wir haben alles geerbt, was unser Rechteck schon konnte. Ein Quader ist eine subclass der Superklasse Rechteck, oder wir sind eine Unterklasse der Oberklasse Rechteck, wie auch immer man das Ganze hier bezeichnen möchte. Nun ist natürlich das nicht die Idee, einfach das Kind noch mal unter anderem Namen hier zur Verfügung zu stellen, sondern so ein Quader soll ja hier auch eine weitere Dimension zur Verfügung stellen, also müssen wir hergehen und sagen, okay, es gibt eine weitere Property, nämlich eine Höhe, und auch diese ist vom Typ Integer. Nun haben wir natürlich gleich das Problem, dass auch hier gilt, alles muss initialisiert sein, wenn ich also so einen Quader habe, mit einer Property hoehe, dann muss ich auch einen Initialisierer schaffen, der diesen Parameter setzt. Okay, also machen wir uns einen Init. Aber - eigentlich brauchen wir ja jetzt etwas mehr, denn ich muss nun einen Initialisierer schaffen, der bekommt eine laenge vom Typ Int, und eine breite vom Typ Int, und eben eine hoehe vom Typ Int, denn genau diese drei Werte muss ich ja hier garantiert auch besetzen. Und dabei stellt sich die Frage, wie man das Ganze nun implementiert. Zunächst einmal werden wir unserem Parameter hoehe die neue Höhe mitgeben, dass ist ja das hier, was wir als Argument hatten, und hier ist unser Property, also: self.hoehe = hoehe, ja, und für Länge und Breite hatten wir doch in unserer Superklasse bereits einen Initialisierer. Was sind wir an dieser Stelle gegenüber der Klasse Quader? Wir sind ein designated Initializer, also dürfen wir auch einen designated Initializer unserer Superklasse aufrufen, und wirklich nur die, und nicht etwa einen Convenience-Initialisierer. So, das heißt, wir sagen dann, super.init, und genau das müssen wir noch machen, die laenge und die breite lassen wir hier von unserem Super-Initialisierer durchführen. Jetzt werden wir hier etwas machen müssen, wir müssen hier jetzt konkret die Werte angeben, weil wir ja momentan noch über keinen Convenience-Konstruktor verfügen für den Quader, und wir sagen: Länge 10, Breite 10, Höhe 10, und haben uns dann einen Quader geschaffen. Nun, was würde denn passieren, wenn wir sagen: bevor ich mein Property hoehe setze, rufe ich doch diesen designated Initializer der Superklasse auf, dann bekommen wir von Swift, und das ist superschick, gleich eine Warnung, denn ich würde ja einen super.init aufrufen, bevor ich als Quader all meine Properties wirklich gesetzt habe, und sollte der Initialisierer etwas machen, nämlich eine Funktion aufrufen, die vielleicht dem Quader überschrieben ist, gäbe es an dieser Stelle schon Probleme, deshalb ganz, ganz wichtig, so wie wir es gemacht haben, war es auch richtig, erst die eigenen Variablen oder beziehungsweise Properties initialisieren, und dann den Super-Designated-Initializer aufrufen. Natürlich darf jetzt unser Quader auch weitere Funktionen zur Verfügung stellen, zum Beispiel eine Funktion Volumen, und diese Funktion hat keine Argumente, liefert einen Integer zurück, ja, und was ist das Volumen eines Quaders? Länge mal Breite mal Höhe. Länge mal Breite - hm - das hatten wir schon, das war doch die Fläche unserer Superklasse. Also dürfen wir auch hier einfach zurückgeben, die Fläche des Quaders mal der Höhe, das ist das Volumen, und wenn wir von unserem neu geschaffenen Quader dann auch wirklich das Volumen einmal sehen wollen, dann dürfen wir das auch, und 10 mal 10 ist 100, mal 10 ist eben 1000, und genau das wird uns auch hier ausgegeben. Ja, nun wollen wir auch wiederum einen Convenience-Initialisierer für unseren Quader haben, so dass wir quasi bequem, über Klammer auf, Klammer zu, uns so etwas konstruieren dürfen, gerne also haben wir einen Convenience-Initialisierer ohne Argumente, Was darf der tun? Der darf auf der Ebene der aktuellen Klasse, das ist der Quader, einen beliebigen designated Initialzer aufrufen, also self.init, und da gab es doch den mit der Länge, und auch hier werden wir alle Werte mit 1 vorbelegen, und haben damit die Möglichkeit, zu sagen, hier, Quader, ich brauch mal schnell einen, hab natürlich dann nur mein Standardmodell, mit Länge, Breite, Höhe von 1, aber ich darf ja jederzeit hergehen und sagen, der Quader, der hat eine Länge von 17, und unser Quader, der hat eine Breite von 25, und unser Quader hat eine Höhe von, ja - 9, und schon dürfen wir wieder hier, nachdem wir es auch zugewiesen haben, über den Assign-Operator, und schon dürfen wir auch hier auf das Volumen zugreifen. Also, man sieht sehr schön, auch diese Vererbung in Swift ist sehr einfach, Das Schöne ist ja, dass eine sogenannte Basisklasse nicht mehr wie in Objective-C zwingend von einer Klasse, zum Beispiel NSObject, sich ableiten muss, sondern tatsächlich, unser Rechteck steht im leeren Raum, das ist eine saubere Basisklasse für sich, und dann sagen wir, dass ein Quader alles kann, was ein Rechteck kann, zusätzlich wird eben veredelt, ja, wir haben eine Höhe, wir haben dann die Funktion für's Volumen, und wir haben das geklärt, mit diesen designated und Convenience-Initializern, und noch einmal der Hinweis, ein designated Initializer darf nur designated Initializer seiner Superklasse aufrufen, nicht aber Convenience-Initialisierer, und Convenience-Initialisierer selbst nur auf der aktuellen Ebene, designated Initializer letztendlich hier der eigenen Klasse, und es kann von jedem Typ dieser Initialisierer auch mehrere geben. Ja, sollte unser Quader, weil er vielleicht abgerundete Ecken hätte, na, hätten wir vielleicht lieber ein Double, jetzt als Wert genommen als ein Integer, aber sollte unser Quader die Fläche etwas anders berechnen müssen, als das zugrunde liegende Rechteck, darf das natürlich gemacht werden, unser Quader darf die Funktion flaeche überschreiben, und wir sehen dann tatsächlich schon, aha, auch hier zur Sicherheit noch mal das Keyword override, lieber Entwickler, hier wird flaeche der Basisklasse überschrieben, und was wollen wir dann machen, da wollen wir quasi zurückgeben, laenge, ja, machen wir's mal, wir haben halt jetzt Integer als Typ gewählt, laenge, da ziehen wir davon einen ab, mal - und wir multiplizieren das Ganze mit unserer breite, und ziehen auch hier einfach mal eins ab, und dann sieht man tatsächlich, dass wir die Funktion Volumen aufrufen, die sich basierend auf der Fläche mal der Höhe das Volumen liefert, aber dann findet dieser Call tatsächlich sein Gegenstück, schon hier in der überschriebenen Funktion flaeche, würden wir hier das noch mal mit Null ergänzen, sieht man, es kommt zu einem anderen Ergebnis, Es ist auch alles grau - Da sehen wir gerade ein kleines Problem in Swift - diese Playgrounds laufen in der Regel super, aber nicht immer, weder bei uns hier im Training, noch bei Ihnen am Arbeitsplatz, einfach Xcode neu starten, den Playground öffnen, und wir sehen halt hier noch mal jetzt die Unterschiede, dieses Volumen berechnet die Fläche über unsere überschriebene Funktion, würden wir hier die Werte ändern, sähen wir auch hier unten ein Ergebnis, was sich ändert, jetzt haben wir quasi unverändert Länge und Breite, und wenn wir eben aus Quadersicht sagen - na ja, unsere Fläche berechnet sich etwas anders, weil wir abgerundete Ecken haben, und dementsprechend ein bisschen Materialverlust, oder wie auch immer, dann lässt sich das Ganze so darstellen. Also, wichtig ist natürlich die Möglichkeit, dass eine Klasse auch Funktionen einer übergeordneten Klasse jederzeit überschreiben kann, dann allerdings zwingend mit dem Schlüsselwort override, und so haben wir für das Thema Vererbung schon mal die wesentlichsten Informationen zusammengetragen, wichtig ist, dass eben der Initialisierer erst die zusätzlichen Properties berücksichtigt, und dann den Super-Designated-Initializer aufruft.

Swift 2 lernen

Erkunden Sie die wichtigsten Sprachmerkmale von Swift und ihre modernen Eigenschaften wie Generics, Extensions, Tupels und Optionals.

4 Std. 2 min (30 Videos)
Derzeit sind keine Feedbacks vorhanden...

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!