Was ist Polymorphismus, wofür ist er und wie wird er verwendet?
Was ist Polymorphismus, wofür ist er und wie wird er verwendet?
Antworten:
Wenn Sie über die griechischen Wurzeln des Begriffs nachdenken, sollte dies offensichtlich werden.
Polymorphismus ist also die Fähigkeit (bei der Programmierung), dieselbe Schnittstelle für unterschiedliche zugrunde liegende Formen (Datentypen) darzustellen.
In vielen Sprachen sind beispielsweise Ganzzahlen und Gleitkommazahlen implizit polymorph, da Sie unabhängig von der Tatsache, dass die Typen unterschiedlich sind, addieren, subtrahieren, multiplizieren usw. können. Sie werden im üblichen Sinne selten als Objekte betrachtet.
Auf die gleiche Weise kann eine Klasse wie BigDecimal
oder Rational
oder Imaginary
auch diese Operationen bereitstellen, obwohl sie mit unterschiedlichen Datentypen arbeiten.
Das klassische Beispiel ist die Shape
Klasse und alle Klassen, die davon erben können (Quadrat, Kreis, Dodekaeder, unregelmäßiges Polygon, Splat usw.).
Mit Polymorphismus hat jede dieser Klassen unterschiedliche zugrunde liegende Daten. Eine Punktform benötigt nur zwei Koordinaten (vorausgesetzt, sie befindet sich natürlich in einem zweidimensionalen Raum). Ein Kreis braucht einen Mittelpunkt und einen Radius. Ein Quadrat oder Rechteck benötigt zwei Koordinaten für die obere linke und untere rechte Ecke und (möglicherweise) eine Drehung. Ein unregelmäßiges Polygon benötigt eine Reihe von Linien.
Indem Sie die Klasse sowohl für ihren Code als auch für ihre Daten verantwortlich machen, können Sie Polymorphismus erzielen. In diesem Beispiel hätte jede Klasse ihre eigene Draw()
Funktion und der Client-Code könnte einfach Folgendes tun:
shape.Draw()
um das richtige Verhalten für jede Form zu erhalten.
Dies steht im Gegensatz zu der alten Vorgehensweise, bei der der Code von den Daten getrennt war und Sie Funktionen wie drawSquare()
und hatten drawCircle()
.
Objektorientierung, Polymorphismus und Vererbung sind eng miteinander verbundene Konzepte und wichtig zu wissen. Während meiner langen Karriere gab es viele "Silberkugeln", die im Grunde nur zischten, aber das OO-Paradigma hat sich als gut herausgestellt. Lerne es, verstehe es, liebe es - du wirst es nicht bereuen :-)
(a) Ich habe das ursprünglich als Witz geschrieben, aber es hat sich als richtig und daher nicht so lustig herausgestellt. Das Monomer Styrol wird zufällig aus Kohlenstoff und Wasserstoff hergestellt , und Polystyrol wird aus Gruppen davon hergestellt .C8H8
(C8H8)n
Vielleicht hätte ich sagen sollen, dass ein Polyp viele Vorkommen des Briefes waren, p
obwohl, jetzt, wo ich den Witz erklären musste, auch das nicht lustig erscheint.
Manchmal solltest du einfach aufhören, während du zurück bist :-)
Poly = many and Morph = change or form
Polymorphismus ist, wenn Sie ein Objekt als generische Version von etwas behandeln können, aber wenn Sie darauf zugreifen, bestimmt der Code, um welchen genauen Typ es sich handelt, und ruft den zugehörigen Code auf.
Hier ist ein Beispiel in C #. Erstellen Sie vier Klassen in einer Konsolenanwendung:
public abstract class Vehicle
{
public abstract int Wheels;
}
public class Bicycle : Vehicle
{
public override int Wheels()
{
return 2;
}
}
public class Car : Vehicle
{
public override int Wheels()
{
return 4;
}
}
public class Truck : Vehicle
{
public override int Wheels()
{
return 18;
}
}
Erstellen Sie nun im Main () des Moduls Folgendes für die Konsolenanwendung:
public void Main()
{
List<Vehicle> vehicles = new List<Vehicle>();
vehicles.Add(new Bicycle());
vehicles.Add(new Car());
vehicles.Add(new Truck());
foreach (Vehicle v in vehicles)
{
Console.WriteLine(
string.Format("A {0} has {1} wheels.",
v.GetType().Name, v.Wheels));
}
}
In diesem Beispiel erstellen wir eine Liste der Basisklasse Fahrzeug, die nicht weiß, wie viele Räder jede ihrer Unterklassen hat, aber weiß, dass jede Unterklasse dafür verantwortlich ist, zu wissen, wie viele Räder sie hat.
Wir fügen dann ein Fahrrad, ein Auto und einen LKW zur Liste hinzu.
Als nächstes können wir jedes Fahrzeug in der Liste durchlaufen und alle identisch behandeln. Wenn wir jedoch auf die Eigenschaften "Räder" jedes Fahrzeugs zugreifen, delegiert die Fahrzeugklasse die Ausführung dieses Codes an die entsprechende Unterklasse.
Dieser Code wird als polymorph bezeichnet, da der genaue Code, der ausgeführt wird, durch die Unterklasse bestimmt wird, auf die zur Laufzeit verwiesen wird.
Ich hoffe das hilft dir.
Class_Excel
, Class_CSV
um aufgerufen zu werden oder eine Reader
Klasse aufgerufen zu haben. In jedem Fall eine Art Iterativ, wenn / then / else irgendwo gespeichert werden muss.
Von Verstehen und Anwenden von Polymorphismus in PHP , Danke Steve Guidetti.
Polymorphismus ist ein langes Wort für ein sehr einfaches Konzept.
Polymorphismus beschreibt ein Muster in der objektorientierten Programmierung, bei dem Klassen unterschiedliche Funktionen haben, während sie eine gemeinsame Schnittstelle verwenden.
Das Schöne am Polymorphismus ist, dass der Code, der mit den verschiedenen Klassen arbeitet, nicht wissen muss, welche Klasse er verwendet, da sie alle auf die gleiche Weise verwendet werden. Eine reale Analogie für Polymorphismus ist ein Knopf. Jeder weiß, wie man einen Knopf benutzt: Sie üben einfach Druck darauf aus. Was eine Schaltfläche „tut“, hängt jedoch davon ab, mit was sie verbunden ist und in welchem Kontext sie verwendet wird. Das Ergebnis hat jedoch keinen Einfluss darauf, wie sie verwendet wird. Wenn Ihr Chef Sie auffordert, einen Knopf zu drücken, verfügen Sie bereits über alle Informationen, die zur Ausführung der Aufgabe erforderlich sind.
In der Programmierwelt wird Polymorphismus verwendet, um Anwendungen modularer und erweiterbarer zu machen. Anstelle von chaotischen bedingten Anweisungen, die verschiedene Vorgehensweisen beschreiben, erstellen Sie austauschbare Objekte, die Sie je nach Ihren Anforderungen auswählen. Das ist das grundlegende Ziel des Polymorphismus.
Wenn jemand diesen Leuten CUT sagt
Was wird passieren?
Die obige Darstellung zeigt also, was Polymorphismus (gleicher Name, unterschiedliches Verhalten) in OOP ist.
Wenn Sie zu einem Interview gehen und der Interviewer Sie bittet, in demselben Raum, in dem wir sitzen, ein Live-Beispiel für Polymorphismus zu erzählen / zu zeigen, sagen wir:
Antwort - Tür / Fenster
Fragen Sie sich, wie?
Durch Tür / Fenster - eine Person kann kommen, Luft kann kommen, Licht kann kommen, Regen kann kommen usw.
Um es besser und auf einfache Weise zu verstehen, habe ich das obige Beispiel verwendet. Wenn Sie eine Referenz für den Code benötigen, folgen Sie den obigen Antworten.
.foo()
Methode haben, sollten sie eine gemeinsame Schnittstelle haben. Dies ist jedoch nicht wahr und führt zu falschen Abstraktionen. Eine Schnittstelle sollte eine Rolle definieren , die gespielt werden soll. Diese kann viele verschiedene Implementierungen haben, aber alle beziehen sich auf denselben Eingabesatz und geben etwas von demselben Ausgabesatz zurück. Die Eingabe in a x.cut(...)
für einen Chirurgen, Stylisten oder Schauspieler ist nicht dieselbe, und die Ausgabe ist auch nicht dieselbe.
Der Präsident der Vereinigten Staaten setzt Polymorphismus ein. Wie? Nun, er hat viele Berater:
Jeder sollte nur für eines verantwortlich sein: Beispiel:
Der Präsident ist kein Experte für Zinkbeschichtung oder Quantenphysik. Er weiß nicht viele Dinge - aber er weiß nur eines: wie man das Land regiert.
Ähnlich verhält es sich mit Code: Bedenken und Verantwortlichkeiten sollten auf die relevanten Klassen / Personen aufgeteilt werden. Andernfalls hätte der Präsident buchstäblich alles auf der Welt - die gesamte Wikipedia. Stellen Sie sich vor, Sie hätten die gesamte Wikipedia in einer Klasse Ihres Codes: Es wäre ein Albtraum, sie aufrechtzuerhalten.
Warum ist das eine schlechte Idee für einen Präsidenten, all diese spezifischen Dinge zu wissen?
Wenn der Präsident den Leuten ausdrücklich sagen würde, was zu tun ist, würde dies bedeuten, dass der Präsident genau wissen muss , was zu tun ist. Wenn der Präsident bestimmte Dinge selbst wissen muss, bedeutet dies, dass Sie eine Änderung an zwei Stellen vornehmen müssen, nicht nur an einer.
Wenn die EPA beispielsweise die Verschmutzungsgesetze ändert, müssen Sie in diesem Fall die EPA-Klasse und auch die President-Klasse ändern . Das Ändern von Code an zwei statt an einer Stelle kann gefährlich sein - da die Wartung viel schwieriger ist.
Gibt es einen besseren Ansatz?
Es gibt einen besseren Ansatz: Der Präsident muss die Einzelheiten von nichts kennen - er kann den besten Rat von Leuten verlangen, die speziell damit beauftragt sind, diese Dinge zu tun.
Er kann einen polymorphen Ansatz verwenden, um das Land zu regieren.
Beispiel - Verwendung eines polymorphen Ansatzes:
Der Präsident bittet die Leute nur, ihn zu beraten - und genau das tut er im wirklichen Leben - und genau das sollte ein guter Präsident tun. Seine Berater reagieren alle unterschiedlich, aber sie alle wissen, was der Präsident damit meint: Advise (). Er hat Hunderte von Leuten, die in sein Büro strömen. Es ist eigentlich egal, wer sie sind. Der Präsident weiß nur, dass er, wenn er sie um "Beratung" bittet, weiß, wie er entsprechend reagieren soll :
public class MisterPresident
{
public void RunTheCountry()
{
// assume the Petraeus and Condi classes etc are instantiated.
petraeus.Advise(); // # Petraeus says send 100,000 troops to Fallujah
condolezza.Advise(); // # she says negotiate trade deal with Iran
healthOfficials.Advise(); // # they say we need to spend $50 billion on ObamaCare
}
}
Dieser Ansatz ermöglicht es dem Präsidenten, das Land buchstäblich zu regieren, ohne etwas über militärische Angelegenheiten, das Gesundheitswesen oder die internationale Diplomatie zu wissen: Die Details werden den Experten überlassen. Das einzige, was der Präsident wissen muss, ist Folgendes: "Advise ()".
Was Sie nicht wollen:
public class MisterPresident
{
public void RunTheCountry()
{
// people walk into the Presidents office and he tells them what to do
// depending on who they are.
// Fallujah Advice - Mr Prez tells his military exactly what to do.
petraeus.IncreaseTroopNumbers();
petraeus.ImproveSecurity();
petraeus.PayContractors();
// Condi diplomacy advice - Prez tells Condi how to negotiate
condi.StallNegotiations();
condi.LowBallFigure();
condi.FireDemocraticallyElectedIraqiLeaderBecauseIDontLikeHim();
// Health care
healthOfficial.IncreasePremiums();
healthOfficial.AddPreexistingConditions();
}
}
NEIN! NEIN! NEIN! Im obigen Szenario erledigt der Präsident die ganze Arbeit: Er weiß, wie sich die Truppenzahlen und die bereits bestehenden Bedingungen erhöhen. Dies bedeutet, dass der Präsident, wenn sich die Politik im Nahen Osten ändert, seine Kommandos sowie die Petraeus-Klasse ändern müsste . Wir sollten nur die Petraeus-Klasse wechseln müssen, weil der Präsident sich nicht in solchen Details festsetzen muss. Er muss nichts über die Details wissen. Er muss nur wissen, dass alles erledigt ist, wenn er eine Bestellung aufgibt. Alle Details sollten den Experten überlassen werden.
Auf diese Weise kann der Präsident das tun, was er am besten kann: allgemeine Richtlinien festlegen, gut aussehen und Golf spielen: P.
Das ist in der Tat Polymorphismus, kurz gesagt. Wie genau wird es gemacht? Durch "Implementieren einer gemeinsamen Schnittstelle" oder durch Verwenden einer Basisklasse (Vererbung) - siehe die obigen Antworten, die dies genauer beschreiben. (Um dieses Konzept klarer zu verstehen, müssen Sie wissen, was eine Schnittstelle ist, und Sie müssen verstehen, was Vererbung ist. Ohne das könnten Sie Schwierigkeiten haben.)
Mit anderen Worten, Petraeus, Condi und HealthOfficials wären Klassen, die "eine Schnittstelle implementieren" - nennen wir es die IAdvisor
Schnittstelle, die nur eine Methode enthält : Advise()
. Aber jetzt kommen wir zu den Einzelheiten.
Das wäre ideal
public class MisterPresident
{
// You can pass in any advisor: Condi, HealthOfficials,
// Petraeus etc. The president has no idea who it will
// be. But he does know that he can ask them to "advise"
// and that's all Mr Prez cares for.
public void RunTheCountry(IAdvisor governmentOfficer)
{
governmentOfficer.Advise();
}
}
public class USA
{
MisterPresident president;
public USA(MisterPresident president)
{
this.president = president;
}
public void ImplementPolicy()
{
IAdvisor governmentOfficer = getAdvisor(); // Returns an advisor: could be condi, or petraus etc.
president.RunTheCountry(governmentOfficer);
}
}
Alles, was Sie wirklich wissen müssen, ist Folgendes:
Ich hoffe es hilft dir wirklich. Wenn du nichts verstehst, schreibe einen Kommentar und ich werde es erneut versuchen.
if healthAdvisor? then do this:
und if petraus then do that etc.
dieses Muster muss wiederholt werden, und das ist unnötig und kompliziert. siehe oben bearbeiten.
Polymorphismus ist die Fähigkeit, eine Objektklasse so zu behandeln, als wäre sie die übergeordnete Klasse.
Angenommen, es gibt eine Klasse namens Animal und eine Klasse namens Dog, die von Animal erbt. Polymorphismus ist die Fähigkeit, jedes Hundeobjekt wie folgt als Tierobjekt zu behandeln:
Dog* dog = new Dog;
Animal* animal = dog;
classes have different functionality while sharing a common interface
Polymorphismus:
Es ist das Konzept der objektorientierten Programmierung. Die Fähigkeit verschiedener Objekte, auf ihre eigene Weise auf identische Nachrichten zu reagieren, wird als Polymorphismus bezeichnet.
Polymorphismus resultiert aus der Tatsache, dass jede Klasse in ihrem eigenen Namespace lebt. Die in einer Klassendefinition zugewiesenen Namen stehen nicht in Konflikt mit Namen, die an einer anderen Stelle außerhalb der Klassendefinition zugewiesen wurden. Dies gilt sowohl für die Instanzvariablen in der Datenstruktur eines Objekts als auch für die Methoden des Objekts:
So wie sich die Felder einer C-Struktur in einem geschützten Namespace befinden, befinden sich auch die Instanzvariablen eines Objekts.
Methodennamen sind ebenfalls geschützt. Im Gegensatz zu den Namen von C-Funktionen sind Methodennamen keine globalen Symbole. Der Name einer Methode in einer Klasse kann nicht mit Methodennamen in anderen Klassen in Konflikt stehen. Zwei sehr unterschiedliche Klassen können identisch benannte Methoden implementieren.
Methodennamen sind Teil der Schnittstelle eines Objekts. Wenn eine Nachricht gesendet wird, in der ein Objekt aufgefordert wird, etwas zu tun, benennt die Nachricht die Methode, die das Objekt ausführen soll. Da verschiedene Objekte Methoden mit demselben Namen haben können, muss die Bedeutung einer Nachricht relativ zu dem bestimmten Objekt verstanden werden, das die Nachricht empfängt. Dieselbe Nachricht, die an zwei verschiedene Objekte gesendet wird, kann zwei verschiedene Methoden aufrufen.
Der Hauptvorteil des Polymorphismus besteht darin, dass er die Programmierschnittstelle vereinfacht. Es können Konventionen festgelegt werden, die Klasse für Klasse wiederverwendet werden können. Anstatt für jede neue Funktion, die Sie einem Programm hinzufügen, einen neuen Namen zu erfinden, können dieselben Namen wiederverwendet werden. Die Programmierschnittstelle kann als eine Reihe abstrakter Verhaltensweisen beschrieben werden, ganz abgesehen von den Klassen, die sie implementieren.
Beispiele:
Beispiel 1: Hier ist ein einfaches Beispiel, das in Python 2.x geschrieben wurde .
class Animal:
def __init__(self, name): # Constructor of the class
self.name = name
def talk(self): # Abstract method, defined by convention only
raise NotImplementedError("Subclass must implement abstract method")
class Cat(Animal):
def talk(self):
return 'Meow!'
class Dog(Animal):
def talk(self):
return 'Woof! Woof!'
animals = [Cat('Missy'),
Dog('Lassie')]
for animal in animals:
print animal.name + ': ' + animal.talk()
Beispiel-2: Polymorphismus ist implementiert in Java unter Verwendung von Verfahren Überlastungen und Verfahren überschreiben Konzepte.
Betrachten wir das Beispiel eines Autos zur Diskussion des Polymorphismus. Nehmen Sie jede Marke wie Ford, Honda, Toyota, BMW, Benz usw., alles ist vom Typ Auto.
Aber jeder hat seine eigenen erweiterten Funktionen und fortschrittlicheren Technologien für sein Bewegungsverhalten.
Lassen Sie uns nun einen Basistyp Auto erstellen
Car.java
public class Car {
int price;
String name;
String color;
public void move(){
System.out.println("Basic Car move");
}
}
Lassen Sie uns das Ford Car-Beispiel implementieren.
Ford erweitert den Typ Auto, um alle seine Mitglieder (Eigenschaften und Methoden) zu erben.
Ford.java
public class Ford extends Car{
public void move(){
System.out.println("Moving with V engine");
}
}
Die obige Ford-Klasse erweitert die Car-Klasse und implementiert auch die move () -Methode. Obwohl Ford die Verschiebungsmethode bereits über die Vererbung zur Verfügung steht, hat Ford die Methode immer noch auf seine eigene Weise implementiert. Dies wird als Methodenüberschreibung bezeichnet.
Honda.java
public class Honda extends Car{
public void move(){
System.out.println("Move with i-VTEC engine");
}
}
Genau wie Ford erweitert Honda auch den Autotyp und implementiert die Bewegungsmethode auf seine eigene Weise.
Das Überschreiben von Methoden ist ein wichtiges Merkmal, um den Polymorphismus zu ermöglichen. Durch das Überschreiben von Methoden können die Untertypen die Funktionsweise der Methoden ändern, die durch die Vererbung verfügbar sind.
PolymorphismExample.java
public class PolymorphismExample {
public static void main(String[] args) {
Car car = new Car();
Car f = new Ford();
Car h = new Honda();
car.move();
f.move();
h.move();
}
}
Polymorphismus Beispiel Ausgabe:
In der Hauptmethode der PolymorphismExample-Klasse habe ich drei Objekte erstellt - Car, Ford und Honda. Alle drei Objekte werden vom Fahrzeugtyp referenziert.
Bitte beachten Sie hier einen wichtigen Punkt, dass sich ein Superklassentyp auf einen Objekttyp der Unterklasse beziehen kann, der umgekehrte Vers jedoch nicht möglich ist. Der Grund dafür ist, dass alle Mitglieder der Superklasse der Unterklasse mithilfe der Vererbung zur Verfügung stehen. Während der Kompilierungszeit versucht der Compiler zu bewerten, ob der von uns verwendete Referenztyp die Methode aufweist, auf die er zugreifen möchte.
Für die Referenzen car, f und h im PolymorphismExample existiert die Verschiebungsmethode vom Typ Car. Der Compiler besteht den Kompilierungsprozess also ohne Probleme.
Bei der Laufzeitausführung ruft die virtuelle Maschine jedoch die Methoden für die Objekte auf, bei denen es sich um Untertypen handelt. Daher wird die Methode move () aus ihren jeweiligen Implementierungen aufgerufen.
Alle Objekte sind also vom Typ Car, aber während der Laufzeit hängt die Ausführung von dem Objekt ab, auf dem der Aufruf erfolgt. Dies nennt man Polymorphismus.
Normalerweise bezieht sich dies auf die Fähigkeit eines Objekts vom Typ A, sich wie ein Objekt vom Typ B zu verhalten. Bei der objektorientierten Programmierung wird dies normalerweise durch Vererbung erreicht. Einige Wikipedia-Links, um mehr zu lesen:
EDIT: defekte Links behoben.
classes have different functionality while sharing a common interface
Polymorphismus ist dies:
class Cup {
int capacity
}
class TeaCup : Cup {
string flavour
}
class CoffeeCup : Cup {
string brand
}
Cup c = new CoffeeCup();
public int measure(Cup c) {
return c.capacity
}
Sie können nur einen Pokal anstelle einer bestimmten Instanz übergeben. Dies hilft im Allgemeinen, da Sie nicht für jeden Bechertyp eine bestimmte Measure () - Instanz angeben müssen
Ich weiß, dass dies eine ältere Frage mit vielen guten Antworten ist, aber ich möchte eine Antwort mit einem Satz hinzufügen:
Behandeln eines abgeleiteten Typs als wäre es sein Basistyp.
Es gibt viele Beispiele oben, die dies in Aktion zeigen, aber ich denke, dies ist eine gute, prägnante Antwort.
(Ich habe einen anderen Artikel über etwas ganz anderes durchgesehen ... und Polymorphismus ist aufgetaucht ... Jetzt dachte ich, ich wüsste, was Polymorphismus ist ... aber anscheinend nicht auf diese schöne Weise erklärt ... Wollte es irgendwo aufschreiben ... besser noch wird es teilen ...)
http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife
Lesen Sie weiter aus diesem Teil:
..... Polymorphismus. Das ist eine geekige Art zu sagen, dass auf verschiedene Substantive dasselbe Verb angewendet werden kann.
Im Allgemeinen ist es die Möglichkeit, eine Reihe verschiedener Objekttypen mit derselben oder einer oberflächlich ähnlichen API zu verbinden. Es gibt verschiedene Formen:
Funktionsüberladung: Definieren mehrerer Funktionen mit demselben Namen und verschiedenen Parametertypen, z. B. sqrt (float), sqrt (double) und sqrt (complex). In den meisten Sprachen, die dies zulassen, wählt der Compiler automatisch das richtige für den Typ des Arguments aus, das an ihn übergeben wird. Dies ist also ein Polymorphismus zur Kompilierungszeit.
Virtuelle Methoden in OOP: Eine Methode einer Klasse kann verschiedene Implementierungen aufweisen, die auf die Besonderheiten ihrer Unterklassen zugeschnitten sind. Jedes dieser Elemente soll die in der Basisklasse angegebene Implementierung überschreiben. Bei einem Objekt, das zur Basisklasse oder einer ihrer Unterklassen gehören kann, wird die richtige Implementierung im laufenden Betrieb ausgewählt. Dies ist also ein Laufzeitpolymorphismus.
Vorlagen: Eine Funktion einiger OO-Sprachen, mit der eine Funktion, Klasse usw. durch einen Typ parametrisiert werden kann. Beispielsweise können Sie eine generische Vorlagenliste "Liste" definieren und sie dann als "Liste von Ganzzahlen", "Liste von Zeichenfolgen", möglicherweise sogar "Liste von Listen von Zeichenfolgen" oder dergleichen instanziieren. Im Allgemeinen schreiben Sie den Code einmal für eine Datenstruktur eines beliebigen Elementtyps, und der Compiler generiert Versionen davon für die verschiedenen Elementtypen.
Der Begriff Polymorphismus stammt von:
poly = viele
Morphismus = die Fähigkeit zur Veränderung
Beim Programmieren ist Polymorphismus eine "Technik", mit der Sie ein Objekt als mehr als eine Art von Dingen "betrachten" können. Zum Beispiel:
Ein Schülerobjekt ist auch ein Personenobjekt. Wenn Sie den Schüler "anschauen" (dh besetzen), können Sie wahrscheinlich nach dem Studentenausweis fragen. Das kann man nicht immer mit einer Person machen, oder? (Eine Person ist nicht unbedingt ein Student, hat also möglicherweise keinen Studentenausweis.) Eine Person hat jedoch wahrscheinlich einen Namen. Ein Student auch.
Unterm Strich kann das "Betrachten" desselben Objekts aus verschiedenen "Winkeln" unterschiedliche "Perspektiven" ergeben (dh unterschiedliche Eigenschaften oder Methoden).
Mit dieser Technik können Sie also Dinge erstellen, die aus verschiedenen Blickwinkeln "betrachtet" werden können.
Warum verwenden wir Polymorphismus? Für den Anfang ... Abstraktion. An dieser Stelle sollte es genug Infos geben :)
Verwenden wir eine Analogie. Für ein bestimmtes musikalisches Drehbuch gibt jede Musikerin, die es spielt, ihre eigene Note in der Interpretation.
Musiker können mit Schnittstellen abstrahiert werden. Das Genre, zu dem der Musiker gehört, kann eine abstrakte Klasse sein, die einige globale Interpretationsregeln definiert, und jeder Musiker, der spielt, kann mit einer konkreten Klasse modelliert werden.
Wenn Sie ein Hörer des Musikwerks sind, haben Sie einen Verweis auf das Drehbuch, z. B. Bachs 'Fuga and Tocata', und jeder Musiker, der es aufführt, macht es auf seine eigene Weise polymorph.
Dies ist nur ein Beispiel für ein mögliches Design (in Java):
public interface Musician {
public void play(Work work);
}
public interface Work {
public String getScript();
}
public class FugaAndToccata implements Work {
public String getScript() {
return Bach.getFugaAndToccataScript();
}
}
public class AnnHalloway implements Musician {
public void play(Work work) {
// plays in her own style, strict, disciplined
String script = work.getScript()
}
}
public class VictorBorga implements Musician {
public void play(Work work) {
// goofing while playing with superb style
String script = work.getScript()
}
}
public class Listener {
public void main(String[] args) {
Musician musician;
if (args!=null && args.length > 0 && args[0].equals("C")) {
musician = new AnnHalloway();
} else {
musician = new TerryGilliam();
}
musician.play(new FugaAndToccata());
}
AnnHalloway
und das VictorBorga
Gefühl, sie sollten eher Objekte als Klassen sein - Ihr Beispiel würde sich besser mit z. public class Pianist implements Musician
und victorBorge = new Pianist();
etc.
Ich habe einen allgemeinen Überblick über Polymorphismus für eine andere Frage gegeben:
Ich hoffe es hilft. Ein Auszug...
... es hilft, von einem einfachen Test und der Definition von [Polymorphismus] auszugehen. Betrachten Sie den Code:
Type1 x;
Type2 y;
f(x);
f(y);
Hier
f()
soll eine Operation ausgeführt werden und erhält die Wertex
undy
als Eingaben. Um polymorph zu sein,f()
muss es möglich sein, mit Werten von mindestens zwei unterschiedlichen Typen (z. B.int
unddouble
) zu arbeiten und typgerechten Code zu finden und auszuführen.
(Fortsetzung bei Polymorphism in c ++ )
Polymorphismus ist eine Fähigkeit des Objekts, die in vielen Formen angenommen werden kann. Zum Beispiel kann ein Mann in der menschlichen Klasse in vielen Formen handeln, wenn wir über Beziehungen sprechen. EX: Ein Mann ist Vater seines Sohnes und er ist Ehemann seiner Frau und er ist Lehrer seiner Schüler.
Polymorphismus ist die Fähigkeit eines Objekts, viele Formen anzunehmen. Die häufigste Verwendung von Polymorphismus in OOP tritt auf, wenn eine übergeordnete Klassenreferenz verwendet wird, um auf ein untergeordnetes Klassenobjekt zu verweisen. In diesem in Java geschriebenen Beispiel haben wir drei Fahrzeugtypen. Wir erstellen drei verschiedene Objekte und versuchen, ihre Radmethode auszuführen:
public class PolymorphismExample {
public static abstract class Vehicle
{
public int wheels(){
return 0;
}
}
public static class Bike extends Vehicle
{
@Override
public int wheels()
{
return 2;
}
}
public static class Car extends Vehicle
{
@Override
public int wheels()
{
return 4;
}
}
public static class Truck extends Vehicle
{
@Override
public int wheels()
{
return 18;
}
}
public static void main(String[] args)
{
Vehicle bike = new Bike();
Vehicle car = new Car();
Vehicle truck = new Truck();
System.out.println("Bike has "+bike.wheels()+" wheels");
System.out.println("Car has "+car.wheels()+" wheels");
System.out.println("Truck has "+truck.wheels()+" wheels");
}
}
Das Ergebnis ist:
Weitere Informationen finden Sie unter https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java . Ich hoffe, es hilft.
Polymorphismus ist die Fähigkeit des Programmierers, gleichnamige Methoden zu schreiben, die je nach den Anforderungen dieser Objekte unterschiedliche Aufgaben für verschiedene Objekttypen ausführen. Wenn Sie beispielsweise eine aufgerufene Klasse Fraction
und eine aufgerufene Klasse entwickeln ComplexNumber
, enthalten beide möglicherweise eine aufgerufene Methode display()
, aber jede von ihnen würde diese Methode anders implementieren. In PHP können Sie es beispielsweise folgendermaßen implementieren:
// Class definitions
class Fraction
{
public $numerator;
public $denominator;
public function __construct($n, $d)
{
// In real life, you'd do some type checking, making sure $d != 0, etc.
$this->numerator = $n;
$this->denominator = $d;
}
public function display()
{
echo $this->numerator . '/' . $this->denominator;
}
}
class ComplexNumber
{
public $real;
public $imaginary;
public function __construct($a, $b)
{
$this->real = $a;
$this->imaginary = $b;
}
public function display()
{
echo $this->real . '+' . $this->imaginary . 'i';
}
}
// Main program
$fraction = new Fraction(1, 2);
$complex = new ComplexNumber(1, 2);
echo 'This is a fraction: '
$fraction->display();
echo "\n";
echo 'This is a complex number: '
$complex->display();
echo "\n";
Ausgänge:
This is a fraction: 1/2
This is a complex number: 1 + 2i
Einige der anderen Antworten scheinen zu implizieren, dass Polymorphismus nur in Verbindung mit Vererbung verwendet wird; zum Beispiel, vielleicht Fraction
und ComplexNumber
sowohl eine abstrakte Klasse implementieren genannt , Number
die eine Methode hat display()
, die Fraktion und Komplexe sind dann verpflichtet , beide zu implementieren. Sie benötigen jedoch keine Vererbung, um den Polymorphismus nutzen zu können.
Zumindest in dynamisch typisierten Sprachen wie PHP (ich kenne C ++ oder Java nicht) ermöglicht Polymorphismus dem Entwickler, eine Methode aufzurufen, ohne den Objekttyp im Voraus zu kennen, und darauf zu vertrauen, dass die korrekte Implementierung der Methode funktioniert heißen. Angenommen, der Benutzer wählt den Typ der Number
erstellten:
$userNumberChoice = $_GET['userNumberChoice'];
switch ($userNumberChoice) {
case 'fraction':
$userNumber = new Fraction(1, 2);
break;
case 'complex':
$userNumber = new ComplexNumber(1, 2);
break;
}
echo "The user's number is: ";
$userNumber->display();
echo "\n";
In diesem Fall wird die entsprechende display()
Methode aufgerufen, obwohl der Entwickler nicht im Voraus wissen kann, ob der Benutzer einen Bruch oder eine komplexe Zahl auswählt.
Polymorphismus bedeutet wörtlich mehrere Formen. (oder viele Formulare): Objekt aus verschiedenen Klassen und derselben Namensmethode, aber Workflows sind unterschiedlich. Ein einfaches Beispiel wäre:
Betrachten Sie eine Person X.
Er ist nur eine Person, aber er handelt genauso viele. Sie können fragen, wie:
Er ist ein Sohn seiner Mutter. Ein Freund zu seinen Freunden. Ein Bruder seiner Schwester.
Polymorphismus in OOP bedeutet, dass eine Klasse verschiedene Typen haben kann. Vererbung ist eine Möglichkeit, Polymorphismus zu implementieren.
beispielsweise Form ist eine Schnittstelle, es hat Platz , Kreis , Diamant - Subtypen. Wenn Sie ein Quadrat-Objekt haben, können Sie Quadrat automatisch in Form umwandeln, da Quadrat eine Form ist. Wenn Sie jedoch versuchen, Shape to Square herunterzuspielen, müssen Sie explizite Typumwandlungen durchführen, da Sie nicht sagen können, dass Shape Square ist, sondern auch Circle. Sie müssen es also manuell mit Code umwandeln. Square s = (Square)shape
Wenn die Form Kreis ist, erhalten Sie sie java.lang.ClassCastException
, da Kreis nicht Quadrat ist.
Polymorphismus:
Unterschiedliche Ausführung je nach Instanz der Klasse, nicht nach Typ der Referenzvariablen.
Eine Referenzvariable vom Schnittstellentyp kann auf jede der Klasseninstanzen verweisen, die diese Schnittstelle implementieren.
Polymorphismus ist die Fähigkeit, ein Objekt in einer bestimmten Klasse zu verwenden, wobei alle Komponenten, aus denen das Objekt besteht, von Unterklassen der angegebenen Klasse geerbt werden. Dies bedeutet, dass, sobald dieses Objekt von einer Klasse deklariert wurde, alle Unterklassen darunter (und ihre Unterklassen usw., bis Sie die am weitesten entfernte Unterklasse erreichen) das Objekt und seine Komponenten (Make-up) erben.
Denken Sie daran, dass jede Klasse in separaten Dateien gespeichert werden muss.
Der folgende Code veranschaulicht den Polymorphismus:
Die SuperClass:
public class Parent {
//Define things that all classes share
String maidenName;
String familyTree;
//Give the top class a default method
public void speak(){
System.out.println("We are all Parents");
}
}
Der Vater, eine Unterklasse:
public class Father extends Parent{
//Can use maidenName and familyTree here
String name="Joe";
String called="dad";
//Give the top class a default method
public void speak(){
System.out.println("I am "+name+", the father.");
}
}
Das Kind, eine andere Unterklasse:
public class Child extends Father {
//Can use maidenName, familyTree, called and name here
//Give the top class a default method
public void speak(){
System.out.println("Hi "+called+". What are we going to do today?");
}
}
Die Ausführungsmethode verweist auf die zu startende übergeordnete Klasse:
public class Parenting{
public static void main(String[] args) {
Parent parents = new Parent();
Parent parent = new Father();
Parent child = new Child();
parents.speak();
parent.speak();
child.speak();
}
}
Beachten Sie, dass jede Klasse in separaten * .java-Dateien deklariert werden muss. Der Code sollte kompiliert werden. Beachten Sie auch, dass Sie maidenName und familyTree weiter unten kontinuierlich verwenden können. Das ist das Konzept des Polymorphismus. Das Konzept der Vererbung wird auch hier untersucht, wo eine Klasse verwendet werden kann oder durch eine Unterklasse weiter definiert wird.
Hoffe das hilft und macht es klar. Ich werde die Ergebnisse veröffentlichen, wenn ich einen Computer finde, mit dem ich den Code überprüfen kann. Danke für die Geduld!
Durch Polymorphismus kann dieselbe Routine (Funktion, Methode) auf verschiedene Typen einwirken.
Da viele vorhandene Antworten die Subtypisierung mit dem Polymorphismus verbinden, gibt es drei Möglichkeiten (einschließlich der Subtypisierung), um den Polymorphismus zu implementieren.
Siehe auch:
http://wiki.c2.com/?CategoryPolymorphism
https://en.wikipedia.org/wiki/Polymorphism_(computer_science)
In objektorientierten Sprachen ermöglicht der Polymorphismus die Behandlung und Behandlung verschiedener Datentypen über dieselbe Schnittstelle. Betrachten Sie beispielsweise die Vererbung in C ++: Klasse B wird von Klasse A abgeleitet. Ein Zeiger vom Typ A * (Zeiger auf Klasse A) kann verwendet werden, um sowohl ein Objekt der Klasse A als auch ein Objekt der Klasse B zu behandeln.
Polymorphismus in Codierungsbegriffen ist, wenn Ihr Objekt durch Vererbung usw. als mehrere Typen existieren kann. Wenn Sie eine Klasse mit dem Namen "Form" erstellen, die die Anzahl der Seiten Ihres Objekts definiert, können Sie eine neue Klasse erstellen, die es erbt, z. B. "Quadrat" ". Wenn Sie anschließend eine Instanz von "Square" erstellen, können Sie diese nach Bedarf von "Shape" auf "Square" vor- und zurückschalten.
Polymorphismus gibt Ihnen die Möglichkeit, ein Modul zu erstellen, das ein anderes aufruft, und dennoch den Abhängigkeitspunkt der Kompilierungszeit vom Kontrollfluss anstelle des Kontrollflusses festzulegen.
Durch die Verwendung von Polymorphismus hängt ein High-Level-Modul nicht von einem Low-Level-Modul ab. Beide hängen von Abstraktionen ab. Dies hilft uns, das Prinzip der Abhängigkeitsinversion anzuwenden ( https://en.wikipedia.org/wiki/Dependency_inversion_principle ).
Hier habe ich die obige Definition gefunden. Etwa 50 Minuten nach Beginn des Videos erklärt der Ausbilder das Obige. https://www.youtube.com/watch?v=TMuno5RZNeE
Polymorphismus ist die Fähigkeit:
Rufen Sie eine Operation für eine Instanz eines spezialisierten Typs auf, indem Sie nur ihren verallgemeinerten Typ kennen, während Sie die Methode des spezialisierten Typs und nicht die des verallgemeinerten Typs aufrufen: Es handelt sich um dynamischen Polymorphismus .
Definieren Sie mehrere Methoden mit dem Speichernamen, aber unterschiedlichen Parametern: Es handelt sich um statischen Polymorphismus .
Die erste ist die historische Definition und die wichtigste.
Es ermöglicht die Erstellung einer stark typisierten Konsistenz der Klassenhierarchie und einige magische Dinge wie das Verwalten von Listen von Objekten unterschiedlicher Typen, ohne deren Typen, aber nur einen ihrer übergeordneten Typen zu kennen, sowie Datenbindungen.
Hier sind einige Formen wie Punkt, Linie, Rechteck und Kreis, bei denen die Operation Draw () entweder nichts oder einen Parameter verwendet, um eine Zeitüberschreitung zum Löschen festzulegen.
public class Shape
{
public virtual void Draw()
{
DoNothing();
}
public virtual void Draw(int timeout)
{
DoNothing();
}
}
public class Point : Shape
{
int X, Y;
public override void Draw()
{
DrawThePoint();
}
}
public class Line : Point
{
int Xend, Yend;
public override Draw()
{
DrawTheLine();
}
}
public class Rectangle : Line
{
public override Draw()
{
DrawTheRectangle();
}
}
var shapes = new List<Shape> { new Point(0,0), new Line(0,0,10,10), new rectangle(50,50,100,100) };
foreach ( var shape in shapes )
shape.Draw();
Hier sollten die Shape-Klasse und die Shape.Draw () -Methoden als abstrakt markiert werden.
Sie sind nicht zum Verstehen gedacht.
Ohne Polymorphismus, mit abstrakter-virtueller Überschreibung, während die Formen analysiert werden, weiß nur die Spahe.Draw () -Methode, die als CLR aufgerufen wird, nicht, welche Methode aufgerufen werden soll. Es wird also die Methode des Typs aufgerufen, auf den wir reagieren, und hier ist der Typ aufgrund der Listendeklaration Form. Der Code macht also überhaupt nichts.
Mit Polymorphismus kann die CLR mithilfe einer sogenannten virtuellen Tabelle auf den realen Typ des Objekts schließen , auf das wir einwirken. Also ruft es die gute Methode auf, und hier ruft Shape.Draw (), wenn Shape is Point ist, Point.Draw () auf. Der Code zeichnet also die Formen.
C # - Polymorphismus (Stufe 1)
Polymorphismus in Java (Stufe 2)