Frage zu abstrakten Klassen bzw. der Polymorphie?
Hallo habe mir gerade ein Video zu OOP angesehen, dort ging es unter anderem auch um abstrakte Klassen und Polymorphie: https://youtu.be/cp0J3jeBM6Y (bei 4:20) und jetzt habe ich eine Frage dazu:
in dem Video geht es um die Klasse Tier welche an zwei weitere Klassen, hier Kuh und Schaf vererbt, diese besitzt eine abstrakte Klasse die man jetzt aber in Den Klassen die vererbt wurden Überschreiben muss, aber es geht doch die ganze Zeit darum sich nicht zu wiederholen. Warum muss man abstrakte Klassen noch mal überschreiben und kann sie nicht einfach direkt deklarieren?
ist das Video unkorrekt oder habe ich da etwas missverstanden?
2 Antworten
Abstrakt bedeutet ja gerade, dass da nichts implementiert wurde.
Du überschreibst sie also nicht, sondern gibst ihr erst in der "Unterklasse" eine Funktion.
Der Sinn ist, dass du keine Instanz von einem Tier haben kannst. Es muss schon ein konkretes Tier sein
Die abstrakte Klasse definiert - ein für alle Mal -, was allen Tieren gemeinsam ist. Dies führt zu deutlich weniger Redundanz im Code.
Der Typ in dem Video hat mit "alter" einfach nur ein unpassendes (lies: falsches) Beispiel für eine abstrakte Methode gewählt, weil die Methode in beiden Subklassen gleich umgesetzt wird. Eine abstrakte Methode nimmst du, wenn sich die Funktionalität in den Subklassen unterscheiden soll.
Also angenommen, wir wollen, dass ein Tier einen Laut abgeben kann - ein Schaf soll "Mäh" und eine Kuh "Muh" zurückgeben. Dann könntest du eine Basisklasse "Tier" anlegen, in der das Alter des Tieres ausgerechnet wird (weil das bei allen Tieren gleich funktioniert) und eine abstrakte Methode "machKrach()", die die beiden Subklassen dann implementieren müssen und die "Mäh" bzw. "Muh" zurückgeben. Der alternative Entwurf wäre, dass du zwei Klassen "Schaf" und "Kuh" anlegst, die von nichts erben und beide das Alter des Tieres (auf identische Weise) ausrechnen - und damit hättest du dann tatsächlich den doppelten Code, den du nicht haben möchtest.
Könnte man nicht auch einfach den Laut des Tieres als parameter übergeben
Das, was du beschreibst, ist im Prinzip das Strategy-Pattern. Ebenfalls ein Weg, um das Problem zu lösen.
https://www.philipphauer.de/study/se/design-pattern/strategy.php
Was nun besser ist, kommt meiner Meinung nach drauf an. Wenn du mehrere Klassen hast, die sich sehr ähnlich sind, dann sind abstrakte Methoden schon okay. Wenn es darum geht, dass du das Verhalten der Klassen selbst öfters anpassen musst, dann ist die Strategy besser. Für jemanden, der gerade erst seit kurzem programmieren lernt, ist das aber vielleicht noch etwas hochgegriffen.
Wichtig ist, dass man es vermeidet, den gleichen Code doppelt zu haben, aber das hast du ja schon richtig erkannt.
Erstmal Danke für die Antwort
Könnte man nicht auch einfach den Laut des Tieres als parameter übergeben und sich die Mühe sparen oder gibt es Anwendungszwecke wo sich abstrakte mehr eignen?
LG