In der zehnten Episode meines Anwendungsentwickler-Podcasts beende
ich meine Reihe zu häufigen Fragen im Fachgespräch rund um die
Objektorientierung mit dem Thema Polymorphie. Inhalt Polymorphie
(oder auch Polymorphismus) heißt Vielgestaltigkeit. Polymorphie ist
ein Konzept der Objektorientierung, das zwei konkrete Ausprägungen
hat: Variablen können unterschiedliche Datentypen annehmen. Überall
wo eine Basisklasse oder ein Interface erwartet wird (Variablen,
Parameter usw.), kann auch eine Subklasse bzw. eine
implementierende Klasse verwendet werden. Bei Methoden wird erst
zur Laufzeit entschieden, an welchem Datentyp diese aufgerufen
werden (dynamisches Binden). Da der konkrete Datentyp zur Laufzeit
vom deklarierten Datentyp abweichen kann, ruft die Laufzeitumgebung
dynamisch die Methode des konkreten Datentyps auf. Wenn eine
mehrstufige Vererbungshierarchie vorliegt, wird die Methode
aufgerufen, die in der Hierarchie am weitesten unten liegt.
Beispiel 1: Das Interface Waschbar definiert die Methode wasche().
Die Klasse Reinigung definiert die Methode reinige(Waschbar
zuWaschendesObjekt), die die Methode wasche() aufruft. Die Klassen
Auto und Hund implementieren Waschbar und können nun beide von der
Reinigung gewaschen werden. Beispiel 2: Die Klasse Tier definiert
die Methode gibLaut(). Die Klassen Hund und Katze erben von Tier
und implementieren gibLaut() (einmal als "Wuff" und einmal als
"Miau"). Die Klasse Labrador erbt von Hund und implementiert
gibLaut() nicht erneut. Wenn nun ein Herrchen seinem Tier sagt, es
soll Laut geben, dann wird das Tier - je nachdem um welches
konkrete Tier es sich handelt - entweder "Wuff" oder "Miau" sagen.
Ein Labrador wird "Wuff" sagen, da er die Methode von Hund erbt.
Weiterführende Diskussion Was ist ein Interface? Ein
Sprachkonstrukt, dass in vielen objektorientierten Sprachen
verfügbar ist und quasi eine abstrakte Klasse mit ausschließlich
abstrakten Methoden darstellt. Was ist der Unterschied zwischen
einem Interface und einer abstrakten Basisklasse? In den meisten
Sprachen kann man nur von einer Klasse erben, aber mehrere
Interfaces implementieren. Abstrakte Basisklassen können zusätzlich
zu abstrakten Methoden auch noch Attribute oder implementierte
Methoden enthalten. Wann nutzt man ein Interfaces bzw. eine
abstrakte Basisklasse? Eine abstrakte Klasse sollte verwendet
werden, wenn die Implementierung von Methoden wiederverwendet
werden kann/soll. Ein Interface sollte verwendet werden, wenn
komplett unterschiedliche Implementierungen (z.B.
Sortieralgorithmen) oder sogar unterschiedliche Konzepte (Auto und
Hund sind Waschbar) abgebildet werden sollen. Was ist parametrische
Polymorphie (auch Generics)? Generische Klassen stellen
allgemeingültige Algorithmen für mehrere Datentypen bereit. Ein
gutes Beispiel sind Listen (List in Java), die nach der
Parametrisierung (z.B. List) nur noch (typsicher) mit einem
Datentyp arbeiten können. Tipps für die Programmierpraxis Immer
gegen Abstraktionen, nie gegen Implementierungen programmieren!
(Dependency Inversion Principle) Interfaces den Vorzug geben, da
Vererbung eine sehr starke Beziehung ist, die schwer aufzulösen
ist. Häufiges Muster: Abstrakte Klasse, die ein Interface
implementiert, vereint die Vorteile beider Konzepte. Wenn man in
einer objektorientierten Sprache switch benutzt, hat man meist
etwas falsch gemacht und sollte stattdessen besser Polymorphie
einsetzen. (Replace Conditional with Polymorphism)
Literaturempfehlungen Wie immer der Klassiker für alles rund um
Java: *(direkt beim Rheinwerk-Verlag bestellen*) Ein sehr gutes
Buch rund um die Objektorientierung und gerade auch Polymorphie.
Verständlich geschrieben und mit vielen Praxisbeispielen
angereichert. Auch wenn der Fokus auf Ruby liegt, empfehle ich das
Buch allen Einsteigern in die Objektorientierung. * Das
Standardwerk rund um das Thema Refactoring. Ein konkretes
Refactoring wird oben bereits erwähnt: Replace Conditional with
Polymorphism. Viele weitere werden mit
Schritt-für-Schritt-Anleitungen in diesem Buch beschrieben. * Links
Permalink zu dieser Podcast-Episode RSS-Feed des Podcasts
Anwendungsentwickler-Podcast #2: Häufige Fragen im Fachgespräch –
Objektorientierung Anwendungsentwickler-Podcast #6: Häufige Fragen
im Fachgespräch – Kapselung Anwendungsentwickler-Podcast #8:
Häufige Fragen im Fachgespräch – Vererbung Rheinwerk Computing ::
Java ist auch eine Insel – 5.11 Dynamisches Binden Polymorphism
(The Java Tutorials > Learning the Java Language > Interfaces
and Inheritance) Polymorphismus (C#-Programmierhandbuch)
Polymorphie (Programmierung) – Wikipedia The Dependency Inversion
Principle Why should I prefer composition over inheritance? -
Programmers Stack Exchange Gute Erklärung zu Dependency Injection |
Fachinformatiker Anwendungsentwicklung Replace Conditional with
Polymorphism Weitere Infos zum FachgesprächDu suchst noch mehr
Tipps rund um das Fachgespräch? Dann schau doch mal in diese
Artikel- und Podcast-Kategorie: Alle Artikel rund um das
Fachgespräch.Kennst du schon meine Hörbücher zur Vorbereitung auf
das Fachgespräch? Unter dasperfektefachgespraech.de kannst du sie
herunterladen. In insg. über 10 Stunden gehe ich über 200 Fragen im
Detail durch und gebe Tipps für die Beantwortung.Und wenn du dich
für meinen Newsletter einträgst, bekommst du immer direkt alle
Neuigkeiten von dieser Seite in dein Postfach geliefert.Jetzt
anmelden!
Kommentare (0)
Melde dich an, um einen Kommentar zu schreiben.