it-swarm.com.de

Polymorphismus vs. Vererbung

Angenommen, ich habe zwei Klassen: Tier und Hund. Hund ist eine Unterklasse von Animal. Ich mache den folgenden Code:

Animal a = new Dog();

Nun kann ich Methoden der Dog-Klasse über die Variable a aufrufen. 

Aber meine Frage ist folgende: Wenn ich alle Methoden von Animal über die Dog-Objekte (Vererbung) aufrufen kann, warum sollte ich das Polymorphismusprinzip verwenden? Ich kann nur erklären:

Dog d = new Dog();

Mit dieser Deklaration können alle Methoden und Methoden von Animal verwendet werden. Warum also Polymorphismus verwenden? Ich danke Ihnen sehr für Ihre Antwort.

18
Assaf

In Java werden die Begriffe Polymorphismus und Vererbung "miteinander verschweißt"; Im Allgemeinen muss es nicht so sein:

  • Mit Polymorphismus können Sie Methoden einer Klasse aufrufen, ohne den genauen Typ der Klasse zu kennen
  • Durch die Vererbung können abgeleitete Klassen Schnittstellen und Code ihrer Basisklassen gemeinsam nutzen

Es gibt Sprachen, in denen die Vererbung vom Polymorphismus entkoppelt ist:

  • In C++ können Sie eine Klasse erben, ohne polymorphes Verhalten zu erzeugen (d. H. Funktionen in der Basisklasse nicht mit virtual markieren).
  • In Objective C können Sie eine Methode für eine nicht verknüpfte Klasse implementieren und sie von einem Ort aus aufrufen, der nur die Signatur der Methode kennt.

Zurück zu Java, der Grund für die Verwendung von Polymorphismus ist die Entkopplung Ihres Codes von den Details der Implementierung seiner Gegenparteien: Wenn Sie beispielsweise eine Methode Feed(Animal animal) schreiben können, die für alle Arten von Tieren geeignet ist, bleibt die Methode anwendbar Sie fügen weitere Unterklassen oder Implementierungen der Animal hinzu. Dies steht im Gegensatz zu einer Feed(Dog dog)-Methode, die eng an Hunde gekoppelt wäre.

Soweit das

Dog d = new Dog();

deklaration geht, es gibt keinen allgemeinen Grund, dies zu vermeiden, wenn Sie wissen, dass der Rest Ihrer Methode speziell für Hunde gilt. In vielen Fällen ist dies jedoch später nicht der Fall: Zum Beispiel wäre Ihre Klasse oder Ihre Methoden oft unempfindlich gegenüber der genauen Implementierung

List<Integer> numbers = new ArrayList<Integer>();

In solchen Fällen können Sie new ArrayList<Integer>() durch new LinkedList<Integer>() ersetzen und know dass Ihr Code kompiliert wird. Hätte Ihre numbers-Liste dagegen als ArrayList<Integer> numbers deklariert, war eine solche Umschaltung möglicherweise nicht sicher.

Dies wird als "Programmierung an einer Schnittstelle" bezeichnet. Es gibt ein sehr gutes answer im Stack Overflow, das es erklärt.

23
dasblinkenlight

Sie können andere Implementierungen der Animal-Klasse haben, beispielsweise Cat. Dann kannst du sagen

Animal a = new Dog();
Animal b = new Cat();

Sie können Methoden der Klasse Animal aufrufen, ohne sich darüber zu kümmern, um welche Implementierung es sich wirklich handelt, und Polymorphism wird die richtige Methode aufrufen. Z.B.

a.speak();  // "Woof"

b.speak();  // "Meow"

In Wirklichkeit ist es nicht "Polymorphismus vs. Vererbung", sondern "Polymorphismus mit Vererbung".

4
rgettman

Mit Polymorphismus können Sie eine Methode schreiben, die für jede Animal-Methode geeignet ist:

public void pet(Animal animal) {
   ...
}

Diese Methode würde Dog, Cat usw. akzeptieren, einschließlich Unterklassen von Animal, die noch geschrieben werden müssen.

Wenn die Methode Dog verwenden würde, würde sie für Cat usw. nicht funktionieren.

4
NPE

Wenn Sie sicher sind, dass es immer ein Hund sein wird, gibt es keinen Grund dafür. Sie könnten auch Dog verwenden d = new Dog (); wie Sie beschrieben haben. Angenommen, Sie haben eine Methode anstelle eines Konstruktors verwendet. Die Methode hat ein Tier zurückgegeben und Sie würden nicht wissen, welches Tier Sie einsetzen würden. Sie könnten immer noch dieselben Methoden auf das Tier anwenden (auch wenn es sich um einen Hund, eine Elefantenkatze usw. handelt).

Aus Gründen der Erweiterbarkeit vereinfacht die Vererbung die Dinge. Wenn Sie einen Elefanten oder eine Katze kreieren möchten, der auch einige Tiermethoden nutzt, können Sie diese leicht erlangen, indem Sie ein Tier der Superklasse haben.

1
Peter Rasmussen

Normalerweise ähnelt die Frage, die Sie gestellt haben, eher der Vererbung im Vergleich zur Zusammensetzung. :) Ein Beispiel aus dem "wahren Leben", warum es gut ist, Polymorphismus zu verwenden, ist beispielsweise die Verwendung eines Strategie-Design-Musters. Sie können viele TaxPolicy-Implementierungen haben: UsaTaxPolicy, CanadaTaxPolicy, EuTaxPolicy usw. Wenn Sie über die Methode berechneFinalPrice verfügen, die auch die Steuer berechnen muss, fügen Sie die korrekte Implementierung ein, und eine gute Berechnung wird ausgeführt, unabhängig davon, ob Sie die USA, Kanada oder Kanada bestanden haben EU-Implementierung.

0
Jakub Kubrynski

vererbung ist der dynamische Polymorphismus. Ich meine, wenn Sie die Vererbung entfernen, können Sie sie nicht mehr überschreiben.