it-swarm.com.de

Was ist der Hauptunterschied zwischen Vererbung und Polymorphismus?

Diese Frage wurde mir heute in einer Abschlussprüfung zum offenen Abschluss des Moduls gestellt und fand mich verloren. Ich las Head first Java und beide Definitionen schienen genau gleich zu sein. Ich habe mich nur gefragt, was der MAIN-Unterschied für meinen eigenen Verstand ist. Ich weiß, dass es eine Reihe ähnlicher Fragen gibt, aber keine, die ich gesehen habe, die eine endgültige Antwort geben.

139
Darren Burgess

Vererbung ist, wenn eine "Klasse" von einer vorhandenen "Klasse" abgeleitet wird. Wenn Sie also eine Person Klasse haben, dann haben Sie eine Student Klasse, die Person, Student erbt all die Dinge, die Person hat . Es gibt einige Details zu den Zugriffsmodifizierern, die Sie in Person für die Felder/Methoden verwenden. Dies ist jedoch die Grundidee. Wenn Sie beispielsweise ein privates Feld für Person haben, wird Student nicht angezeigt, da dessen private und private Felder für Unterklassen nicht sichtbar sind.

Polymorphismus befasst sich damit, wie das Programm entscheidet, welche Methoden es verwenden soll, je nachdem, welche Art von Dingen es hat. Wenn Sie eine Person haben, die eine read Methode hat, und Sie eine Student haben, die Person reicht, die ihre eigene Implementierung von read hat, die Die Methode wird aufgerufen, hängt von der Laufzeit ab, je nachdem, ob Sie eine Person oder eine Student haben. Es wird ein bisschen schwierig, aber wenn Sie so etwas tun

Person p = new Student();
p.read();

die Lesemethode auf Student wird aufgerufen. Das ist der Polymorphismus in Aktion. Sie können diese Zuweisung vornehmen, da eine Student eine Person ist, die Laufzeit jedoch intelligent genug ist, um zu wissen, dass der tatsächliche Typ von p Student ist.

Beachten Sie, dass sich die Details je nach Sprache unterscheiden. Sie können zum Beispiel Vererbung in Javascript durchführen, sie unterscheidet sich jedoch völlig von der Funktionsweise in Java.

250
hvgotcodes

Vererbung verweist auf unter Verwendung der Struktur und des Verhaltens einer Superklasse in einer Unterklasse. 

Polymorphismus bezieht sich auf das Verhalten einer Superklasse in der Unterklasse ändern.

170
Ted Hopp

Polymorphismus : Die Fähigkeit, Objekte unterschiedlichen Typs auf ähnliche Weise zu behandeln. Beispiel: Giraffe und Krokodil sind beide Tiere, und Tiere können Move sein. Wenn Sie eine Instanz einer Animal haben, können Sie Move aufrufen, ohne zu wissen, um welche Art von Tier es sich handelt.

Vererbung : Dies ist eine Möglichkeit, gleichzeitig Polymorphismus und Code-Wiederverwendung zu erreichen.

Andere Formen des Polymorphismus : Es gibt andere Möglichkeiten, Polymorphismus zu erreichen, beispielsweise Schnittstellen, die nur Polymorphismus bereitstellen, jedoch keine Wiederverwendung von Code (manchmal ist der Code sehr unterschiedlich, wie zum Beispiel Move für eine Schlange.) von Move für einen Hund. In diesem Fall wäre ein Interface die bessere polymorphe Wahl.

In anderen dynamischen Sprachen kann mit Duck Typing Polymorphismus erreicht werden. Die Klassen müssen nicht einmal die gleiche Basisklasse oder Schnittstelle verwenden, sondern nur eine Methode mit demselben Namen. Oder noch dynamischer wie Javascript, Sie brauchen gar keine Klassen, nur ein Objekt mit demselben Methodennamen kann polymorph verwendet werden.

58
Davy8

Der Hauptunterschied ist, dass Polymorphismus ein spezifisches Ergebnis der Vererbung ist. Polymorphismus ist der Ort, an dem die aufzurufende Methode zur Laufzeit basierend auf dem Objekttyp bestimmt wird. Dies ist eine Situation, die sich ergibt, wenn eine Klasse von einer anderen Klasse erbt und eine bestimmte Methode überschreibt. In einem normalen Vererbungsbaum müssen Sie jedoch keine Methoden überschreiben. Daher müssen nicht alle Methodenaufrufe polymorph sein. Ist das sinnvoll? Es ist ein ähnliches Problem für alle Ford-Fahrzeuge sind Automobile, aber nicht alle Automobile sind Fords (obwohl nicht ganz ...).

Darüber hinaus behandelt Polymorphismus das Aufrufen von Methoden, während Vererbung auch Datenelemente usw. beschreibt.

17
Chris Thompson

In Java sind beide eng miteinander verbunden. Dies liegt daran, dass Java eine Methode für den Methodenaufruf namens "Dynamic Dispatch" verwendet. Wenn ich habe

public class A {
  public void draw() { ... }
  public void spin() { ... }
}

public class B extends A {
  public void draw() { ... }
  public void bad() { ... }
}

...

A testObject = new B();

testObject.draw(); // calls B's draw, polymorphic
testObject.spin(); // calls A's spin, inherited by B
testObject.bad(); // compiler error, you are manipulating this as an A

Dann sehen wir, dass B spin von A erbt. Wenn wir jedoch versuchen, das Objekt wie einen Typ A zu manipulieren, erhalten wir immer noch das Verhalten von B für draw. Das draw-Verhalten ist polymorph.

In einigen Sprachen sind Polymorphismus und Vererbung nicht so eng miteinander verbunden. In C++ zum Beispiel werden Funktionen, die nicht als virtuell deklariert sind, vererbt, jedoch nicht dynamisch abgesetzt, so dass Sie dieses polymorphe Verhalten nicht erhalten, selbst wenn Sie Vererbung verwenden. 

In Javascript wird jeder Funktionsaufruf dynamisch abgesetzt und Sie haben schwache Schreibvorgänge. Dies bedeutet, dass Sie eine Reihe nicht zusammenhängender Objekte mit jeweils eigenen draw haben können, über eine Funktion iterieren und die Funktion aufrufen, und jedes würde sich gut verhalten. Sie hätten Ihren eigenen polymorphen Draw ohne Vererbung.

12
ccoakley

Polymorphismus: Angenommen, Sie arbeiten für ein Unternehmen, das Stifte verkauft. Sie machen also eine sehr schöne Klasse namens "Pen", die alles behandelt, was Sie über einen Stift wissen müssen. Sie schreiben alle Arten von Klassen für die Abrechnung, den Versand, das Erstellen von Rechnungen und die Verwendung der Pen-Klasse. Ein Tagchef kommt und sagt: "Gute Nachrichten! Das Unternehmen wächst und wir verkaufen jetzt Bücher und CDs!" Keine gute Nachricht, da Sie jetzt jede Klasse, die Pen verwendet, ändern müssen, um auch Book & CD zu verwenden. Was wäre, wenn Sie ursprünglich eine Schnittstelle namens "SellableProduct" erstellt hätten und Pen diese Schnittstelle implementiert hat? Dann hätten Sie alle Klassen für Versand, Rechnungsstellung usw. geschrieben, um diese Schnittstelle anstelle von Pen zu verwenden. Jetzt müssen Sie lediglich eine neue Klasse namens Book & CompactDisc erstellen, die die SellableProduct-Schnittstelle implementiert. Aufgrund des Polymorphismus könnten alle anderen Klassen ohne Änderung weiterarbeiten! Sinn ergeben?

Es bedeutet also, Vererbung zu verwenden, eine Möglichkeit, Polymorphie zu erreichen.

Polymorhismus kann in einer Klasse/Schnittstelle möglich sein, aber die Vererbung erfolgt immer zwischen 2 OR mehr Klassen/Schnittstellen. Vererbung entspricht immer einer "is-a" -Beziehung, während es nicht immer mit dem Polymorphismus (der beide "is-a"/"has-a" -Beziehung entsprechen kann, übereinstimmt.

12
AmitK

Vererbung ist eher eine statische Sache (eine Klasse erweitert eine andere), während Polymorphismus eine dynamische/Laufzeit-Sache ist (ein Objekt verhält sich entsprechend seinem dynamischen/Laufzeit-Typ und nicht seinem statischen/Deklarationstyp).

Z.B.

// This assignment is possible because B extends A
A a = new B();
// polymorphic call/ access
a.foo();

-> Obwohl der statische/Deklarationstyp von a A ist, ist der tatsächliche Dynamik-/Laufzeittyp B und daher führt a.foo () foo wie in B und nicht in A definiert aus.

6
Puce

Die Oracle-Dokumentation zitierte den Unterschied genau. 

Vererbung: Eine Klasse erbt Felder und Methoden von allen ihren Oberklassen, ob direkt oder indirekt. Eine Unterklasse kann Methoden, die sie erbt, überschreiben oder Felder oder Methoden verbergen, die sie erbt.. (Beachten Sie, dass das Ausblenden von Feldern im Allgemeinen eine schlechte Programmierpraxis ist.)

Polymorphismus:Polymorphismus bezieht sich auf ein Prinzip in der Biologie, bei dem ein Organismus oder eine Spezies viele verschiedene Formen oder Stadien haben kann. Dieses Prinzip kann auch auf objektorientierte Programmierung und Sprachen wie die Java-Sprache angewendet werden. Unterklassen einer Klasse können ihre eigenen eindeutigen Verhalten definieren und dennoch einige Funktionen der übergeordneten Klasse gemeinsam nutzen.

Polymorphismus gilt nicht für Felder. 

Verwandte Post:

Polymorphismus vs Overriding vs Überladung

3
Ravindra babu

Polymorphismus ist ein Ansatz, um ein gemeinsames Verhalten zwischen Objekttypen mit ähnlichen Merkmalen auszudrücken. Es ermöglicht auch, dass Variationen dieser Merkmale durch Überschreiben erzeugt werden. Vererbung ist ein Weg, um Polymorphismus durch eine Objekthierarchie zu erreichen, in der Objekte Beziehungen und abstraktes Verhalten ausdrücken. Es ist jedoch nicht der einzige Weg, um Polymorphismus zu erreichen. Prototyp ist ein anderer Weg, um Polymorphismus auszudrücken, der sich von Vererbung unterscheidet. JavaScript ist ein Beispiel für eine Sprache, die Prototyp verwendet. Ich könnte mir vorstellen, dass es auch andere Möglichkeiten gibt.

3
laz

Vererbung ist ein Konzept, das sich auf die Wiederverwendung von Code bezieht. Wenn ich beispielsweise eine übergeordnete Klasse habe, sagen Sie Animal und diese enthält bestimmte Attribute und Methoden (für dieses Beispiel sagen Sie makeNoise() und sleep()), und ich erstelle zwei untergeordnete Klassen mit dem Namen Dog und Cat. Da sowohl Hunde als auch Katzen auf dieselbe Weise schlafen gehen (würde ich annehmen), ist es nicht notwendig, die sleep()-Methode in den von der übergeordneten Klasse Dog bereitgestellten Unterklassen Cat und Animal um weitere Funktionen zu erweitern. Eine Dog bellt und eine Cat macht sich jedoch bemerkbar, obwohl die Animal-Klasse über eine Methode zum Erzeugen von Geräuschen verfügen kann, ein Hund und eine Katze machen jedoch andere Geräusche relativ zueinander und zu anderen Tieren. Daher ist es notwendig, dieses Verhalten für seine spezifischen Typen neu zu definieren. Also die Definition des Polymorphismus. Hoffe das hilft.

3
avenger12

Polymorphismus ist ein Effekt von Vererbung . Dies kann nur in Klassen geschehen, die sich gegenseitig erweitern. Sie können damit Methoden einer Klasse aufrufen, ohne den genauen Typ der Klasse zu kennen. Polymorphismus tritt auch zur Laufzeit auf.

Beispiel für Java-Polymorphismus:

 enter image description here 

Durch Vererbung können abgeleitete Klassen Schnittstellen und Code ihrer Basisklassen gemeinsam nutzen. Es passiert um Kompilierzeit .

Beispiel: Alle Klassen in der Java-Plattform sind Nachkommen von Object (mit freundlicher Genehmigung von Oracle):

 enter image description here 

Weitere Informationen zu Java-Vererbung und Java-Polymorphismus

1
Stas

vererbung ist eine Art Polymorphismus. Genau genommen ist Vererbung der dynamische Polymorphismus. Wenn Sie die Vererbung entfernen, können Sie sie nicht mehr überschreiben.

Der Hauptzweck von Polymorphism : Zum Erstellen einer Referenzvariablen für die Oberklasse und Halten der Unterklasse object => kann ein Objekt mehrere Verhalten durchführen. 

In Vererbung , Unterklasse erben die Eigenschaften der Superklasse .

0
satya

Vererbung ist, wenn Klasse A alle nicht statisch geschützten/öffentlichen Methoden/Felder von allen ihren übergeordneten Objekten bis Object erbt.

0
Cosmin Cosmin

Polymorphismus wird durch Vererbung in Java erreicht.

public class Animal {}
public interface Herbivore {}
public interface Carnivore {}
public interface Pet {}

public class Hamster extends Animal implements Herbivore implements Pet () {}
public class Cat extends Animal implements Carnivore implements Pet () {}

Die Hamster-Klasse erbtstructurevon Animal, Herbivore und Pet, umPolymorphes Verhalteneines Haustieres auszustellen.

Die Cat-Klasse erbtstructurevon Animal, Carnivore und Pet, um auchPolymorphic Behaviorismuseines Haustieres zu zeigen.

0
nabster

Wenn Sie Java verwenden, ist das so einfach:

Polymorphismus verwendet vererbte Methoden, aber "überschreiben" sie, um etwas anderes zu tun (oder das Gleiche, wenn Sie Super nennen, also technisch nicht polymorph sein).

Korrigiere mich, wenn ich falsch liege.

0
Oliver Dixon