Was ist Polymorphismus, wozu dient er, und wie wird er eingesetzt?
Antworten
Zu viele Anzeigen?Wenn man sich die griechischen Wurzeln des Begriffs vergegenwärtigt, sollte das klar werden.
- Poly = viele: Polygon = vielseitig, Polystyrol = viele Styrole (a) , polyglott = viele Sprachen, usw.
- Morph = Veränderung oder Form: Morphologie = Lehre von der biologischen Form, Morpheus = der griechische Gott der Träume, der jede Form annehmen kann.
Polymorphismus ist also die Fähigkeit (in der Programmierung), dieselbe Schnittstelle für unterschiedliche zugrundeliegende Formen (Datentypen) darzustellen.
In vielen Sprachen sind z. B. Ganzzahlen und Fließkommazahlen implizit polymorph, da man addieren, subtrahieren, multiplizieren usw. kann, ungeachtet der Tatsache, dass die Typen unterschiedlich sind. Sie werden selten als Objekte im üblichen Sinne betrachtet.
Aber auf dieselbe Weise kann eine Klasse wie BigDecimal
o Rational
o Imaginary
können diese Operationen ebenfalls anbieten, auch wenn sie mit unterschiedlichen Datentypen arbeiten.
Das klassische Beispiel ist die Shape
Klasse und alle Klassen, die von ihr erben können (Quadrat, Kreis, Dodekaeder, unregelmäßiges Polygon, Splat usw.).
Mit Polymorphismus wird jede dieser Klassen unterschiedliche zugrunde liegende Daten haben. Eine Punktform benötigt nur zwei Koordinaten (vorausgesetzt natürlich, sie befindet sich in einem zweidimensionalen Raum). Ein Kreis benötigt 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 Vieleck benötigt eine Reihe von Linien.
Indem man die Klasse sowohl für ihren Code als auch für ihre Daten verantwortlich macht, kann man Polymorphismus erreichen. In diesem Beispiel hätte jede Klasse ihre eigene Draw()
Funktion und der Client-Code könnte einfach 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()
y drawCircle()
.
Objektorientierung, Polymorphismus und Vererbung sind eng miteinander verbundene Konzepte, die man unbedingt kennen sollte. In meiner langen Laufbahn gab es viele "Silberkugeln", die im Grunde nur verpufften, aber das OO-Paradigma hat sich als ein gutes erwiesen. Lernen Sie es, verstehen Sie es, lieben Sie es - Sie werden froh sein, dass Sie es getan haben :-)
(a) Ursprünglich hatte ich das als Witz geschrieben, aber es stellte sich heraus, dass es richtig und daher nicht so lustig ist. Das Monomer Styrol wird zufällig aus Kohlenstoff und Wasserstoff hergestellt, C8H8
und Polystyrol wird aus Gruppen dieser Stoffe hergestellt, (C8H8)n
.
Vielleicht hätte ich sagen sollen, dass ein Polyp viele Vorkommen des Buchstabens p
Obwohl, jetzt, wo ich den Witz erklären musste, scheint auch das nicht mehr lustig zu sein.
Manchmal sollte man einfach aufhören, wenn man im Rückstand ist :-)
Polymorphismus bedeutet, dass man ein Objekt als eine generische Version von etwas behandeln kann, aber wenn man darauf zugreift, bestimmt der Code, um welchen Typ es sich genau handelt, und ruft den zugehörigen Code auf.
Hier ist ein Beispiel in C#. Erstellen Sie vier Klassen innerhalb 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 in der Main() des Moduls für die Konsolenanwendung Folgendes:
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.
Dann fügen wir der Liste ein Fahrrad, ein Auto und einen Lastwagen hinzu.
Als Nächstes können wir in einer Schleife jedes Fahrzeug in der Liste durchgehen und sie alle gleich behandeln. Wenn wir jedoch auf die Eigenschaft "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, von der Unterklasse bestimmt wird, auf die zur Laufzeit verwiesen wird.
Ich hoffe, dies hilft Ihnen.
Desde Verstehen und Anwenden von Polymorphismus in PHP Dank 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, aber eine gemeinsame Schnittstelle teilen.
Das Schöne an der Polymorphie ist, dass der Code, der mit den verschiedenen Klassen arbeitet, nicht wissen muss, welche Klasse er verwendet, da sie alle auf die gleiche Weise benutzt werden. Eine Analogie aus der realen Welt für Polymorphismus ist ein Knopf. Jeder weiß, wie man einen Knopf benutzt: Man drückt einfach darauf. Was ein Knopf "macht", hängt jedoch davon ab, womit er verbunden ist und in welchem Kontext er verwendet wird - das Ergebnis hat jedoch keinen Einfluss darauf, wie er verwendet wird. Wenn Ihr Chef Ihnen sagt, Sie sollen eine Taste drücken, haben Sie bereits alle Informationen, die Sie für die Ausführung der Aufgabe benötigen.
In der Welt der Programmierung wird die Polymorphie verwendet, um Anwendungen modularer und erweiterbar zu machen. Anstelle von unübersichtlichen bedingten Anweisungen, die verschiedene Vorgehensweisen beschreiben, erstellen Sie austauschbare Objekte, die Sie je nach Bedarf auswählen. Das ist das grundlegende Ziel der Polymorphie.
Wenn jemand CUT zu diesen Leuten sagt
- Die Chirurgin
- Der Hairstylist
- Der Schauspieler
Was wird geschehen?
- Der Chirurg würde mit dem Einschnitt beginnen.
- Der Friseur würde beginnen, jemandem die Haare zu schneiden.
- Der Schauspieler würde abrupt aufhören, aus der aktuellen Szene heraus zu agieren, und wartet auf die Anweisungen des Regisseurs.
Die obige Darstellung zeigt also, was Polymorphismus (gleicher Name, unterschiedliches Verhalten) in OOP ist.
Wenn Sie zu einem Vorstellungsgespräch gehen und Ihr Gesprächspartner Sie bittet, ein Live-Beispiel für Polymorphismus im selben Raum, in dem wir sitzen, zu erzählen/vorzuführen, sagen wir
Antwort - Tür / Fenster
Sie fragen sich wie?
Durch Tür/Fenster - eine Person kann kommen, Luft kann kommen, Licht kann kommen, Regen kann kommen, usw.
Um es besser und einfacher zu verstehen, habe ich das obige Beispiel verwendet Wenn Sie eine Referenz für den Code benötigen, folgen Sie den obigen Antworten.
Einfache Erläuterung durch Analogie
Der Präsident der Vereinigten Staaten bedient sich des Polymorphismus. Wie das? Nun, er hat viele Berater:
- Militärische Berater
- Rechtsbeistand
- Nuklearphysiker (als Berater)
- usw. usw.
Jeder sollte nur für eine Sache verantwortlich sein: Beispiel:
Der Präsident ist weder Experte für Zinkbeschichtung noch für Quantenphysik. Er weiß viele Dinge nicht. Aber er weiß, wie man das Land regiert.
Mit dem Code verhält es sich ähnlich: Anliegen und Verantwortlichkeiten sollten auf die entsprechenden Klassen/Personen aufgeteilt werden. Das macht es einfacher, den Code zu pflegen, besonders wenn man Änderungen vornimmt. Änderungen sind unvermeidlich. Wenn sich Dinge ändern, wollen Sie nicht, dass andere Teile Ihrer Anwendung kaputt gehen. Präsidenten sollten sich auf die Verwaltung des Landes beschränken und sich nicht in die Feinheiten von Spezialgebieten einmischen:
Warum ist es eine schlechte Idee, dass ein Präsident all diese spezifischen Dinge weiß?
Wenn der Präsident den Menschen ausdrücklich sagen würde, was sie zu tun haben, würde das bedeuten, dass der Präsident Folgendes tun muss wissen was genau zu tun ist. Wenn der Präsident bestimmte Dinge selbst wissen muss, bedeutet das, dass Sie, wenn Sie eine Änderung vornehmen müssen, diese in zwei Orte und nicht nur eine.
Wenn zum Beispiel die EPA die Gesetze zur Umweltverschmutzung ändert, dann müssen Sie eine Änderung der EPA-Klasse vornehmen, wenn dies geschieht. und auch die Klasse der Präsidenten. Es kann gefährlich sein, den Code an zwei Stellen zu ändern, denn es ist viel schwieriger, ihn zu pflegen.
Gibt es einen besseren Ansatz?
Es gibt einen besseren Ansatz: Der Präsident muss die Einzelheiten nicht kennen - er kann den besten Rat von Leuten einholen, die speziell mit diesen Aufgaben betraut sind.
Er kann einen polymorphen Ansatz für die Führung des Landes wählen.
Beispiel - für die Verwendung eines polymorphen Ansatzes:
Alles, was der Präsident tut, ist, Leute zu bitten, ihn zu beraten - und das ist es, was er im wirklichen Leben tut - und das ist es, was ein guter Präsident tun sollte. seine Berater reagieren alle unterschiedlich, aber sie wissen alle, was der Präsident damit meint: Beraten(). Es strömen Hunderte von Leuten in sein Büro. Es spielt eigentlich keine Rolle, wer sie sind. Alles, was der Präsident weiß, ist, dass sie wissen, wie sie zu reagieren haben, wenn er sie um "Ratschläge" bittet. :
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
}
}
Auf diese Weise kann der Präsident das Land buchstäblich regieren, ohne etwas über das Militär, das Gesundheitswesen oder die internationale Diplomatie zu wissen: Die Details werden den Experten überlassen. Das einzige, was der Präsident wissen muss, ist dies: "Beraten()".
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! In dem obigen Szenario macht der Präsident die ganze Arbeit: Er weiß über die Aufstockung der Truppen und die Vorbedingungen Bescheid. Das heißt, wenn sich die Politik im Nahen Osten ändert, müsste der Präsident seine Befehle ändern, wie auch auch die Petraeus-Klasse. Wir sollten nur die Petraeus-Klasse ändern müssen, denn der Präsident sollte sich nicht mit solchen Details aufhalten müssen. Er braucht die Details nicht zu kennen. Alles, was er wissen muss, ist, dass alles erledigt ist, wenn er einen Befehl gibt. Alle Details sollten den Experten überlassen werden.
So kann der Präsident das tun, was er am besten kann: allgemeine Politik machen, gut aussehen und Golf spielen :P.
Wie wird sie tatsächlich implementiert - durch eine Basisklasse oder eine gemeinsame Schnittstelle?
Das ist in der Tat Polymorphismus, in einer Nussschale. Wie genau wird das gemacht? Durch die "Implementierung einer gemeinsamen Schnittstelle". o durch Verwendung einer Basisklasse (Vererbung) - siehe die obigen Antworten, die dies genauer erläutern. (Um dieses Konzept besser 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 alles Klassen, die "eine Schnittstelle implementieren" - nennen wir sie die IAdvisor
Schnittstelle, die nur eine Methode enthält: Advise()
. Aber jetzt kommen wir zu den Einzelheiten.
Dies 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);
}
}
Zusammenfassung
Alles, was Sie wirklich wissen müssen, ist dies:
- Der Präsident braucht die Einzelheiten nicht zu kennen - das überlassen wir anderen.
- Alles, was der Präsident wissen muss, ist, denjenigen, der zur Tür hereinkommt, zu bitten, ihn zu beraten - und wir wissen, dass sie auf jeden Fall wissen, was zu tun ist, wenn sie um Rat gefragt werden (denn in Wirklichkeit sind sie alle Berater (oder IAdvisors :) )
Ich hoffe wirklich, dass es Ihnen hilft. Wenn du etwas nicht verstehst, schreibe einen Kommentar und ich werde es noch einmal versuchen.
- See previous answers
- Weitere Antworten anzeigen