In Bezug auf Java, wenn jemand fragt:
Was ist Polymorphismus?
Wäre Überladen oder Überschreiben eine akzeptable Antwort?
Ich denke, da steckt noch ein bisschen mehr dahinter.
Wenn Sie eine abstrakte Basisklasse hatten, die eine Methode ohne Implementierung definiert hat, und diese Methode in der Unterklasse definiert haben, ist das immer noch überschreibend?
Ich denke, Überladung ist nicht die richtige Antwort.
java
oop
polymorphism
overloading
overriding
Brian G.
quelle
quelle
Antworten:
Der klarste Weg, Polymorphismus auszudrücken, ist über eine abstrakte Basisklasse (oder Schnittstelle).
Diese Klasse ist abstrakt, weil die
goPee()
Methode für Menschen nicht definierbar ist. Es ist nur für die Unterklassen Männlich und Weiblich definierbar. Mensch ist auch ein abstraktes Konzept - Sie können keinen Menschen erschaffen, der weder männlich noch weiblich ist. Es muss der eine oder andere sein.Daher verschieben wir die Implementierung mithilfe der abstrakten Klasse.
und
Jetzt können wir einem ganzen Raum voller Menschen sagen, dass sie pinkeln sollen.
Wenn Sie dies ausführen, erhalten Sie:
quelle
goPee
auch kein Gravitationsfeld als Eingabe. Diese Abhängigkeit vom globalen Zustand erschwert das Testen von EinheitenCatheterizedIntersexAstronaut
und zeigt, dass Unterklassen möglicherweise nicht immer die beste Methode für die Zusammensetzung von Merkmalen sind.Polymorphismus ist die Fähigkeit einer Klasseninstanz, sich so zu verhalten, als wäre sie eine Instanz einer anderen Klasse in ihrem Vererbungsbaum, meistens einer ihrer Vorfahrenklassen. In Java erben beispielsweise alle Klassen von Object. Daher können Sie eine Variable vom Typ Object erstellen und ihr eine Instanz einer beliebigen Klasse zuweisen.
Ein Overrideist eine Art von Funktion, die in einer Klasse auftritt, die von einer anderen Klasse erbt. Eine Überschreibungsfunktion "ersetzt" eine von der Basisklasse geerbte Funktion, tut dies jedoch so, dass sie auch dann aufgerufen wird, wenn eine Instanz ihrer Klasse durch Polymorphismus vorgibt, ein anderer Typ zu sein. Mit Bezug auf das vorherige Beispiel können Sie Ihre eigene Klasse definieren und die Funktion toString () überschreiben. Da diese Funktion von Object geerbt wird, ist sie weiterhin verfügbar, wenn Sie eine Instanz dieser Klasse in eine Variable vom Typ Objekt kopieren. Wenn Sie toString () für Ihre Klasse aufrufen, während sie vorgibt, ein Objekt zu sein, ist normalerweise die Version von toString, die tatsächlich ausgelöst wird, die für Object selbst definierte. Da es sich bei der Funktion jedoch um eine Überschreibung handelt, wird die Definition von toString () aus Ihrer Klasse auch dann verwendet, wenn die Klasseninstanz '
Beim Überladen werden mehrere Methoden mit demselben Namen, aber unterschiedlichen Parametern definiert. Es hat nichts mit Überschreiben oder Polymorphismus zu tun.
quelle
Ad hoc polymorphism
ist das, was Sie in Ihrem Abschnitt Überladen beschrieben haben, und es handelt sich um Polymorphismus.Polymorphismus bedeutet mehr als eine Form, wobei dasselbe Objekt je nach Anforderung unterschiedliche Operationen ausführt.
Polymorphismus kann auf zwei Arten erreicht werden:
Methodenüberladung bedeutet, dass zwei oder mehr Methoden in derselben Klasse unter Verwendung desselben Methodennamens geschrieben werden, die Übergabeparameter jedoch unterschiedlich sind.
Das Überschreiben von Methoden bedeutet, dass wir die Methodennamen in den verschiedenen Klassen verwenden. Dies bedeutet, dass die Methode der übergeordneten Klasse in der untergeordneten Klasse verwendet wird.
In Java kann eine Superklassenreferenzvariable das Unterklassenobjekt enthalten, um Polymorphismus zu erzielen.
Um den Polymorphismus zu erreichen, muss jeder Entwickler im Projekt dieselben Methodennamen verwenden.
quelle
Hier ist ein Beispiel für Polymorphismus in Pseudo-C # / Java:
Die Hauptfunktion kennt den Typ des Tieres nicht und hängt vom Verhalten einer bestimmten Implementierung der MakeNoise () -Methode ab.
Edit: Sieht so aus, als hätte Brian mich bis zum Anschlag geschlagen. Komisch, dass wir das gleiche Beispiel verwendet haben. Der obige Code soll jedoch zur Verdeutlichung der Konzepte beitragen.
quelle
Sowohl Überschreiben als auch Überladen werden verwendet, um Polymorphismus zu erreichen.
Sie könnten eine Methode in einer Klasse haben, die in einer oder mehreren Unterklassen überschrieben wird . Die Methode führt verschiedene Aktionen aus, je nachdem, welche Klasse zum Instanziieren eines Objekts verwendet wurde.
Sie könnten auch eine Methode haben, die mit zwei oder mehr Argumenten überladen ist . Die Methode führt verschiedene Aktionen aus, die auf den übergebenen Argumenttypen basieren.
quelle
Sie haben Recht, dass Überladung nicht die Antwort ist.
Weder ist übergeordnet. Überschreiben ist das Mittel, mit dem Sie Polymorphismus erhalten. Polymorphismus ist die Fähigkeit eines Objekts, das Verhalten je nach Typ zu variieren. Dies lässt sich am besten demonstrieren, wenn der Aufrufer eines Objekts, das Polymorphismus aufweist, nicht weiß, um welchen spezifischen Typ es sich bei dem Objekt handelt.
quelle
Insbesondere wenn Sie sagen, dass Überladen oder Überschreiben nicht das vollständige Bild ergibt. Polymorphismus ist einfach die Fähigkeit eines Objekts, sein Verhalten basierend auf seinem Typ zu spezialisieren.
Ich würde einigen der Antworten hier nicht zustimmen, da Überladung eine Form des Polymorphismus (parametrischer Polymorphismus) ist, falls sich eine Methode mit demselben Namen unterschiedlich verhalten kann und unterschiedliche Parametertypen ergibt. Ein gutes Beispiel ist die Überlastung des Bedieners. Sie können "+" definieren, um verschiedene Arten von Parametern zu akzeptieren - beispielsweise Zeichenfolgen oder Ints - und basierend auf diesen Typen verhält sich "+" unterschiedlich.
Polymorphismus umfasst auch Vererbungs- und überschreibende Methoden, obwohl sie im Basistyp abstrakt oder virtuell sein können. In Bezug auf den vererbungsbasierten Polymorphismus unterstützt Java nur die Vererbung einzelner Klassen, wodurch das polymorphe Verhalten auf das einer einzelnen Kette von Basistypen beschränkt wird. Java unterstützt die Implementierung mehrerer Schnittstellen, was eine weitere Form des polymorphen Verhaltens darstellt.
quelle
Polymorphismus bedeutet einfach "viele Formen".
Es ist keine Vererbung erforderlich, um ... zu erreichen, da die Schnittstellenimplementierung, die überhaupt keine Vererbung ist, polymorphen Anforderungen dient. Die Schnittstellenimplementierung dient wohl den polymorphen Anforderungen "besser" als die Vererbung.
Würden Sie zum Beispiel eine Superklasse erstellen, um alle Dinge zu beschreiben, die fliegen können? Ich sollte nicht denken. Am besten erstellen Sie eine Schnittstelle, die den Flug beschreibt, und lassen sie dabei.
Da Schnittstellen das Verhalten beschreiben und Methodennamen das Verhalten (für den Programmierer) beschreiben, ist es nicht allzu weit entfernt, die Überladung von Methoden als eine geringere Form des Polymorphismus zu betrachten.
quelle
Das klassische Beispiel: Hunde und Katzen sind Tiere, Tiere haben die Methode makeNoise. Ich kann eine Reihe von Tieren durchlaufen, die makeNoise für sie aufrufen, und erwarten, dass sie dort die entsprechende Implementierung durchführen.
Der Rufcode muss nicht wissen, um welches Tier es sich handelt.
Das ist, was ich als Polymorphismus betrachte.
quelle
Polymorphismus ist die Fähigkeit eines Objekts, in mehreren Formen zu erscheinen. Dies beinhaltet die Verwendung von Vererbung und virtuellen Funktionen, um eine Familie von Objekten zu erstellen, die ausgetauscht werden können. Die Basisklasse enthält die Prototypen der virtuellen Funktionen, möglicherweise nicht implementiert oder mit Standardimplementierungen, wie es die Anwendung vorschreibt, und die verschiedenen abgeleiteten Klassen implementieren sie jeweils unterschiedlich, um unterschiedliche Verhaltensweisen zu beeinflussen.
quelle
Weder:
Überladen ist, wenn Sie denselben Funktionsnamen haben, der unterschiedliche Parameter akzeptiert.
Überschreiben ist, wenn eine untergeordnete Klasse die Methode eines Elternteils durch eine eigene ersetzt (dies stellt an sich keinen Polymorphismus dar).
Polymorphismus ist eine späte Bindung, z. B. werden die Basisklassenmethoden (übergeordnete Methoden) aufgerufen, aber erst zur Laufzeit weiß die Anwendung, was das eigentliche Objekt ist - es kann sich um eine untergeordnete Klasse handeln, deren Methoden unterschiedlich sind. Dies liegt daran, dass jede untergeordnete Klasse verwendet werden kann, in der eine Basisklasse definiert ist.
In Java sehen Sie viel Polymorphismus in der Sammlungsbibliothek:
List ist die Basisklasse. Der Compiler hat keine Ahnung, ob Sie eine verknüpfte Liste, einen Vektor, ein Array oder eine benutzerdefinierte Listenimplementierung zählen, solange sie sich wie eine Liste verhält:
Wenn Sie überladen wären, hätten Sie:
und die richtige Version von countStuff () wird vom Compiler ausgewählt, um den Parametern zu entsprechen.
quelle
Obwohl Polymorphismus in diesem Beitrag bereits ausführlich erklärt wird, möchte ich mehr Wert darauf legen, warum ein Teil davon ist.
Versuchen wir, eine einfache Anwendung für einen Fernseher mit und ohne Vererbung / Polymorphismus zu erstellen. Veröffentlichen Sie jede Version der Anwendung, wir machen eine kleine Retrospektive.
Angenommen, Sie sind Softwareentwickler bei einem Fernsehunternehmen und werden gebeten, Software für Lautstärkeregler, Helligkeitsregler und Farbregler zu schreiben, um deren Werte auf Benutzerbefehl zu erhöhen und zu verringern.
Sie beginnen mit dem Schreiben von Klassen für jede dieser Funktionen, indem Sie hinzufügen
Jetzt können Sie unsere erste Version der Arbeitsanwendung bereitstellen. Zeit, die bisher geleistete Arbeit zu analysieren.
Sie entscheiden sich, damit zu leben, solange Ihre Anwendung wie erwartet funktioniert.
Sie beginnen mit dem Schreiben einer neuen Klasse (ResetFunctionV2) für die neue Funktionalität und ordnen den Benutzereingabe-Zuordnungscode für diese neue Funktion zu.
So haben Sie Ihre Anwendung mit der Reset-Funktion bereit. Aber jetzt fängst du an, das zu realisieren
Jetzt denken Sie, dass diese neue Funktion, die hinzugefügt werden soll, der Funktion zum Zurücksetzen ähnelt und Probleme mit der Anwendung (V2) multipliziert werden, wenn Sie Ihre Anwendung nicht neu faktorisieren.
Sie denken über die Verwendung der Vererbung nach, damit Sie die polymorphen Fähigkeiten von JAVA nutzen können, und fügen eine neue abstrakte Klasse (ControllerV3) hinzu
Mit diesen Verbesserungen haben Sie Version 3 Ihrer TV-Anwendung bereit.
Obwohl die meisten der in der Problemliste von V2 aufgeführten Probleme außer behoben wurden
Auch hier denken Sie daran, dieses Problem zu lösen, da Sie jetzt auch eine andere Funktion (Treiberaktualisierung beim Start) implementieren müssen. Wenn Sie das Problem nicht beheben, wird es auch auf neue Funktionen repliziert.
Sie teilen also den in der abstrakten Klasse definierten Vertrag und schreiben 2 Schnittstellen für
Und lassen Sie sie von Ihrer ersten konkreten Klasse wie folgt implementieren
Hoffe das hilft :-)
quelle
Der Begriff Überladung bezieht sich auf mehrere Versionen von etwas mit demselben Namen, normalerweise Methoden mit unterschiedlichen Parameterlisten
Diese Funktionen können also dasselbe tun, aber Sie haben die Möglichkeit, sie mit einer ID oder einem Namen aufzurufen. Hat nichts mit Vererbung, abstrakten Klassen usw. zu tun.
Überschreiben bezieht sich normalerweise auf Polymorphismus, wie Sie in Ihrer Frage beschrieben haben
quelle
Überladen ist, wenn Sie 2 Methoden mit demselben Namen, aber unterschiedlichen Parametern definieren
Beim Überschreiben ändern Sie das Verhalten der Basisklasse über eine gleichnamige Funktion in einer Unterklasse.
Polymorphismus ist also mit Überschreiben verbunden, aber nicht wirklich Überladen.
Wenn mir jedoch jemand eine einfache Antwort auf die Frage "Was ist Polymorphismus?" Mit "Überschreiben" gab. Ich würde um weitere Erklärung bitten.
quelle
Das Überschreiben ähnelt eher dem Ausblenden einer geerbten Methode durch Deklarieren einer Methode mit demselben Namen und derselben Signatur wie die Methode der oberen Ebene (Supermethode). Dadurch wird der Klasse ein polymorphes Verhalten hinzugefügt. Mit anderen Worten, die Entscheidung, welche Level-Methode aufgerufen werden soll, wird zur Laufzeit und nicht zur Kompilierungszeit getroffen. Dies führt zum Konzept der Schnittstelle und Implementierung.
quelle
Aus Java Tutorial
Die Wörterbuchdefinition des 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.
Durch Betrachten der Beispiele und Definition überschreiben sollte das als Antwort akzeptiert werden.
Zu Ihrer zweiten Anfrage:
Es sollte als überschreibend bezeichnet werden.
Schauen Sie sich dieses Beispiel an, um verschiedene Arten des Überschreibens zu verstehen.
super.methodName()
als erste Anweisung aufgerufen wirdCode-Auszug:
Ausgabe:
quelle
Ich denke Leute, ihr mischt Konzepte. Polymorphismus ist die Fähigkeit eines Objekts, sich zur Laufzeit anders zu verhalten. Um dies zu erreichen, benötigen Sie zwei Voraussetzungen:
Having said, die Überlastung Mittel , etwas anderes zu überschreiben , je nach der Sprache , die Sie verwenden. Zum Beispiel gibt es in Java kein Überschreiben, sondern Überladen . Überladene Methoden mit einer anderen Signatur als die Basisklasse sind in der Unterklasse verfügbar. Andernfalls würden sie überschrieben (bitte Sie, dass ich jetzt meine, dass es keine Möglichkeit gibt, Ihre Basisklassenmethode von außerhalb des Objekts aufzurufen).
In C ++ ist das jedoch nicht so. Jede überladene Methode, unabhängig davon, ob die Signatur gleich ist oder nicht (unterschiedliche Menge, unterschiedlicher Typ), wird ebenfalls überschrieben . Das heißt, heute ist die Methode der Basisklasse in der Unterklasse nicht mehr verfügbar, wenn sie offensichtlich von außerhalb des Unterklassenobjekts aufgerufen wird.
Die Antwort ist also, wenn es um das Überladen von Java geht . In jeder anderen Sprache kann dies anders sein als in C ++
quelle
Polymorphismus ist in seiner Bedeutung wahrscheinlicher ... als in Java zu überschreiben
Es geht um ein unterschiedliches Verhalten des SAME-Objekts in verschiedenen Situationen (Programmierweise ... können Sie verschiedene ARGUMENTE aufrufen)
Ich denke, das folgende Beispiel wird Ihnen helfen zu verstehen ... Obwohl es kein reiner Java-Code ist ...
Aber wenn wir das ARGUMENT ändern ... wird das VERHALTEN geändert ...
Die Person (hier das "Objekt") ist dieselbe ...
quelle
Polymorphismus ist eine mehrfache Implementierung eines Objekts oder man könnte mehrere Formen eines Objekts sagen. Nehmen wir an, Sie haben eine Klasse
Animals
als abstrakte Basisklasse und eine Methode namens,movement()
die definiert, wie sich das Tier bewegt. In Wirklichkeit haben wir verschiedene Arten von Tieren, und sie bewegen sich auch unterschiedlich, einige mit 2 Beinen, andere mit 4 und einige ohne Beine usw. Ummovement()
jedes Tier auf der Erde anders zu definieren , müssen wir Polymorphismus anwenden. Sie müssen jedoch mehr Klassen definieren, z. B. KlassenDogs
Cats
Fish
usw. Dann müssen Sie diese Klassen aus der Basisklasse erweiternAnimals
und ihre Methodemovement()
mit einer neuen Bewegungsfunktionalität überschreiben, die auf jedem Tier basiert, das Sie haben. Sie können auch verwendenInterfaces
um das zu erreichen. Das Schlüsselwort hier ist überschreibend, Überladung ist anders und wird nicht als Polymorphismus betrachtet. Beim Überladen können Sie mehrere Methoden "mit demselben Namen", aber mit unterschiedlichen Parametern für dasselbe Objekt oder dieselbe Klasse definieren.quelle
Polymorphismus bezieht sich auf die Fähigkeit einer Sprache, verschiedene Objekte unter Verwendung einer einzigen Schnittstelle einheitlich behandeln zu lassen; Als solches hängt es mit dem Überschreiben zusammen, sodass die Schnittstelle (oder die Basisklasse) polymorph ist. Der Implementierer ist das Objekt, das überschreibt (zwei Flächen derselben Medaille).
Auf jeden Fall lässt sich der Unterschied zwischen den beiden Begriffen besser mit anderen Sprachen wie c ++ erklären: Ein polymorphes Objekt in c ++ verhält sich wie das Java-Gegenstück, wenn die Basisfunktion virtuell ist, aber wenn die Methode nicht virtuell ist, wird der Codesprung statisch aufgelöst . und der wahre Typ, der zur Laufzeit nicht überprüft wird, beinhaltet Polymorphismus die Fähigkeit eines Objekts, sich abhängig von der Schnittstelle, die für den Zugriff darauf verwendet wird, unterschiedlich zu verhalten; Lassen Sie mich ein Beispiel im Pseudocode machen:
(Angenommen, makeRumor ist NICHT virtuell)
Java bietet nicht wirklich dieses Maß an Polymorphismus (auch Objekt-Slicing genannt).
Tier a = neuer Hund (); Hund b = neuer Hund ();
In beiden Fällen wird nur woff gedruckt, da sich a und b auf Klassenhund beziehen
quelle
quelle