Was ist Polymorphismus, wofür ist er und wie wird er verwendet?

564

Was ist Polymorphismus, wofür ist er und wie wird er verwendet?

UnkwnTech
quelle
19
@ John: +1 Ich stimme zu, dass dies ein äußerst interessantes Phänomen ist. Ich bin sicher, dass Unkwntech nicht die einzige sachkundige, fähige Person ist, die Lücken in dem hat, was andere als grundlegendes Vokabular betrachten würden. Nur um zu zeigen, dass Programmierung ein sehr weites Thema ist.
AnthonyWJones
9
Er könnte es benutzen, ihm nur keinen Namen geben.
Aiden Bell
10
@Aamir: Ich bin mir nicht sicher, ob es vernünftig ist anzunehmen, dass jemand mit 8k alle Grundlagen in allen Bereichen der Programmierung kennt. Ich denke auch nicht, dass dies darauf hinweist, dass das Reputationssystem nicht perfekt ist. Jemand kann einen beachtlichen Ruf erlangen, indem er viele gute Fragen stellt. Ich denke, unsere natürliche Reaktion auf diese Enthüllung zeigt einfach, dass wir (Programmierer) eine natürliche Tendenz haben, ein wenig engstirnig zu sein (keine schlechte Sache, wenn wir in einem bestimmten technischen Bereich wirklich gut sein müssen), und das hat seine Nachteile.
AnthonyWJones
43
Ihr scheint eine sehr eingeschränkte Sicht auf die Programmierung zu haben. Ich kenne Leute, die Embedded-Entwicklung betreiben und die OO-Konzepte überhaupt nicht kennen (oder brauchen). Ihre Aufgabe ist es, dem Code das letzte Atom der Leistung abzuringen, und das war's - der Code, an dem sie arbeiten, wird niemals in die Welt der Objekte gelangen, und sie sind glücklicherweise nahe genug am Ruhestand, um den sie sich keine Sorgen machen müssen Lernen neuer Konzepte wie Objekte, Polymorphismus und Variablennamen mit mehr als zwei Buchstaben :-)
paxdiablo
29
Wie Sie lernen Sie etwas? Niemand kam auf diese Welt, der PHP OOP und Designmuster kannte, also mussten Sie alle es irgendwann lernen, am College, eine Antwort hier usw. Sprechen Sie nicht über jemanden, der es nicht gewagt hat, komplexe Code-Prozeduren bereits zu kennen ", und stattdessen denken sie, dass sie hier sind, um es zu lernen, was eine gute Sache und der Sinn dieser Seite ist. Nutzen Sie Ihre Zeit, um ihnen zu helfen, denn ich bin sicher, Ihnen wurde in der Vergangenheit geholfen. Wenn während der gesamten Geschichte des Menschen, anstatt Wissen zu teilen, die Antwort lautete: "Was? Ha! Weißt du das nicht? ..", wären wir alle noch im dunklen Zeitalter.
James

Antworten:

544

Wenn Sie über die griechischen Wurzeln des Begriffs nachdenken, sollte dies offensichtlich werden.

  • Poly = viele: Polygon = vielseitig, Polystyrol = viele Styrole (a) , Polyglot = viele Sprachen und so weiter.
  • Morph = Veränderung oder Form: Morphologie = Studium der biologischen Form, Morpheus = der griechische Gott der Träume, der jede Form annehmen kann.

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 BigDecimaloder Rationaloder Imaginaryauch diese Operationen bereitstellen, obwohl sie mit unterschiedlichen Datentypen arbeiten.

Das klassische Beispiel ist die ShapeKlasse 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, pobwohl, 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 :-)

paxdiablo
quelle
50
Griechisch, nicht Latein :) (das 'y' und 'ph' sind die Werbegeschenke). Und im Griechischen ist "Morph" nur "Form" oder "Form" - die englische Bedeutung von " Form ändern " für "Morph" ist eine spätere Entwicklung
AakashM
16
Polymorphismus ist nicht mit OOP verwandt, aber OOP ist mit Polymorphismus verwandt, weil es ihn von Natur aus unterstützt (vorausgesetzt, es ist eine anständige OOP-Sprache). Schauen Sie sich FP für andere Beispiele für Polymorphismus an.
Alternative
9
Diese 2 Zeilen haben den Trick für mich getan:Poly = many and Morph = change or form
Jo Smo
3
Polyp ist die Abkürzung für Polypo (u) s. Und pous ist Fuß in Griechisch. ;-)
Dirk
2
@Shaun, ich denke, Sie verwenden den Begriff "Schnittstelle" möglicherweise in einem viel zu wörtlichen / einschränkenden Sinne - ich meinte ihn eher als englischen Begriff als als eine Definition, die für eine beliebige Computersprache spezifisch ist. Es bedeutet nicht genau dieselbe Funktion mit genau denselben Parametern, sondern lediglich eine Möglichkeit, "Objekte" unabhängig von ihrem zugrunde liegenden konkreten Typ auf dieselbe Weise zu beeinflussen. Dies kann das Überladen von Methoden mit verschiedenen Parametertypen sowie die reinere Form des Polymorphismus umfassen.
Paxdiablo
250

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.

Antony Gibbs
quelle
6
Ich denke, dies ist ein sehr gutes Beispiel, um die übergeordnete Schnittstelle klar
darzustellen
1
Ich würde sagen, dies ist das klarste Beispiel. Wenn Sie jedoch ein PHP-Programmierer sind, ist es möglicherweise einfacher, diesen Link ZUERST
Oliver Williams
Beachten Sie auch (außerhalb des OP-Bereichs), dass wir die Analyse auf bekannte Objekte beschränken. Wir übergeben kein Objekt (wie eine Importdatei) und bestimmen dann, um welchen Typ es sich handelt (Excel, CSV, YAML, SQL usw. usw.). Um dies zu tun, würde man eine Art Factory-Klasse benötigen Class_Excel, Class_CSVum aufgerufen zu werden oder eine ReaderKlasse aufgerufen zu haben. In jedem Fall eine Art Iterativ, wenn / then / else irgendwo gespeichert werden muss.
Oliver Williams
@Antony Gibbs: Dies ist ein wirklich gutes Beispiel (eine Liste der generischen Typen), das für mich Sinn macht. Was ist sonst die große Sache, wenn jede Klasse ihre eigenen Räder hat, ohne von einer Basisklasse zu erben? Gibt es neben der Liste noch weitere Konzepte, die für polymorph geeignet wären?
TTT
195

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.

Ajay Patel
quelle
10
Bezieht sich die Tastenanalogie nicht mehr auf das Konzept der Abstraktion?
thewpfguy
6
Ursprüngliche Quelle: code.tutsplus.com/tutorials/…
Jemand
8
@Mantriur: Dies ist in der Tat plagiiert, und wir haben Regeln dagegen: stackoverflow.com/help/referencing Aber angesichts der Punktzahl und der Tatsache, dass alte Beiträge beim Löschen von Antworten vom Verlust von Wiederholungen befreit sind, bin ich mir nicht sicher, ob ich sie lösche jetzt würde alles verbessern. Die nächstbeste Alternative wäre, die Zuordnung nur im Namen des Benutzers zu bearbeiten, obwohl ich fest davon überzeugt bin, dass Benutzer dafür verantwortlich sind, Quellen in ihren eigenen Antworten zu zitieren.
BoltClock
1
Ich glaube, es ist falsch zu implizieren, dass Polymorphismus spezifisch für Klassen und / oder objektorientierte Programmierung ist, da Ad-hoc-Polymorphismus oder parametrischer Polymorphismus nicht unbedingt Klassen und / oder Objekte erfordern. Ich denke, in dieser Antwort geht es um Subtypisierung (auch als Subtyp-Polymorphismus oder Einschlusspolymorphismus bekannt).
StubbornShowaGuy
64

Wenn jemand diesen Leuten CUT sagt

  1. Der Chirurg
  2. Der Friseur
  3. Der Schauspieler

Was wird passieren?

  • Der Chirurg würde anfangen, einen Einschnitt zu machen.
  • Der Friseur fing an, jemandem die Haare zu schneiden.
  • Der Schauspieler würde plötzlich aufhören, aus der aktuellen Szene heraus zu handeln, und auf die Regie warten.

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.

Sanchit
quelle
5
Ich denke nicht, dass dies ein großartiges Beispiel ist, da dies dazu führen kann, dass unerfahrene Leute denken, wenn zwei Klassen eine .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.
Matt Klein
37

Einfache Erklärung in Analogie

Der Präsident der Vereinigten Staaten setzt Polymorphismus ein. Wie? Nun, er hat viele Berater:

  1. Militärberater
  2. Rechtsberater
  3. Kernphysiker (als Berater)
  4. Medizinische Berater
  5. etc etc. etc.

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.

Wie wird es tatsächlich implementiert - über eine Basisklasse oder eine gemeinsame Schnittstelle

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 IAdvisorSchnittstelle, 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);
        }
    }

Zusammenfassung

Alles, was Sie wirklich wissen müssen, ist Folgendes:

  • Der Präsident muss die Einzelheiten nicht kennen - diese werden anderen überlassen.
  • Alles, was der Präsident wissen muss, ist zu fragen, wer jemals zur Tür hereinkommt, um ihn zu beraten - und wir wissen, dass sie absolut wissen werden, was zu tun ist, wenn sie um Rat gefragt werden (weil sie alle in Wirklichkeit Berater (oder Berater) sind)

Ich hoffe es hilft dir wirklich. Wenn du nichts verstehst, schreibe einen Kommentar und ich werde es erneut versuchen.

BKSpurgeon
quelle
4
Fantastisches Beispiel! Vielen Dank.
Iman Sedighi
1
Sehr interessante Analogie. Vielen Dank.
Thanhtang
1
@TTT, weil (1) jedes Mal, wenn Sie einen neuen Berater haben, Sie die Präsidentenklasse ändern müssen - Sie möchten keine x2-Änderungen vornehmen. nur einer. (2) Zweitens, wenn Sie einen vorhandenen Berater ändern müssen, müssen Sie möglicherweise zurückgehen und einen dieser drei Anrufe in der Präsidentenklasse ändern - Sie möchten wirklich nur eine Änderung vornehmen, nicht zwei. (3) Wenn Sie drei separate Anrufe hätten, müssten Sie innerhalb der Präsidentenklasse fragen: 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.
BKSpurgeon
1
@TTT ja du hast recht aber ich muss den Lesern das Konzept langsam vorstellen, sonst werden sie es nicht verstehen. Ich habe weitere Änderungen hinzugefügt. Bitte geben Sie an, wenn Klarstellungen erforderlich sind
BKSpurgeon
1
@TTT Basisklasse vs Schnittstelle ist eine Entwurfsentscheidung, die Programmierer treffen müssen, wenn sie Polymorpismus betreiben. Weitere Informationen finden Sie hier: stackoverflow.com/questions/56867/interface-vs-base-class
BKSpurgeon
24

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;
Tom Dalling
quelle
Ich frage mich, wie dies mit der (populären) Erklärung zusammenhängt, die @Ajay Patel gabclasses have different functionality while sharing a common interface
BornToCode
1
@BornToCode Die übergeordnete Klasse ist / stellt diese gemeinsame Schnittstelle bereit.
Grokmann
1
Polymorphismus erfordert keine Subtypisierung.
Shaun Luttin
22

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.

Tony Stark
quelle
Das Überladungskonzept hat nichts mit Vererbung und Polymorphismus zu tun.
srk
@srk Methodenüberladung ist eine Möglichkeit, Polymorphismus zu implementieren. Es wird oft als statischer oder Ad-hoc-Polymorphismus eingestuft. wiki.c2.com/?CategoryPolymorphism
Shaun Luttin
12

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.

JesperE
quelle
10
"Die Fähigkeit eines Objekts vom Typ A, sich wie ein Objekt vom Typ B zu verhalten" - es ist keine genaue Definition. Ich würde sagen, es ist eher die Fähigkeit, ein Objekt vom Typ A wie ein Objekt vom Typ B zu behandeln.
Artem Barger
Ja. Vielleicht ist das eine bessere Formulierung.
JesperE
Der Vollständigkeit halber implementieren viele Sprachen Polymorphismus durch Ententypisierung, z. B. Python.
ilya n.
Ich frage mich, wie dies mit der (populären) Erklärung zusammenhängt, die @Ajay Patel gabclasses have different functionality while sharing a common interface
BornToCode
9

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

Vinko Vrsalovic
quelle
2
Dies ist speziell ein Subtyp-Polymorphismus.
Shaun Luttin
@ vinko-vrsalovic: Wie ist die Softwareentwicklung im ländlichen Amerika?
TTT
8

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.

Abe Miessler
quelle
2
Dies ist eine Subtypisierung, die nur eine Art von Polymorphismus darstellt.
Shaun Luttin
@ShaunLuttin Kannst du mich auf Ressourcen verweisen, um mehr über die anderen Arten von Polymorphismus zu erfahren?
Abe Miessler
Dies sind "Ad-hoc-Polymorphismus" und "parametrischer Polymorphismus" zusätzlich zu "Subtyp-Polymorphismus".
Shaun Luttin
8

(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.

Kcats Wolfrevo
quelle
5

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.

Stewart
quelle
4

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 :)

tzup
quelle
3

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());
}
Boris Pavlović
quelle
1
AnnHallowayund das VictorBorgaGefühl, sie sollten eher Objekte als Klassen sein - Ihr Beispiel würde sich besser mit z. public class Pianist implements Musicianund victorBorge = new Pianist();etc.
Przemek D
3

Ich habe einen allgemeinen Überblick über Polymorphismus für eine andere Frage gegeben:

Polymorphismus in c ++

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 Werte xund yals Eingaben. Um polymorph zu sein, f()muss es möglich sein, mit Werten von mindestens zwei unterschiedlichen Typen (z. B. intund double) zu arbeiten und typgerechten Code zu finden und auszuführen.

(Fortsetzung bei Polymorphism in c ++ )

Tony Delroy
quelle
3

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.

Rohit
quelle
3

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:

Das Ergebnis

Weitere Informationen finden Sie unter https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java . Ich hoffe, es hilft.

Mohammad
quelle
Ja, aber Sie haben nicht erklärt, welche Vorteile Polymorphismus bietet. Es gibt offensichtlich einen kürzeren Code, in dem Sie die Fahrzeugklasse löschen würden, und der weiterhin funktioniert (natürlich mit einer anderen Objektdeklaration).
Cornelius
Ich habe es nicht erklärt, da die Person, die die Frage gestellt hat, nicht nach den Vorteilen gefragt hat. Er fragte: "Was ist Polymorphismus, wofür ist er und wie wird er verwendet?" Über den Code, wenn Sie es besser machen können, posten Sie bitte Ihre Antwort. Unsere Community kann es also nutzen. Vielen Dank für Ihren Kommentar.
Mohammad
Sorry, wollte nicht unhöflich klingen, andere haben es auch nicht erklärt. Zumindest haben Sie sich die Mühe gemacht, den Code einzugeben. Wie auch immer, er fragte, wofür es ist, aber keines der Beispiele auf dieser Seite erklärt, wofür es ist. Sie alle stellen nur einen komplexen Weg vor, um die gleichen Ergebnisse zu erzielen : s28.postimg.org/jq8vl6031/Poly.jpg, und keiner wollte erklären, warum man Polymorphismus verwenden möchte, was sein Gewinn oder Zweck ist, was nicht wurde getan, wenn es nicht verwendet wurde? Alles, was ich auf dieser Seite sehe, ist ein Vorschlag, mit Treppen und nicht mit einem Aufzug zu Ihrer Wohnung zu klettern.
Cornelius
.. ohne zu bemerken, dass man einen Fahnenmast trägt, der zu groß ist, um in einen Aufzug zu passen. Ich weiß nicht, wie ich eine Postleitzahl schreiben soll, daher kann ich nicht viel helfen ...
Cornelius
2

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 Fractionund 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 Fractionund ComplexNumbersowohl eine abstrakte Klasse implementieren genannt , Numberdie 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 Numbererstellten:

$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.

Alex Basson
quelle
2
Das ist kein Polymorphismus. Das sind zwei Klassen mit gleichnamigen Methoden. Sie müssten durch eine Basisklasse oder Schnittstelle verknüpft werden, die als "anzeigbar" oder ähnliches bezeichnet wird, und dann würden andere Methoden einfach dafür sorgen, dass das Objekt vom Typ "anzeigbar" und nicht von komplex oder gebrochen ist.
Pod
Ich dachte immer, Polymorphismus sei "zwei Klassen mit Methoden des gleichen Noms". Um Stephan Kochan (von dem ich dieses Beispiel für Brüche / Komplexe schamlos abziehe) zu zitieren: "Die Fähigkeit, denselben Methodennamen über verschiedene Klassen hinweg zu teilen, wird als Polymorphismus bezeichnet." (aus Programming_In_Objective-C ) Er erwähnt keine Notwendigkeit, Klassen über eine Basisklasse zu verknüpfen. Vielleicht ist es in verschiedenen Sprachen unterschiedlich, ich weiß es ehrlich gesagt nicht.
Alex Basson
Selbst wenn diese Verteidigung aus einem veröffentlichten Buch zitiert wird, würde ich dennoch argumentieren, dass sie falsch ist. Zumal es scheinbar miteinander kollidiert, sprachunabhängige Verteidigung des Polymorphismus. Und obwohl das Endergebnis das gleiche ist wie beim Polymorphismus, würde ich argumentieren, dass es stattdessen die dynamische Typisierung ist, die es dem Programmierer ermöglicht, die korrekte Implementierung einer Methode unter anderen, ähnlich benannten Methoden aufzurufen.
Vipirtti
2

In der objektorientierten Programmierung bezieht sich Polymorphismus auf die Fähigkeit einer Programmiersprache , Objekte je nach Datentyp oder Klasse unterschiedlich zu verarbeiten . Insbesondere ist es die Möglichkeit, Methoden für abgeleitete Klassen neu zu definieren.

sjith
quelle
2

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.

Shourob Datta
quelle
2

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)shapeWenn die Form Kreis ist, erhalten Sie sie java.lang.ClassCastException, da Kreis nicht Quadrat ist.

Frank Zhang
quelle
2

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.

Hassan Tareq
quelle
1

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!

Midimistro
quelle
2
Beachten Sie, dass nicht jedes Kind ein Elternteil ist, daher ist diese Struktur falsch. Die oberste Klasse sollte Kind sein (wenn Sie nicht nur mit "Person" beginnen), was bis auf Adam immer wahr sein wird. Sie können seine parent_id auf null setzen, da der Schöpfer mit keinem Konstrukt des menschlichen Intellekts definiert werden kann.
Yehosef
1

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.

  • Der parametrische (generische) Polymorphismus ermöglicht es einer Routine, zusätzlich zu normalen Parametern einen oder mehrere Typparameter zu akzeptieren, und führt sich selbst auf diesen Typen aus.
  • Der Subtyp-Polymorphismus ermöglicht es einer Routine, auf jeden Subtyp ihrer Parameter einzuwirken.
  • Ad-hoc-Polymorphismus verwendet im Allgemeinen routinemäßige Überladung, um polymorphes Verhalten zu gewährleisten, kann sich jedoch auch auf andere Polymorphismus-Implementierungen beziehen.

Siehe auch:

http://wiki.c2.com/?CategoryPolymorphism

https://en.wikipedia.org/wiki/Polymorphism_(computer_science)

Shaun Luttin
quelle
0

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.

Eran Rehavi
quelle
0

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.

Brian Scott
quelle
0

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

Raghav Navada
quelle
0

Was ist Polymorphismus?

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.

Wofür wird Polymorphismus verwendet?

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.

Starkes und schwaches Tippen

Stichprobe

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.

Erklärung

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.

Weitere Lesungen

C # - Polymorphismus (Stufe 1)

Polymorphismus in Java (Stufe 2)

Polymorphismus (C # -Programmierhandbuch)

Virtuelle Methodentabelle

Olivier Rogier
quelle