Frage

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

War es hilfreich?

Lösung

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

  • Poly = viele: polygon = vielseitig, polystyrol = viele strenger (a), polyglot = viele Sprachen und so weiter.
  • Morph = Veränderung oder Form: Morphologie = Untersuchung der biologischen Form, Morpheus = der griechische Gott der Träume, die in der Lage sind, irgendeine Form zu nehmen.

Polymorphismus ist also die Fähigkeit (in der Programmierung), dieselbe Grenzfläche für unterschiedliche zugrunde liegende Formen (Datentypen) zu präsentieren.

In vielen Sprachen sind beispielsweise Ganzzahlen und Schwimmer implizit polymorph, da Sie unabhängig davon, dass die Typen unterschiedlich sind, hinzufügen, subtrahieren, multiplizieren können. Sie werden selten als Objekte im üblichen Begriff betrachtet.

Aber genauso eine Klasse wie BigDecimal oder Rational oder Imaginary kann auch diesen Vorgängen bereitstellen, obwohl sie an verschiedenen Datentypen arbeiten.

Das klassische Beispiel ist das Shape Klasse und alle Klassen, die daraus erben können (Quadrat, Kreis, Dodekaeder, unregelmäßiges Polygon, Splat usw.).

Bei Polymorphismus hat jeder 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 eine Mitte und einen Radius. Ein quadratisches oder rechteckiges Rechteck benötigt zwei Koordinaten für die oberen linken und unteren rechten Ecken und (möglicherweise) eine Rotation. Ein unregelmäßiges Polygon braucht 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 erreichen. In diesem Beispiel hätte jede Klasse ihre eigene Draw() Funktion und der Client -Code könnten einfach tun:

shape.Draw()

Um das richtige Verhalten für jede Form zu erhalten.

Dies steht im Gegensatz zu der alten Art, Dinge zu tun, in denen der Code von den Daten getrennt war, und Sie hätten Funktionen wie gehabt wie drawSquare() und drawCircle().

Objektorientierung, Polymorphismus und Vererbung sind eng verwandte Konzepte und sie sind wichtig zu wissen. Während meiner langen Karriere gab es viele "silberne Kugeln", die im Grunde genommen nur ausgerüstet wurden, aber das OO -Paradigma hat sich als gut herausgestellt. Lerne es, verstehe es, liebe es - du wirst froh sein, dass du es getan hast :-)


(a) Ich habe das ursprünglich als Witz geschrieben, aber es stellte sich heraus, dass es richtig war und daher nicht so lustig war. Das Momomer -Styrol wird aus Kohlenstoff und Wasserstoff hergestellt, C8H8, und Polystyrol wird aus Gruppen davon hergestellt, (C8H8)n.

Vielleicht hätte ich sagen sollen, dass ein Polyp viele Ereignisse des Briefes war p Obwohl ich jetzt, wo ich den Witz erklären musste, auch nicht lustig erscheint.

Manchmal solltest du einfach aufhören, während du zurück bist :-)

Andere Tipps

Der Polymorphismus ist, wenn Sie ein Objekt als eine generische Version von etwas behandeln können. Wenn Sie jedoch darauf zugreifen, bestimmt der Code, welcher genau es ist, und ruft den zugehörigen Code auf.

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 Folgendes im Main () des Moduls 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 des Basisklassenfahrzeugs, die nicht weiß, wie viele Räder jedes seiner Unterklassen hat, weiß jedoch, dass jede Unterklasse dafür verantwortlich ist, zu wissen, wie viele Räder er 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 Eigenschaft der Fahrzeuge der Fahrzeuge zugreifen, delegiert die Fahrzeugklasse die Ausführung dieses Codes in die entsprechende Unterklasse.

Dieser Code soll polymorph sein, da der exakte Code, der ausgeführt wird, durch die Unterklasse bestimmt wird, auf die zur Laufzeit verwiesen wird.

Ich hoffe, dass dies Ihnen hilft.

Aus Polymorphismus in PHP verstehen und anwenden, Danke Steve Guidetti.

Polymorphismus ist ein langes Wort für ein sehr einfaches Konzept.

Der Polymorphismus beschreibt ein Muster in der objektorientierten Programmierung, bei der Klassen unterschiedliche Funktionen haben, während sie eine gemeinsame Schnittstelle teilen.

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 für eine Taste „tut“ jedoch, hängt jedoch davon ab, mit dem es verbunden ist, und in dem Kontext, in dem es verwendet wird - aber das Ergebnis hat sich nicht auf die Verwendung aus. Wenn Ihr Chef Ihnen auffordert, eine Taste zu drücken, haben Sie bereits alle Informationen, die zur Ausführung der Aufgabe erforderlich sind.

In der Programmierwelt wird Polymorphismus verwendet, um Anwendungen modularer und erweiterbarer zu gestalten. Anstelle von chaotischen bedingten Aussagen, die verschiedene Aktionskurse beschreiben, erstellen Sie austauschbare Objekte, die Sie basierend auf Ihren Anforderungen auswählen. Das ist das grundlegende Ziel des Polymorphismus.

Wenn jemand sagt, schneiden Sie zu diesen Leuten

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

Was wird passieren?

  • Der Chirurg würde anfangen, einen Schnitt zu machen.
  • Der Friseur würde anfangen, jemandes Haare zu schneiden.
  • Der Schauspieler würde abrupt aufhören, aus der aktuellen Szene herauszukommen und auf die Regie zu warten.

Die obige Darstellung zeigt also, was Polymorphismus (gleicher Name, unterschiedliches Verhalten) in OOP ist.

Wenn Sie ein Interview suchen und Interviewer bittet, dass Sie ein Live-Beispiel für Polymorphismus im selben Raum erzählen/zeigen, in dem wir sitzen, Say-

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 oben Beispiel verwendet. Wenn Sie Referenz für Code benötigen, folgen Sie oben.

Einfache Erklärung durch Analogie

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

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

Jeder sollte nur für eine Sache 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 leitet.

Es ist ein bisschen gleich mit Code: Bedenken und Verantwortlichkeiten sollten auf die relevanten Klassen/Personen getrennt werden. Andernfalls würden Sie den Präsidenten haben, der buchstäblich alles auf der Welt kennt - die gesamte Wikipedia. Stellen Sie sich vor, Sie haben die gesamte Wikipedia in einer Klasse Ihres Code: Es wäre ein Albtraum, den Sie pflegen würden.

Warum ist das eine schlechte Idee für einen Präsidenten, all diese spezifischen Dinge zu kennen?

Wenn der Präsident den Menschen ausdrücklich sagen würde, was zu tun ist, würde das bedeuten, dass der Präsident es braucht kennt Genau was zu tun. Wenn der Präsident selbst bestimmte Dinge kennen muss, bedeutet dies, dass Sie es an zwei Stellen schaffen müssen, nicht nur eines.

Wenn die EPA beispielsweise die Verschmutzungsgesetze ändert, dann, wenn dies passiert: Sie müssten eine Änderung der EPA -Klasse vornehmen und auch die Präsidentschaftsklasse. Das Ändern des Code an zwei Stellen und nicht an einer kann gefährlich sein - weil es viel schwieriger ist, aufrechtzuerhalten.

Gibt es einen besseren Ansatz?

Es gibt einen besseren Ansatz: Der Präsident muss die Besonderheiten von irgendetwas wissen - er kann den besten Rat von Menschen fordern, die speziell mit diesen Dingen beauftragt sind.

Er kann einen polymorphen Ansatz verwenden, um das Land zu leiten.

Beispiel - Verwendung eines polymorphen Ansatzes:

Der Präsident bittet nur die Menschen, ihn zu beraten - und das ist es, was er tatsächlich im wirklichen Leben tut - und das sollte ein guter Präsident tun. Seine Berater reagieren alle anders, aber sie alle wissen, was der Präsident bedeutet: rating (). Er hat Hunderte von Menschen, die in sein Büro strömen. Es spielt keine Rolle, wer sie sind. Alles, was der Präsident weiß, ist, dass er, wenn er sie bittet, zu "beraten", zu wissen, wie sie entsprechend reagieren sollen:

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 leiten, ohne etwas über militärische Dinge oder Gesundheitsversorgung oder internationale Diplomatie zu wissen: Die Details bleiben den Experten überlassen. Das einzige, was der Präsident wissen muss, ist Folgendes: "Advise ()".

Was du nicht willst:

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ß, dass er die Truppenzahlen und bereits bestehende Bedingungen erhöht. Dies bedeutet, dass der Präsident seine Befehle ändern müsste, wenn sich die Politik des Nahen Ostens ändern muss, ebenso gut wie Die Petraeus -Klasse auch. Wir sollten nur die Petraeus -Klasse ändern müssen, weil der Präsident nicht in solchen Details festgefahren werden muss. Er muss nichts über die Details wissen. Alles, was er wissen muss, ist, dass, wenn er eine Bestellung erteilt, alles erledigt wird. Alle Details sollten den Experten überlassen werden.

Dies ermöglicht dem Präsidenten, das zu tun, was er am besten kann: allgemeine Politik festlegen, gut aussehen und Golf spielen: p.

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

Das ist tatsächlich ein Polymorphismus. Wie genau ist es getan? Durch "Implementierung einer gemeinsamen Schnittstelle" oder Durch die Verwendung einer Basisklasse (Vererbung) - siehe die oben genannten Antworten, die dies klarer darstellen. (Um dieses Konzept klarer zu verstehen, müssen Sie wissen, was eine Schnittstelle ist, und Sie müssen verstehen, was die Vererbung ist. Ohne das könnten Sie kämpfen.)

Mit anderen Worten, Petraeus, Condi und Healthofficials wären alle Klassen, die "eine Schnittstelle implementieren" - nennen wir es die IAdvisor Schnittstelle, die nur eine Methode enthält: Advise(). Aber jetzt gehen wir in die Einzelheiten ein.

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 bleiben anderen überlassen.
  • Alles, was der Präsident wissen muss, ist zu fragen, wer jemals in die Tür geht, um ihm zu beraten - und wir wissen, dass sie absolut wissen, was zu tun ist, wenn sie gebeten werden, zu beraten (weil sie alle tatsächlich sind, Berater (oder IADVISORS :))

Ich hoffe wirklich, dass es dir hilft. Wenn Sie nichts verstehen, posten Sie einen Kommentar und ich werde es erneut versuchen.

Polymorphismus ist die Fähigkeit, eine Objektklasse zu behandeln, als ob es sich um die übergeordnete Klasse handelt.

Angenommen, es gibt eine Klasse namens Animal und eine Klasse namens Hund, die von Tier erbt. Polymorphismus ist die Fähigkeit, jedes Hundeobjekt als tierisches Objekt wie SO zu behandeln:

Dog* dog = new Dog;
Animal* animal = dog;

Polymorphismus:

Es ist das Konzept der objektorientierten Programmierung. Die Fähigkeit verschiedener Objekte, jeweils auf seine eigene Weise zu reagieren, wird als Polymorphismus bezeichnet.

Der Polymorphismus ergibt sich aus der Tatsache, dass jede Klasse in ihrem eigenen Namespace lebt. Die in einer Klassendefinition zugewiesenen Namen in Konflikt nicht mit Namen, die überall außerhalb dessen zugewiesen sind. Dies gilt sowohl der Instanzvariablen in der Datenstruktur eines Objekts als auch in den Methoden des Objekts:

  • So wie sich die Felder einer C -Struktur in einem geschützten Namespace befinden, sind 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 in anderen Klassen nicht mit den Methodamen 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, um zu fordern, dass ein Objekt etwas tut, nennt die Nachrichten die Methode, die das Objekt ausführen sollte. Da verschiedene Objekte Methoden mit demselben Namen haben können, muss die Bedeutung einer Nachricht relativ zu dem jeweiligen Objekt verstanden werden, das die Nachricht empfängt. Dieselbe Nachricht, die an zwei verschiedene Objekte gesendet wurde, kann zwei verschiedene Methoden aufrufen.

Der Hauptvorteil des Polymorphismus besteht darin, dass es die Programmierschnittstelle vereinfacht. Es ermöglicht die Feststellung von Konventionen, die nach dem Unterricht im Unterricht wiederverwendet werden können. Anstatt einen neuen Namen für jede neue Funktion zu erfinden, die Sie einem Programm hinzufügen, können die gleichen 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 in geschrieben Python 2.x.

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 wird in umgesetzt Java Verwendung der Methode Überlastung und Methode überschreiben Konzepte.

Betrachten wir ein Beispiel für das Auto, um den Polymorphismus zu diskutieren. Nehmen Sie jede Marke wie Ford, Honda, Toyota, BMW, Benz usw., alles ist vom Typ Auto.

Aber jeder verfügt über eigene fortschrittliche Funktionen und fortschrittlichere Technologien, die an ihrem Bewegungsverhalten verbunden sind.

Lassen Sie uns nun ein grundlegendes 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 das 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 Autoklasse und implementiert auch die Move () -Methode. Obwohl die Move -Methode Ford durch das Erbe bereits zur Verfügung steht, hat Ford die Methode auf seine eigene Weise implementiert. Dies nennt man Methodenüberschreibung.

Honda.java

public class Honda extends Car{
  public void move(){
    System.out.println("Move with i-VTEC engine");
  }
}

Genau wie bei 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. Mithilfe von Methoden können die Untertypen die Art und Weise ändern, wie die Methoden funktionieren, 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();

  }
}

Beispiel für Polymorphismus Ausgang:

In der Hauptmethode der Polymorphism-Example-Klasse habe ich drei Objekte, Ford und Honda erstellt. Alle drei Objekte werden vom Autotyp verwiesen.

Bitte beachten Sie hier einen wichtigen Punkt, an dem ein Superklassentyp auf einen Subklassentyp von Objekttyp verweisen kann, aber die Vizeverse ist nicht möglich. Der Grund dafür ist, dass alle Mitglieder der Super -Klasse 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 hat, auf die er zugegriffen wird.

Für die Referenzen des CAR, F und H im Polymorphismuster existiert die Bewegungsmethode aus dem Autyp. Der Compiler überträgt also den Kompilierungsprozess ohne Probleme.

Wenn es um die Ausführung der Laufzeit geht, ruft die virtuelle Maschine die Methoden auf den Objekten auf, die Untertypen sind. Die Methode Move () wird also aus ihren jeweiligen Implementierungen beruft.

Alle Objekte sind also vom Typ Autos, aber während der Laufzeit hängt die Ausführung von dem Objekt ab, auf das der Aufruf geschieht. Dies nennt man Polymorphismus.

Normalerweise bezieht sich dies die Fähigkeit, ein Objekt vom Typ A zu verhalten, wie ein Objekt von Typ B in der objektorientierten Programmierung, dies wird normalerweise durch Vererbung erreicht. Einige Wikipedia -Links, um mehr zu lesen:

Bearbeiten: Fixierte kaputte Links.

Polymorphismus ist Folgendes:

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 eine Tasse anstelle einer bestimmten Instanz passieren. Dies hilft in der Allgemeinheit, da Sie keine bestimmte Maßnahme () für jeden Cup -Typ angeben müssen

Ich weiß, dass dies eine ältere Frage mit vielen guten Antworten ist, aber ich möchte einen Satz beachten:

Behandeln Sie einen abgeleiteten Typ, als wäre es der Basistyp.

Es gibt viele Beispiele oben, die dies in Aktion zeigen, aber ich bin der Meinung, dass dies eine gute Antwort ist.

(Ich habe einen weiteren Artikel über etwas ganz anderes durchsucht. Und Polymorphismus tauchte auf ... jetzt dachte ich, ich wüsste, was Polymorphismus war ... aber anscheinend nicht auf diese schöne Art und Weise. Ich wollte es irgendwo aufschreiben. besser wird es noch teilen ...)

http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife

Lesen Sie aus diesem Teil:

..... Polymorphismus. Das ist eine geekige Art zu sagen, dass verschiedene Substantive das gleiche Verb auf sie anwenden können.

Der Begriff Polymorphismus stammt aus:

Poly = viele

Morphismus = die Fähigkeit zu ändern

Bei der Programmierung ist Polymorphismus eine "Technik", mit der Sie ein Objekt als mehr als eine Art von Dingen "betrachten". Zum Beispiel:

Ein Studentenobjekt ist auch ein Personenobjekt. Wenn Sie im Schüler "schauen" (dh Cast), können Sie wahrscheinlich nach dem Studentenausweis fragen. Sie können das nicht immer mit einer Person machen, oder? (Eine Person ist nicht unbedingt ein Schüler, hat daher möglicherweise keinen Studentenausweis.) Eine Person hat jedoch wahrscheinlich einen Namen. Ein Schüler tut es auch.

Fazit "schauen" auf dasselbe Objekt aus verschiedenen "Winkeln" können Sie unterschiedliche "Perspektiven" geben (dh verschiedene Eigenschaften oder Methoden)

Mit dieser Technik können Sie Sachen erstellen, die aus verschiedenen Blickwinkeln "betrachtet" werden können.

Warum verwenden wir Polymorphismus? Für den Anfang ... Abstraktion. An diesem Punkt sollte es genug Info sein :)

Im Allgemeinen ist es die Fähigkeit, eine Reihe verschiedener Objekttypen mit derselben oder einer oberflächlich ähnlichen API zu verkürzen. Es gibt verschiedene Formen:

  • Funktion Überladung: Definieren mehrerer Funktionen mit demselben Namen und unterschiedlichen Parametertypen wie SQRT (Float), SQRT (doppelt) und SQRT (Komplex). In den meisten Sprachen, die dies zulassen, wählt der Compiler automatisch die richtige für die Art des Arguments aus, das in ihn übergeben wird. Daher handelt es sich um Kompilierungs-Zeit-Polymorphismus.

  • Virtuelle Methoden in OOP: Eine Methode einer Klasse kann verschiedene Implementierungen auf die Besonderheiten ihrer Unterklassen zugeschnitten haben. Jede dieser diese soll die in der Basisklasse angegebene Implementierung außer Kraft setzen. Bei einem Objekt, das von der Basisklasse oder einer seiner Unterklassen stammen kann, wird die richtige Implementierung im laufenden Fliegen ausgewählt, daher ist dies die Laufzeitpolymorphismus.

  • Vorlagen: Ein Merkmal einiger OO -Sprachen, bei denen eine Funktion, Klasse usw. durch einen Typ parameterisiert werden kann. Sie können beispielsweise eine generische "Liste" Vorlagenklasse definieren und dann als "Liste der Ganzzahlen", "Liste der Zeichenfolgen", möglicherweise sogar "Liste der Zeichenfolgen" oder dergleichen, instanziieren. Im Allgemeinen schreiben Sie den Code einmal für eine Datenstruktur beliebiger Elementtyp, und der Compiler generiert Versionen davon für die verschiedenen Elementtypen.

Lassen Sie uns eine Analogie verwenden. Für ein bestimmtes musikalisches Drehbuch gibt es jeder Musiker, der spielt, in der Interpretation ihre eigene Berührung.

Der Musiker kann mit Schnittstellen abstrahiert werden. Genre, zu dem Musiker gehört, kann eine Abstrac -Klasse sein, die einige globale Interpretationsregeln definiert, und jeder Musiker, der spielt, kann mit einer konkreten Klasse modelliert werden.

Wenn Sie ein Zuhörer der musikalischen Arbeit sind, haben Sie einen Hinweis auf das Drehbuch, z.

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());
}

Ich habe einen Überblick über Polymorphismus auf hoher Ebene für eine weitere Frage gegeben:

Polymorphismus in C ++

Ich hoffe es hilft. Ein Auszug...

... Es hilft, von einem einfachen Test und Definition von [Polymorphismus] zu beginnen. Betrachten Sie den Code:

Type1 x;
Type2 y;

f(x);
f(y);

Hier, f() ist eine Operation durchzuführen und erhält die Werte x und y als Eingänge. Polymorph sein, f() Muss in der Lage sein, mit Werten von mindestens zwei unterschiedlichen Typen zu arbeiten (z. int und double), Finden und Ausführen von typengerechtem Code.

(Fortsetzung bei Polymorphismus in C ++ )

Polymorphismus ist eine Fähigkeit von Objekt, die in vielen Formen genommen werden kann. Zum Beispiel kann in der menschlichen Klasse ein Mann in vielen Formen handeln, wenn wir über Beziehungen sprechen. Beispiel: 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 sich auf ein Objekt der untergeordneten Klassen zu beziehen. In diesem Beispiel, das in Java geschrieben ist, haben wir drei Fahrzeugtypen. Wir erstellen drei verschiedene Objekte und versuchen, ihre Rädermethode 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:

The Result

Für weitere Informationen, besuchen Sie bitte https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/polymorphismaxample.java. Ich hoffe, es hilft.

Polymorphismus ist die Fähigkeit des Programmierers, gleichnamige Methoden zu schreiben, die je nach den Anforderungen dieser Objekte unterschiedliche Dinge für verschiedene Arten von Objekten tun. Zum Beispiel, wenn Sie eine Klasse namens entwickelt haben Fraction und eine Klasse namens ComplexNumber, Beide können eine Methode genannt werden display(), aber jeder von ihnen würde diese Methode unterschiedlich implementieren. In PHP können Sie es beispielsweise so 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 der Vererbung verwendet wird; Zum Beispiel vielleicht Fraction und ComplexNumber Beide implementieren eine abstrakte Klasse genannt Number Das hat eine Methode display(), welcher Bruch und Komplexnummer sind dann beide zur Umsetzung verpflichtet. Aber du nicht brauchen Vererbung, um den Polymorphismus zu nutzen.

Zumindest in dynamisch-typen Sprachen wie PHP (ich weiß nichts über C ++ oder Java), ermöglicht Polymorphismus dem Entwickler, eine Methode aufzurufen, ohne unbedingt den Objekttyp im Voraus zu kennen und zu vertrauen, dass die korrekte Implementierung der Methode wird heißen. Angenommen, der Benutzer wählt den Typ von aus Number erstellt:

$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 die angemessenen display() Die Methode wird aufgerufen, obwohl der Entwickler nicht im Voraus wissen kann, ob der Benutzer einen Bruch oder eine komplexe Nummer auswählt.

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

Polymorphismus bedeutet buchstäblich mehrere Formen. (oder viele Form): Objekt aus verschiedenen Klassen und gleichnamige Methode, aber Workflows sind unterschiedlich. Ein einfaches Beispiel wäre:

Betrachten Sie eine Person X.

Er ist nur eine Person, aber er handelt so viele. Sie können fragen, wie:

Er ist ein Sohn seiner Mutter. Ein Freund von seinen Freunden. Ein Bruder seiner Schwester.

Polymorphismus in OOP bedeutet, dass eine Klasse unterschiedliche Typen haben könnte, die Vererbung ist eine Möglichkeit, Polymorphismus zu implementieren.

zum Beispiel, Form ist eine Schnittstelle, es hat Quadrat, Kreis, Diamant Subtypen. Jetzt haben Sie ein quadratisches Objekt, Sie können das Quadrat automatisch aufbauen, da das Quadrat eine Form hat. Wenn Sie jedoch versuchen, die Form auf das Quadrat zu downcasting zu downcasting, müssen Sie explizites Typ -Casting durchführen, da Sie nicht sagen können, dass Form quadratisch ist, könnte es auch Kreis sein. Sie müssen es also manuell mit Code wie möglich besetzt Square s = (Square)shape, Was ist, wenn die Form Kreis ist, Sie werden bekommen? java.lang.ClassCastException, weil der Kreis nicht quadratisch ist.

Polymorphismus:

Unterschiedliche Ausführung gemäß der Instanz der Klasse, nicht der Art der Referenzvariablen.

Eine Schnittstellentyp -Referenzvariable kann auf eine der Klasseninstanzen verweisen, die diese Schnittstelle implementieren.

Polymorphismus ist die Fähigkeit, ein Objekt in einer bestimmten Klasse zu verwenden, in der alle Komponenten, aus denen das Objekt besteht, durch Unterklassen der angegebenen Klasse vererbt werden. Dies bedeutet, dass sobald dieses Objekt von einer Klasse deklariert ist, alle Unterklassen darunter (und ihre Unterklassen usw., bis Sie die am weitesten/niedrigste 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 Superklasse:

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 weitere 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 über die übergeordnete Klasse: starten:

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 kompilieren. Beachten Sie auch, dass Sie Maidenname und FamilyTree immer weiter unten 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 wirken.

Da viele vorhandene Antworten Subtypen mit Polymorphismus zusammenhängen, finden Sie hier drei Möglichkeiten (einschließlich Subtyping), um Polymorphismus zu implementieren.

  • Parameterischer (generischer) Polymorphismus Ermöglicht eine Routine, zusätzlich zu den normalen Parametern einen oder mehrere Typparameter zu akzeptieren, und führt sich auf diesen Typen aus.
  • Subtyp -Polymorphismus Ermöglicht eine Routine, auf jeden Subtyp ihrer Parameter zu reagieren.
  • Ad -hoc -Polymorphismus Verwendet im Allgemeinen routinemäßige Überlastung, um ein polymorphes Verhalten zu gewähren, kann aber auch auf andere Polymorphismus -Implementierungen verweisen.

Siehe auch:

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

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

In objektorientierten Sprachen ermöglicht Polymorphismus die Behandlung und Handhabung verschiedener Datentypen über dieselbe Schnittstelle. Betrachten Sie beispielsweise die Vererbung in C ++: Klasse B aus der Klasse A. 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 verarbeiten

Polymorphismus in codierenden Begriffen ist, wenn Ihr Objekt durch Vererbung als mehrere Typen existieren kann ". Wenn Sie anschließend eine Instanz von "Quadrat" machen, können Sie es nach Bedarf von "Form" zu "Quadrat" zurück- und vorwärts werfen.

Mit dem Polymorphismus können Sie ein Modul erstellen, das ein anderes aufruft, und dennoch den Kompilierungszeitabhängigkeitspunkt gegen den Kontrollfluss anstelle des Kontrollflusss.

Durch die Verwendung von Polymorphismus hängt ein hochstufiges Modul nicht vom Modul mit niedrigem Niveau ab. Beide hängen von Abstraktionen ab. Dies hilft uns, das Abhängigkeitsinversionsprinzip anzuwenden (https://en.wikipedia.org/wiki/dependency_inversion_principle).

Hier fand ich die obige Definition. Etwa 50 Minuten nach dem Video erklärt der Ausbilder das oben genannte.https://www.youtube.com/watch?v=tmuno5rznee

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top