Was ist der Hauptunterschied zwischen Vererbung und Polymorphismus?


172

Diese Frage wurde mir heute in einer Open-Book-Prüfung zum Ende des Moduls gestellt und ich fand mich verloren. Ich las Head first Javaund beide Definitionen schienen genau gleich zu sein. Ich habe mich nur gefragt, was der Hauptunterschied für meine eigene Meinung ist. Ich weiß, dass es eine Reihe ähnlicher Fragen gibt, aber keine, die ich gesehen habe und die eine endgültige Antwort liefern.


2
Irgendwie im Zusammenhang mit dieser Frage: Ist Polymorphismus ohne Vererbung möglich
Edwin Dalorzo

Antworten:


289

Vererbung ist, wenn eine 'Klasse' von einer vorhandenen 'Klasse' abgeleitet ist. Wenn Sie also eine PersonKlasse haben, dann haben Sie eine StudentKlasse, die erweitert Personund alle Dinge Student erbt , Persondie vorhanden sind. Es gibt einige Details zu den Zugriffsmodifikatoren, die Sie in die Felder / Methoden in Person eingefügt haben, aber das ist die Grundidee. Wenn Sie beispielsweise ein privates Feld aktiviert haben Person, Studentwird es nicht angezeigt, da seine privaten und privaten 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 haben Person, die eine readMethode hat, und Sie eine haben, Studentdie erweitert Person, die eine eigene Implementierung hat read, wird die Methode, die aufgerufen wird, von der Laufzeit für Sie bestimmt, je nachdem, ob Sie eine Personoder eine haben Student. Es wird ein bisschen schwierig, aber wenn Sie so etwas tun

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

Die Lesemethode für Student wird aufgerufen. Das ist der Polymorphismus in Aktion. Sie können diese Zuordnung tun , weil ein Student a Person , aber die Laufzeit ist intelligent genug , um zu wissen , dass sich der tatsächliche Typ pist Schüler .

Beachten Sie, dass sich die Details zwischen den Sprachen unterscheiden. Sie können beispielsweise in Javascript vererben, aber es ist völlig anders als in Java.


9
@ hvgtcodes Kurz gesagt, die Superklasse-Unterklasse-Beziehung ist Vererbung und das Konzept der Implementierung derselben Methode auf unterschiedliche Weise zwischen der übergeordneten Klasse und ihren Unterklassen. Sie werden je nach Situation Polymorphismus genannt. Hab ich recht?
Muhammad Raihan Muhaimin

1
@hvgotcodes, aber sagen Sie, wenn Persondie readMethode den Modifikator für den öffentlichen Zugriff verwendet, können StudentObjekte dann nicht darauf zugreifen? und Student s = new Student();wird es dann nicht einfacher sein? Ich verstehe die Vorteile des Polymporphismus immer noch nicht ganz.
Scorpiorian83

1
@hvgotcodes Student s = new Student () würde funktionieren. Nehmen wir an, Sie haben einen Großteil des Codes mit dieser Idee geschrieben und später festgestellt, dass Sie einen Fehler gemacht haben. Die Person ist eigentlich kein Schüler, es ist ein Lehrer. Sie könnten also einfach von Person p = neuer Schüler () zu Person p = neuer Lehrer () wechseln, dann wird Ihr Leben so viel einfacher.
Munmunbb

Meine Frage hier wäre, warum Sie Person p = new Student();anstelle von verwenden möchten Student p = new Student();?
PerfectContrast

@PerfectContrast Ich denke, es ist nützlich, wenn Sie Schüler, Fahrer, Lehrer usw. als Person haben möchten und Sie sie unter einer Liste oder etwas anderem gruppieren. Wenn Sie also "read" für alle aufrufen, ruft jeder seine eigene "read" -Methode auf.
Savante

205

Vererbung bezieht sich auf die Verwendung der Struktur und des Verhaltens einer Superklasse in einer Unterklasse.

Polymorphismus bezieht sich auf das Ändern des Verhaltens einer Superklasse in der Unterklasse.


5
Bedeutet diese Antwort, dass Polymorphismus Vererbung erfordert?
jaco0646

6
@ jaco0646 - Im Kontext von Java denke ich schon. (In anderen Sprachen vielleicht nicht so sehr.) Beachten Sie, dass "Superklasse" und "Unterklasse" hier lose verwendet werden. Polymorphismus kann auch die Vererbung von Verhalten bedeuten, das in einer Schnittstelle angegeben (aber nicht implementiert) ist.
Ted Hopp

1
@AlirezaRahmani - Ich verstehe Ihren Kommentar nicht. Meinen Sie damit, dass bei der Vererbung nicht sowohl Eigenschaften als auch Verhalten geerbt werden? Dies würde im Widerspruch dazu stehen, wie Java (und die meisten klassenbasierten, objektorientierten Sprachen) die Vererbung definieren. Aus der Java-Sprachspezifikation, §8.4.8 : "Eine Klasse C erbt von ihrer direkten Oberklasse alle konkreten Methoden m(beide staticund instance) der Oberklasse, für die ..." (gefolgt von Details zur Vererbung). Klingt für mich nach "Wiederverwendung von Code".
Ted Hopp

@ TedHopp Inheritance ist in erster Linie ein polymorphes Tool, aber einige Leute versuchen, es zu ihrer späteren Gefahr zu verwenden, um Code wiederzuverwenden / weiterzugeben. Das Grundprinzip lautet: "Wenn ich erbe, bekomme ich alle Methoden kostenlos", ignoriert jedoch die Tatsache, dass diese beiden Klassen möglicherweise keine polymorphe Beziehung haben.
Alireza Rahmani Khalili

1
@AlirezaRahmani - In Java (nach dem OP laut Tags speziell gefragt hat) beinhaltet die Klassenvererbung definitiv das Erben von Verhalten. Das ist Teil der Sprachdefinition. Die Tatsache, dass dies wie beschrieben missbraucht werden kann, ist eine der Schwächen von Java. (Eine damit verbundene Schwachstelle bestand darin, Klassen zu deklarieren, um Schnittstellen zu implementieren, um einfach die in der Schnittstelle definierten Konstanten zu importieren. Schließlich führten die Java-Designer ein import static, um diesen Missbrauch von Schnittstellen zu beseitigen.) Für reinen Polymorphismus in Java ist das zu verwendende Tool Schnittstellen, nicht Klassenvererbung.
Ted Hopp

63

Polymorphismus : Die Fähigkeit, Objekte unterschiedlicher Art auf ähnliche Weise zu behandeln. Beispiel: Giraffe und Krokodil sind beide Tiere, und Tiere können Move. Wenn Sie eine Instanz von haben Animal, können Sie anrufen, Moveohne zu wissen oder sich darum zu kümmern, 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 erzielen, z. B. Schnittstellen, die nur Polymorphismus, aber keine Wiederverwendung von Code bieten (manchmal ist der Code ganz anders, z. B. Movefür eine Schlange Move, und in diesem Fall ganz anders als für einen Hund Eine Schnittstelle wäre in diesem Fall die bessere polymorphe Wahl.

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


17

Der Hauptunterschied besteht darin, dass Polymorphismus ein spezifisches Ergebnis der Vererbung ist. Beim Polymorphismus wird die aufzurufende Methode zur Laufzeit basierend auf dem Objekttyp bestimmt. Dies ist eine Situation, die auftritt, wenn eine Klasse von einer anderen erbt und eine bestimmte Methode überschreibt. In einem normalen Vererbungsbaum müssen Sie jedoch keine Methoden überschreiben, und daher müssen nicht alle Methodenaufrufe polymorph sein. Ist das sinnvoll? Es ist ein ähnliches Problem wie bei allen Ford-Fahrzeugen, bei denen es sich um Automobile handelt, aber nicht bei allen Autos handelt es sich um Fords (obwohl nicht ganz ...).

Darüber hinaus befasst sich der Polymorphismus mit dem Aufruf von Methoden, während die Vererbung auch Datenelemente usw. beschreibt.


12

In Java sind die beiden eng miteinander verbunden. Dies liegt daran, dass Java eine Technik zum Aufrufen von Methoden verwendet, die als "dynamischer Versand" bezeichnet wird. 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 erbt spinvon A. Wenn wir jedoch versuchen , das Objekt zu manipulieren , als ob es sich um eine Typ A waren wir noch für B das Verhalten bekommen draw. Das drawVerhalten ist polymorph.

In einigen Sprachen sind Polymorphismus und Vererbung nicht ganz so eng miteinander verbunden. In C ++ werden beispielsweise Funktionen, die nicht als virtuell deklariert wurden, vererbt, aber nicht dynamisch gesendet, sodass Sie dieses polymorphe Verhalten auch dann nicht erhalten, wenn Sie die Vererbung verwenden.

In Javascript wird jeder Funktionsaufruf dynamisch ausgelöst und Sie haben eine schwache Eingabe. Dies bedeutet, dass Sie eine Reihe von nicht verwandten Objekten haben können, von denen jedes seine eigene hat draw, über die eine Funktion iteriert und die Funktion aufgerufen wird, und dass sich jedes Objekt gut verhält. Sie würden Ihre eigene polymorphe Zeichnung haben, ohne Vererbung zu benötigen.


12

Polymorphismus: Angenommen, Sie arbeiten für ein Unternehmen, das Stifte verkauft. Sie machen also eine sehr schöne Klasse namens "Stift", die alles behandelt, was Sie über einen Stift wissen müssen. Sie schreiben alle Arten von Klassen für die Abrechnung, den Versand und die Erstellung von Rechnungen mit der Pen-Klasse. Ein Tageschef kommt und sagt: "Tolle Neuigkeiten! Das Unternehmen wächst und wir verkaufen jetzt Bücher und CDs!" Keine gute Nachricht, denn jetzt müssen Sie jede Klasse, die Pen verwendet, ändern, 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 hätte? Dann hätten Sie alle Ihre Klassen für Versand, Rechnungsstellung usw. schreiben können, um diese Schnittstelle anstelle von Stift zu verwenden. Jetzt müssen Sie nur noch eine neue Klasse namens Book & CompactDisc erstellen, die die SellableProduct-Schnittstelle implementiert. Aufgrund des Polymorphismus könnten alle anderen Klassen unverändert weiterarbeiten! Sinn ergeben?

Es bedeutet also, Vererbung zu verwenden, was einer der Wege ist, um Polymorphismus zu erreichen.

Polymorhismus kann in einer Klasse / Schnittstelle möglich sein, aber Vererbung immer zwischen 2 ODER mehr Klassen / Schnittstellen. Vererbung entspricht immer der "ist-eine" -Beziehung, wohingegen es nicht immer dem Polymorphismus entspricht (der beide "ist-eine" / "hat-eine" -Beziehung entsprechen kann.


6

Vererbung ist eher eine statische Sache (eine Klasse erweitert eine andere), während Polymorphismus eine dynamische / Laufzeitsache ist (ein Objekt verhält sich gemäß seinem dynamischen / Laufzeittyp und nicht gemäß 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 dynamische / Laufzeittyp B und somit führt a.foo () foo wie in B definiert aus, nicht in A.


3

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


3

Vererbung ist ein Konzept im Zusammenhang mit der Wiederverwendung von Code. Zum Beispiel, wenn ich eine übergeordnete Klasse sagen lasse Animalund sie bestimmte Attribute und Methoden enthält (für dieses Beispiel say makeNoise()and sleep()) und ich zwei untergeordnete Klassen mit dem Namen Dogund erstelle Cat. Da sowohl Hunde als auch Katzen auf dieselbe Weise schlafen gehen (ich würde annehmen), muss der sleep()Methode in den von der Elternklasse bereitgestellten Unterklassen Dogund nicht mehr Funktionalität hinzugefügt werden . Allerdings bellt und miaut ein so obwohl dasCatAnimalDogCatAnimalKlasse könnte eine Methode haben, um ein Geräusch zu machen, ein Hund und eine Katze machen unterschiedliche Geräusche relativ zueinander und zu anderen Tieren. Daher muss dieses Verhalten für die jeweiligen Typen neu definiert werden. Also die Definition von Polymorphismus. Hoffe das hilft.


3

In der Oracle-Dokumentation wurde der Unterschied genau angegeben.

Vererbung: Eine Klasse erbt Felder und Methoden von allen ihren direkten oder indirekten Oberklassen. Eine Unterklasse kann von ihr geerbte Methoden überschreiben oder von ihr geerbte Felder oder Methoden ausblenden . (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 ihr eigenes eindeutiges Verhalten definieren und dennoch einige der gleichen Funktionen der übergeordneten Klasse gemeinsam nutzen.

Polymorphismus ist für Felder nicht anwendbar.

In Verbindung stehender Beitrag:

Polymorphismus vs Überschreiben vs Überladen


1

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

Beispiel für Java-Polymorphismus:

Geben Sie hier die Bildbeschreibung ein

Durch Vererbung können abgeleitete Klassen Schnittstellen und Code ihrer Basisklassen gemeinsam nutzen. Dies geschieht zur Kompilierungszeit .

Beispielsweise sind alle Klassen in der Java-Plattform Nachkommen des Objekts (mit freundlicher Genehmigung von Oracle):

Geben Sie hier die Bildbeschreibung ein

Erfahren Sie mehr über Java-Vererbung und Java-Polymorphismus


0

Vererbung ist, wenn Klasse A alle nicht statisch geschützten / öffentlichen Methoden / Felder von allen ihren Eltern bis zum Objekt erbt.


0

Wenn Sie JAVA verwenden, ist dies so einfach:

Polymorphismus verwendet geerbte Methoden, aber "überschreiben" sie, um etwas anderes zu tun (oder dasselbe, wenn Sie Super nennen, wäre technisch gesehen nicht polymorph).

Korrigiere mich, wenn ich falsch liege.


0

Der Hauptzweck des Polymorphismus : Um Referenzgröße zu erstellen Superklasse und die Halteunterklasse = object> ein Objekt durchführt mehrere Verhaltensweisen .

In Vererbung , Unterklasse erbt die Eigenschaften der Superklasse .


0

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


0

Mit Inheritance wird die Implementierung in der Oberklasse definiert - das Verhalten wird also vererbt.

class Animal
{
  double location;
  void move(double newLocation)
  {
    location = newLocation;
  }
}

class Dog extends Animal;

Bei Polymorphism wird die Implementierung in der Unterklasse definiert - daher wird nur die Schnittstelle vererbt.

interface Animal
{
  void move(double newLocation);
}

class Dog implements Animal
{
  double location;
  void move(double newLocation)
  {
    location = newLocation;
  }
}

0

Polymorphismus wird durch Vererbung in erreicht Java.

├── Animal
└── (instances)
    ├── Cat
    ├── Hamster
    ├── Lion
    └── Moose

├── interface-for-diet
   ├── Carnivore
   └── Herbivore
├── interface-for-habitat
   ├── Pet
   └── Wild

public class Animal {
    void breath() {
    };
}

public interface Carnivore {
    void loveMeat();
}

public interface Herbivore {
    void loveGreens();
}

public interface Pet {
    void liveInside();
}

public interface Wild {
    void liveOutside();
}

public class Hamster extends Animal implements Herbivore, Pet {

    @Override
    public void liveInside() {
        System.out.println("I live in a cage and my neighbor is a Gerbil");
    }

    @Override
    public void loveGreens() {
        System.out.println("I eat Carrots, Grapes, Tomatoes, and More");
    }
}

public class Cat extends Animal implements Carnivore, Pet {
    @Override
    public void liveInside() {
        System.out.println("I live in a cage and my neighbr is a Gerbil");
    }

    @Override
    public void loveMeat() {
        System.out.println("I eat Tuna, Chicken, and More");
    }
}

public class Moose extends Animal implements Herbivore, Wild {

    @Override
    public void liveOutside() {
        System.out.println("I live in the forest");
    }

    @Override
    public void loveGreens() {
        System.out.println("I eat grass");
    }
}

public class Lion extends Animal implements Carnivore, Wild {

    @Override
    public void liveOutside() {
        System.out.println("I live in the forest");
    }

    @Override
    public void loveMeat() {
        System.out.println("I eat Moose");
    }
}

HamsterKlasse Erbt Struktur aus Animal, Herbivoreund Petzeigen Polymorphe Behaviorismus eines inländischen Haustier.

CatKlasse Erbt Struktur aus Animal, Carnivoreund Petzeigen auch Polymorphe Behaviorismus eines inländischen Haustier.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.