Frage

Wie kann Polymorphismus in eine einfach zu verstehenden Art und Weise beschrieben werden?

Wir können eine Menge Informationen über das Thema im Internet und Büchern finden, wie in Typ Polymorphismus . Aber lassen Sie uns versuchen, es so einfach zu machen wie wir können.

War es hilfreich?

Lösung

Dies ist aus meinem von einer ähnlichen Frage beantworten . Hier ist ein Beispiel für Polymorphismus in pseudo-C # / Java:

class Animal
{
    abstract string MakeNoise ();
}

class Cat : Animal {
    string MakeNoise () {
        return "Meow";
    }
}

class Dog : Animal {
    string MakeNoise () {
        return "Bark";
    }
}

Main () {
   Animal animal = Zoo.GetAnimal ();
   Console.WriteLine (animal.MakeNoise ());
}

Die Methode Main () kennt nicht die Art des Tieres und ist abhängig von Verhalten einer bestimmten Implementierung des MakeNoise () -Methode.

Andere Tipps

Zwei Objekte reagieren auf die gleiche Botschaft mit unterschiedlichen Verhaltensweisen; der Absender muss nicht kümmern.

Jeder kann mit einem einfachen Pop-Deckel öffnet sich die gleiche Weise.
Als Mensch, wissen Sie, dass Sie eine solche Open () können Sie finden können.

Beim Öffnen nicht alle Dosen die gleiche Art und Weise verhalten.
Einige Nüsse enthalten, einige enthalten gefälschte Schlangen, die herausspringen.
Das Ergebnis hängt davon ab, welche Art von Dose, wenn die Dose war ein „CanOfNuts“ oder ein „CanOfSnakes“, aber dies hat keinen Einfluss auf, wie Sie es öffnen. Sie müssen nur wissen, dass Sie jede Dose kann offen halten, und eine Art von Ergebnis erhalten, die auf welche Art von entschieden basiert Kann es war, dass Sie geöffnet.

pUnlabledCan-> Open (); // könnte Nüsse geben, könnte Schlangen geben. Wir wissen nicht, bis wir es nennen

Open () hat einen generischen Rückgabetyp „Inhalt“ (oder wir könnten keinen Rückgabetyp entscheiden), so dass offen immer die gleiche Funktion Signatur hat.

Sie, der Mensch, sind die Benutzer / Anrufer.
Open () ist die virtuelle / polymorphe Funktion.
„Can“ ist die abstrakte Basisklasse.
CanOfNuts und CanOfSnakes sind die polymorphen Kinder der „Can“ Klasse.
Jeder kann geöffnet werden, aber was speziell es hat und welche spezifische Tye von Inhalt es kehrt definiert durch welche Art von kann es sich handelt.
Alles, was Sie wissen, wenn Sie sehen, pUnlabledCan ist, dass man es öffnen () kann, und es wird den Inhalt zurück. Alle andere Verhaltensweisen (wie Schlangen in Ihrem Gesicht knallt) werden durch die spezifische Can entschieden.

Die einfachste Beschreibung des Polymorphismus ist, dass es eine Art und Weise, wenn / switch-Anweisungen zu reduzieren, ist .

Es hat auch den Vorteil, dass Sie Ihre verlängern, wenn / switch-Anweisungen (oder anderen Leute sind), ohne die bestehenden Klassen zu ändern.

Zum Beispiel der Stream Klasse in .NET betrachten. Ohne Polymorphismus wäre es eine einzige massive Klasse, wo jede Methode ein switch-Anweisung so etwas wie implementiert:

public class Stream
{
    public int Read(byte[] buffer, int offset, int count)
    {
        if (this.mode == "file")
        {
            // behave like a file stream
        }
        else if (this.mode == "network")
        {
            // behave like a network stream
        }
        else // etc.
    }
}

Stattdessen lassen wir die Laufzeit die Umschaltung für uns auf eine effizientere Art und Weise zu tun, indem sie die Umsetzung automatisch die Auswahl auf der Grundlage der konkreten Typ (FileStream, NetworkStream), z.

public class FileStream : Stream
{
    public override int Read(byte[] buffer, int offset, int count)
    {
        // behave like a file stream
    }
}

public class NetworkStream : Stream
{
    public override int Read(byte[] buffer, int offset, int count)
    {
        // behave like a network stream
    }
}

Poly: viele
Morphism: Formen / Formen

Der Schauspieler gegenüber dem Zeichen (oder Rolle)

Äpfel und Orangen sind beide Früchte. Frucht kann gegessen werden. Daher können beide Äpfel und Orangen gegessen werden.

Der Kicker? Sie essen sie anders! Sie schälen Orangen, aber nicht die Äpfel.

So ist die Implementierung unterscheidet, aber das Endergebnis ist das gleiche, Sie essen die Früchte .

Wenn es wie eine Ente geht und quakt wie eine Ente, dann können Sie es als eine Ente behandeln überall benötigen Sie eine Ente.

Dies ist ein besserer Artikel tatsächlich

Polymorphismus ermöglicht Objekte zu „Look“ die gleichen, aber auf unterschiedliche Weise verhalten. Das übliche Beispiel wird ein Tier mit einer Basisklasse Speak () Methode zu nehmen, ein Hund Subklasse Rinde während einer Unterklasse Pig eine oink würde emittieren emittieren würde.

Die 5 Sekunden kurze Antwort der meisten Leute benutzen, damit andere Entwickler ihren Kopf um Polymorphismus bekommen können, ist eine Überlastung und Überschreiben

Die gleiche Syntax, unterschiedliche Semantik.

einfachste Weg, es zu beschreiben: ein Verb, das auf mehr als eine Art von Objekt anwenden kann

.

Alles andere, wie Hillel sagte, ist nur Kommentare.

Polymorphismus behandelt Dinge abstrakt, indem Sie auf die Kenntnis einer gemeinsamen „Eltern“ unter Berufung (man denke heirarchies wie Tier als Eltern von Hunden und Katzen).

Zum Beispiel werden alle Tiere Sauerstoff atmen können, und während sie dies jeder tun kann anders könnten Sie eine Anlage entwerfen, die Sauerstoff für die Tiere bietet, zu atmen, beide Hunde und Katzen zu unterstützen.

Als kleines Extra können Sie dies tun, obwohl Tier eine „abstrakt“ ist Kennung (es gibt keine wirkliche „Animal“ Sache, nur Tierart).

Polymorphismus ist die Speicherung von Werten von mehr als einem Typ in einen Ort eines einzigen Typs.

Beachten Sie, dass die meisten anderen Antworten auf diese Frage, die zum Zeitpunkt meines Schreibens, beschreiben tatsächlich dynamischer Dispatch nicht Polymorphismus.

Dynamische Dispatch erfordert Polymorphismus, aber das Gegenteil ist nicht wahr. Man könnte eine Sprache sehr ähnlich Java vorstellen oder C #, aber deren System.Object keine Mitglieder hatte; typecasting wäre notwendig, bevor irgendetwas mit dem Wert zu tun. In dieser fiktiven Sprache gäbe es Polymorphismus, aber nicht unbedingt virtuelle Methoden oder andere dynamischen Dispatch-Mechanismen.

Dynamische Dispatch ist das verwandte, aber unterschiedliches Konzept, gut genug, um in den meisten anderen Antworten beschrieben. Allerdings funktioniert so, wie es normalerweise in der objektorientierten Sprachen (basierend auf dem ersten Auswahl eine Funktion ( ‚this‘ oder ‚Selbst‘) Argument-Typen) ist nicht der einzige Weg, um es funktionieren kann. Multiple Dispatch ist auch möglich, wo die Auswahl über die Typen aller Argumente angewendet wird.

Ebenso Überlastungs Auflösung und mehrere Dispatch sind exakte Analoga voneinander; Überladungsauflösung ist, mehrere Dispatch statischen Typen angewendet, während mehrere Dispatch Überlastungs Auflösung angewendet Typen in polymorphen Stellen gespeichert zu der Laufzeit.

Polymorphismus ist die Welt in Kisten Aufteilung auf der Grundlage gemeinsamer Eigenschaften und die Elemente in einem bestimmten Feld zu behandeln, als austauschbar, wenn Sie nur diese gemeinsamen Eigenschaften verwendet werden soll.

Polymorphismus ist die Fähigkeit zur Behandlung von andere Dinge, als ob sie die gleiches , was durch eine gemeinsame Identität zwischen ihnen Gründung dann zu nutzen.

Polymorphismus ist, was Sie bekommen, wenn die gleiche Methode, um mehrere Klassen gilt. Zum Beispiel kann sowohl ein String und eine Liste könnten „Reverse“ Methoden. Beide Methoden haben den gleichen Namen ( „Reverse“). Beide Methoden tun etwas sehr ähnlich (alle Zeichen umkehren oder die Reihenfolge der Elemente in der Liste rückwärts). Aber die Umsetzung der einzelnen „Reverse“ Methode unterscheidet und spezifisch für seine Klasse. (Mit anderen Worten, die String kehrt sich wie eine Kette, und die Liste kehrt sich wie eine Liste.)

eine Metapher verwenden, könnten Sie „Make Dinner“ zu einem Französisch Koch oder zu einem japanischen Koch sagen. Jeder würde führen in ihrer eigenen charakteristischen Art und Weise „Abendessen machen.“

Das praktische Ergebnis ist, dass Sie eine „Umkehr Engine“ schaffen könnten, die ein Objekt übernimmt und Anrufe „Reverse“ auf sie. Solange die Aufgabe, eine Reverse-Methode hat, Ihr Umkehren Motor funktioniert.

die Koch Analogie zu verlängern, könnten Sie eine „Waiterbot“ bauen, die Köche zu „Make Dinner“ erzählt. Die Waiterbot muss wissen nicht, welche Art von Abendessen gemacht werden soll. Es muss nicht einmal sicherstellen, dass es zu einem Koch spricht. Alles, was zählt ist, dass der „Chef“ (oder Feuerwehrmann oder Automaten oder Spendertiernahrung) weiß, was wann zu tun ist ihm gesagt, „Dinner Make“.

Was kauft man als Programmierer weniger Codezeilen und jede Typsicherheit oder die späten Bindung ist. Zum Beispiel hier ist ein Beispiel mit Typ-Sicherheit und die frühen Bindung (in einer C-ähnlichen Sprache, die ich mache, wie ich gehe):

class BankAccount {
    void SubtractMonthlyFee
}

class CheckingAccount : BankAccount {}

class SavingsAccount : BankAccount {}

AssessFee(BankAccount acct) {
    // This will work for any class derived from
    //   BankAccount; even classes that don't exist yet
    acct.SubtractMonthlyFee
}

main() {

    CheckingAccount chkAcct;
    SavingsAccount saveAcct;

    // both lines will compile, because both accounts
    //   derive from "BankAccount". If you try to pass in
    //   an object that doesn't, it won't compile, EVEN
    //   if the object has a "SubtractMonthlyFee" method.
    AssessFee(chkAcct);
    AssessFee(saveAcct);
}

Hier ist ein Beispiel ohne Typen Sicherheit, sondern mit dem späten Bindung:

class DatabaseConnection {
    void ReleaseResources
}

class FileHandle {
    void ReleaseResources
}

FreeMemory(Object obj) {
    // This will work for any class that has a 
    //   "ReleaseResources" method (assuming all
    //   classes are ultimately derived from Object.
    obj.ReleaseResources
}

main() {

    DatabaseConnection dbConn;
    FileHandle fh;

    // You can pass in anything at all and it will
    //   compile just fine. But if you pass in an
    //   object that doesn't have a "ReleaseResources"
    //   method you'll get a run-time error.
    FreeMemory(dbConn);
    FreeMemory(fh);
    FreeMemory(acct); //FAIL! (but not until run-time)
}

Für ein hervorragendes Beispiel, Blick auf dem .NET ToString () -Methode. Alle Klassen haben es, weil alle Klassen von der Objektklasse abgeleitet werden. Aber jede Klasse kann ToString () in einer Art und Weise implementieren, die Sinn für sich selbst macht.

EDIT: Einfach = kurz, IMHO

Polymorphismus ist die Sprache Funktionalität auf hohem Niveau algorithmischen Code ermöglicht auf mehrere Arten von Daten unverändert zu betreiben.

Dies wird, indem sichergestellt wird der Betrieb die richtige Implementierung für jeden Datentyp aufrufen getan. Selbst in einem OOP-Kontext (aus dieser Tag der Frage), die „richtige Implementierung“ kann zur Compile-Zeit oder Laufzeit (beide, wenn Ihre Sprache unterstützt) gelöst werden. In einigen Sprachen wie C ++, Compiler bereitgestellte Unterstützung für Laufzeit-Polymorphismus (dh virtueller Versand) ist spezifisch für OOP, während andere Arten von Polymorphismus auch auf Datentypen einsetzen können, die Objekte sind (dh struct oder class Instanzen nicht, aber können Typen wie int oder double gebautet werden).

(Die Arten von Polymorphismus C ++ unterstützt werden aufgelistet und in meiner Antwort gegenüber: Polymorphismus in c ++ - auch wenn Sie andere Sprachen programmieren, ist es potenziell instruktiv)

Die Art und Weise versuche ich denke, es ist etwas, das gleich aussieht, kann aber unterschiedliche Funktionen haben, abhängig von der Instanz. So können Sie einen Typ haben

interface IJobLoader

, aber je nachdem, wie es verwendet wird, um verschiedene Funktionen haben kann, während immer noch die gleichen suchen. Sie haben Instanzen für BatchJobLoader, NightlyJobLoader etc

Vielleicht bin ich weg.

Der Begriff Polymorphismus kann auch zu einer Überlastung Funktionen anwenden. Zum Beispiel:

string MyFunc(ClassA anA);
string MyFunc(ClassB aB);

ist ein nicht-objektorientiertes Beispiel für Polymorphismus.

Ist die Fähigkeit, dass Objekte auf die gleiche Botschaft auf verschiedene Weise reagieren müssen.

Zum Beispiel in Sprachen wie Smalltalk, Ruby, Objective-C, Sie haben gerade die Nachricht zu senden, und sie werden antworten.

 dao  = XmlDao.createNewInstance()    #obj 1
 dao.save( data )

 dao = RdbDao.createNewnewInstance()  #obj 2
 dao.save( data )

In diesem Beispiel zwei verschiedene Objekte, reagierten auf unterschiedliche Weise auf die gleichen Nachrichten: "createNewInstance () und speichert (obj)"

Sie wirken auf unterschiedliche Weise, auf die gleiche Botschaft. In den oben genannten Sprachen könnten die Klassen nicht einmal in der gleichen Klassenhierarchie sein, es genügt, dass sie auf die Nachricht reagieren.

In Sprachen wie Java, C ++, C # usw. Um das Objekt zu einer Objektreferenz zuweisen, müssen sie die gleiche Art Hierarchie entweder gemeinsam durch die Schnittstelle implementiert oder von der Unterklasse einer gemeinsamen Klasse zu sein.

leicht .. und einfach.

Polymorphismus ist bei weitem die wichtigste und relevantes Merkmal der objektorientierten Programmierung.

Es ist eine Möglichkeit, verschiedene Dinge zu behandeln, die ohne Pflege etwas ähnliches in der gleichen Art und Weise tun, wie sie es tun.

Angenommen, Sie haben ein Spiel mit einem Bündel von verschiedenen Arten von Fahrzeugen haben rumfahren wie Auto, LKW, Skateboard, Flugzeug, etc ... Sie alle stoppen können, aber jedes Fahrzeug stoppt in einer anderen Weise. Einige Fahrzeuge müssen möglicherweise Gänge herunterzuschalten, und einige können zu einem kalten Stillstand kommen können. Polymophism können Sie dies tun,

foreach (Vehicle v in Game.Vehicles)
{
   v.Stop();
}

Die Art und Weise, die implementiert stoppen auf die verschiedenen Fahrzeuge aufgeschoben wird, so dass Ihr Programm muss darüber nicht.

Es ist nur eine Möglichkeit, alte Kälte zu bekommen neuen Code zu nennen. Sie schreiben eine Anwendung, die eine „Shape“ Schnittstelle mit Methoden akzeptiert, die andere umsetzen müssen (Beispiel - getArea). Wenn jemand mit einem neuen Whizknall Weg kommt, um diese Schnittstelle zu implementieren Ihren alten Code, der neuen Code über die der getArea Methode aufrufen kann.

Die Fähigkeit eines Objekts einer bestimmten Art (zum Beispiel ein Auto) zu handeln (zB Bremse) wie eine von einem anderen Typ (zB ein Fahrzeug), die in der Regel gemeinsame Abstammung legt nahe (zB Auto ein Subtyp von Fahrzeug ist) an einem Punkt in die Art Hierarchie.

Polymorphismus ist die objektorientierte Lösung für das Problem eine Funktion an eine andere Funktion übergeben. In C können Sie tun,

 void h() { float x=3.0; printf("%f", x); }
 void k() { int y=5; printf("%i", y); }
 void g(void (*f)()) { f(); }
 g(h);  // output 3.0
 g(k);  // output 5

In C Dinge kompliziert werden, wenn die Funktion auf zusätzlichen Parametern abhängt. Wenn die Funktionen h und k auf verschiedene Arten von Parametern abhängen, sind Sie in Schwierigkeiten, und Sie müssen Gießen verwenden. Sie haben diese Parameter in einer Datenstruktur zu speichern, und einen Zeiger auf die Datenstruktur zu übergeben, die es g bis h oder k passiert. h und k gegossen den Zeiger in einen Zeiger auf die richtige Struktur und die Daten entpacken. Sehr chaotisch und sehr unsicher wegen möglicher Gussfehler:

 void h(void *a) { float* x=(float*)a; printf("%f",*x); }
 void k(void *a) { int* y=(int*)a; printf("%i",*y); }
 void g(void (*f)(void *a),void *a) { f(a); }
 float x=3.0;
 int y=5;
 g(h,&x); // output x
 g(k,&y); // output y

So erfanden sie Polymorphismus. h und k Klassen gefördert und die eigentlichen Funktionen auf Verfahren, sind die Parameter Elementvariablen der jeweiligen Klasse, h oder k. Statt um die Funktion vorbei, Sie eine Instanz der Klasse übergeben, die die Funktion enthält, die Sie wollen. Die Instanz enthält seine eigenen Parameter.

class Base { virtual public void call()=0; }
class H : public Base { float x; public void call() { printf("%f",x);} } h;
class K : public Base { int y; public void call() { printf("%i",y);} } k;
void g(Base &f) { f.call(); };
h.x=3.0;
k.y=5;
g(h); // output h.x
g(k); // output k.x
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top