Polymorphismus - In nur zwei Sätzen definieren [geschlossen]


85

Ich habe mir andere Definitionen und Erklärungen angesehen und keine davon befriedigt mich. Ich möchte sehen, ob jemand Polymorphismus in höchstens zwei Sätzen definieren kann, ohne Code oder Beispiele zu verwenden. Ich möchte nicht hören, dass Sie eine Person / ein Auto / einen Dosenöffner haben ... oder wie das Wort abgeleitet wird (niemand ist beeindruckt, dass Sie wissen, was Poly und Morph bedeuten). Wenn Sie ein sehr gutes Verständnis für Polymorphismus haben und gute Englischkenntnisse haben, sollten Sie in der Lage sein, diese Frage in einer kurzen, wenn auch dichten Definition zu beantworten. Wenn Ihre Definition den Polymorphismus genau definiert, aber so dicht ist, dass ein paar Überlesungen erforderlich sind, dann ist das genau das, wonach ich suche.

Warum nur zwei Sätze? Weil eine Definition kurz und intelligent ist. Eine Erklärung ist lang und enthält Beispiele und Code. Hier finden Sie Erklärungen (die Antwort auf diesen Seiten ist für meine Frage nicht zufriedenstellend):

Polymorphismus vs Überschreiben vs Überladen
Versuchen Sie, Polymorphismus so einfach wie möglich zu beschreiben

Warum stelle ich diese Frage? Weil mir dieselbe Frage gestellt wurde und ich feststellte, dass ich keine zufriedenstellende Definition finden konnte (nach meinen Standards, die ziemlich hoch sind). Ich möchte sehen, ob einer der großen Köpfe auf dieser Seite dies kann.

Wenn Sie die Zwei-Satz-Anforderung wirklich nicht erfüllen können (es ist schwierig, ein Thema zu definieren), ist es in Ordnung, wenn Sie darüber nachdenken. Die Idee ist, eine Definition zu haben, die tatsächlich definiert, was Polymorphismus ist und nicht erklärt, was er tut oder wie man ihn verwendet (den Unterschied erkennen?).


Ein Name, mehrere Implementierung.
Prosunjit Biswas

2
Diese Frage wurde mir in einem Vorstellungsgespräch gestellt. Ich fand, dass es ein elitärer Akt des Snobismus war, es in einem Vorstellungsgespräch zu fragen, was ein Google-Mitarbeiter selbstgefällig fragen würde, vorausgesetzt, niemand könnte es effektiv beantworten. Wenn Sie den Job nicht bekommen haben, weil Sie nicht antworten konnten, sind Sie wahrscheinlich besser dran, für Leute zu arbeiten, die mehr daran interessiert sind, was Sie tun können, als wen Sie überlisten können.
MagicLAMP

Polymorphismus ist ein sehr wichtiges Konzept, das in der Entwicklung zu verstehen ist. Ich empfehle dringend, zumindest seinen Wert zu verstehen, wenn nicht die formale Definition. Ich schlage vor, am wenigsten erklären zu können, wie das Strategiemuster funktioniert und welchen Wert es hat.
Chad Johnson

Antworten:


104

Der Polymorphismus ermöglicht den Ausdruck einer Art von Vertrag, wobei möglicherweise viele Typen diesen Vertrag (ob durch Klassenvererbung oder nicht) auf unterschiedliche Weise implementieren, jeweils entsprechend ihrem eigenen Zweck. Code , der diesen Vertrag verwendet, sollte sich (*) nicht darum kümmern müssen, um welche Implementierung es sich handelt, sondern nur darum, dass der Vertrag eingehalten wird.

(*) Im Idealfall jedenfalls - offensichtlich hat der aufrufende Code ziemlich oft sehr bewusst die entsprechende Implementierung gewählt!


1
Mark, hast du diese Antwort einmal akzeptiert und dann nicht akzeptiert? Ich versuche herauszufinden, was wie ein Fehler im Reputationssystem aussieht - diese Antwort hat mir seltsamerweise für heute ein Netz von -15 Wiederholungen gegeben, seltsamerweise.
Jon Skeet

Gleich hier, Jon - ich habe jetzt 2 akzeptierte Antworten mit -15 Wiederholungen. Nicht, dass es mich interessiert, aber es ist faszinierend.
Otávio Décio

3
Streng genommen gibt es keine Anforderung, dass "ein Typ eine Art Vertrag ausdrückt". Alles, was wirklich erforderlich ist, ist, dass mehrere Implementierungen auf dieselbe Nachricht antworten können, ohne dass der Absender der Nachricht wissen oder sich darum kümmern muss, welche Implementierung die Nachricht verarbeitet.
Doug Knesek

3
@Doug: Wenn es keinen Vertrag gibt, der sogar durch Dokumentation oder Benennung impliziert wird, wie um alles in der Welt wissen Sie dann, dass er das tun wird, was Sie wollen? Sie sprechen in Ihrer eigenen Antwort von einer "Schnittstelle" - was für mich sehr nach einem Vertrag klingt - was sehen Sie als Unterschied? Sowohl "Schnittstelle" als auch "Vertrag" sind Wörter, die in einem "starken" Sinne (z. B. zur Kompilierungszeit erzwungen) oder sehr locker (z. B. durch Namenskonvention und Verwendung dynamischer Typisierung) verwendet werden können.
Jon Skeet

1
@Alex: Ja, das wäre eine Bearbeitung, die ich zurücksetzen würde - ich bevorzuge meinen Wortlaut. Sie können jedoch jederzeit Ihre eigene Antwort hinzufügen.
Jon Skeet

71

Obst kann in der Regel gegessen werden, aber verschiedene Obstsorten werden auf unterschiedliche Weise gegessen. Ein Apfel, der eine Frucht ist, kann gegessen werden (weil es eine Frucht ist). Eine Banane kann auch gegessen werden (weil es auch eine Frucht ist), aber anders als ein Apfel. Sie schälen es zuerst.

Nun, zumindest tue ich das, aber ich bin in gewisser Weise komisch, also was weiß ich.

Dies zeigt Vererbung (Obst kann gegessen werden), Polymorphismus (etwas, das Obst isst, kann alle Arten von Obst essen) und Einkapselung (eine Banane hat eine Haut).

Im Ernst, Objektvererbung, Polymorphismus, Kapselung, virtuelle Dinge, abstrakte Dinge, private Dinge, öffentliche Dinge, all dies sind harte Konzepte. Wenn jemand unbedingt eine 2-Satz-Definition davon haben möchte, markieren Sie die Frage bitte als Code-Golf-Variante, da zwei solche Sätze so knapp sein müssen, dass Sie nicht genug darüber lernen, wenn Sie nicht wissen, was es bereits ist es, um zu wissen, worüber Sie mehr erfahren müssen.


lassevk: "Wenn du nicht weißt, was es schon ist, wirst du nicht genug darüber lernen, um zu wissen, was du brauchst, um mehr darüber zu erfahren." << Nur zur Klarstellung, das erwarte ich. Ich suche nach einer Definition, deren Verständnis einige Gedanken erfordert. Keiner, der verwendet würde, um einen Anfänger zu unterrichten.
Mark Testa

2
Ich habe das zusammengetragen, ich habe gerade eine etwas humorvolle (für mich jedenfalls) Antwort gepostet :) Polymorphismus und OOP sind eines dieser großen Wand-Dinge. Wenn Sie die Lernkurve grafisch darstellen, treffen Sie einfach eine große Wand und kriechen entweder darüber oder du nicht. Wenn Sie dies tun, haben Sie normalerweise eine große AHA! Erfahrung ...
Lasse V. Karlsen

8
Hemlock ist auch eine Frucht! Sie können es aber nur einmal essen!
James Anderson

@ JamesAnderson Also, ein Singleton?
Lasse V. Karlsen

47

Polymorphismus deklariert eine einheitliche Schnittstelle, die nicht typenbewusst ist, und überlässt Implementierungsdetails konkreten Typen, die die Schnittstelle implementieren.


Das ist erstaunlich prägnant und ich denke, es passt perfekt
Alex W

21

Wikipedia: Polymorphismus ist eine Programmiersprachenfunktion, mit der Werte verschiedener Datentypen über eine einheitliche Schnittstelle verarbeitet werden können. Ziemlich einfach für mich.


21

Tatsächlich gibt es mehrere Formen des Polymorphismus und es gibt einige Kontroversen darüber; Möglicherweise sehen Sie sogar CS-Professoren, die es nicht richtig definieren können. Mir sind drei Arten bekannt:

  • Ad-hoc-Polymorphismus (sieht aus wie eine Ente und geht wie eine Ente => ist eine Ente). Kann zum Beispiel in Haskell und Python gesehen werden.

  • generischer Polymorphismus (wobei ein Typ eine Instanz eines generischen Typs ist). Kann zum Beispiel in C ++ gesehen werden (Vektor von int und Vektor von string haben beide eine Elementfunktionsgröße).

  • Subtyp-Polymorphismus (wobei ein Typ von einem anderen Typ erbt). Kann in den meisten OO-Programmiersprachen gesehen werden (dh Dreieck ist eine Form).


2
+1 für die Erwähnung, dass es verschiedene Arten von Polymorphismus gibt. Ihre Definition des Ad-hoc-Polymorphismus scheint sich jedoch stark von der unter en.wikipedia.org/wiki/Type_polymorphism erwähnten zu unterscheiden . Auf dieser Seite wird angegeben, dass es zwei Typen gibt (ad-hoc oder parametrisch), nicht drei, und es wird auch zwischen polymorphen Funktionen und polymorphen Datentypen unterschieden. Ihre drei Typen entsprechen, soweit ich feststellen kann, parametrischen polymorphen Funktionen, parametrischen polymorphen Datentypen bzw. polymorphen Ad-hoc-Funktionen.
Laurence Gonsalves

Hallo, was ist der Unterschied zwischen "Instanz eines generischen Typs" und "erbt von einem anderen Typ"? Diese scheinen dasselbe zu sagen.
Shanimal

@LaurenceGonsalves fwiw, der im ersten Kommentar angegebene Link verweist auf drei Typen. Parametrischer Polymorphismus ist definiert als das "generische" Schreiben einer Funktion oder eines Datentyps.
Shanimal

14

Ich verstehe wirklich, warum Sie diese Frage stellen. Ich verstehe Polymorphismus, aber ich war bei einem Vorstellungsgespräch und wurde gebeten, eine kurze und klare Definition des Polymorphismus zu geben. Da ich keine klare und kurze Definition geben konnte, begann ich darüber nachzudenken und hier ist meine Definition:

Die Fähigkeit von Objekten eines Typs, ein und dieselbe Schnittstelle zu haben, aber unterschiedliche Implementierung dieser Schnittstelle.


10

Definition :

Polymorphismus ist ein 10-Dollar-Wort für eine 1-Dollar-Idee - wenn ich darum bitte, dass etwas getan wird, ist es mir egal, wie es erreicht wird, solange das Endergebnis angemessen ist. Solange der Service korrekt bereitgestellt wird, ist mir die Implementierung egal .

Diskussion

Während es in der Softwareentwicklung häufig verwendet wird, insbesondere in Systemen, die nach objektorientierten Prinzipien entwickelt wurden, ist Polymorphismus grundsätzlich ein Prinzip der realen Welt und sollte in realen Begriffen definiert werden, nicht in technologischen Begriffen.

Beispiele

Wenn ich telefonieren möchte, nehme ich ein Telefon, wähle eine Nummer und spreche mit der Partei am anderen Ende. Es ist mir egal, wer das Telefon hergestellt hat, welche Technologie es verwendet, ob es verkabelt, drahtlos, mobil oder VOIP ist oder ob es unter die Garantie fällt.

Wenn ich ein Dokument drucken möchte, drucke ich es. Die Implementierungssprache, die Druckermarke, der Verbindungsstil, die Wahl des Verbrauchsmaterials oder die Papierqualität sind mir egal.


5
klingt wie ein Beispiel für Encapsulationmich
Singleton

1
Polymorphismus, Verkapselung und Abstraktion sind alle ziemlich eng miteinander verbunden, obwohl sie sich auf unterschiedliche Perspektiven konzentrieren. Gute Abstraktionen erleichtern das Erreichen von Polymorphismus, und eine gute Einkapselung verhindert, dass Details "auslaufen".
Bevan

10

Mehrere Implementierungen derselben Schnittstelle.

Beispiel: Viele Telefonmodelle implementieren die Ziffernblockschnittstelle.


8

Polymorphismus ist eine objektorientierte Strategie, die beim Entwerfen von Objektmodellen verwendet wird, um den Code zu vereinfachen. Im Kern ist Polymorphismus die Fähigkeit, zwei ähnliche, aber unterschiedliche Objekte zu definieren und die beiden Objekte dann so zu behandeln, als wären sie gleich.

Ok das ist schwer ....


7

Ich dachte nur, ich würde meine eigene Interpretation dessen hinzufügen, was Polymorphismus ist: Ganz allgemein ist Polymorphismus der Akt der Bereitstellung einer einzigen Schnittstelle für Entitäten verschiedener Typen .

Das ist ziemlich allgemein gehalten, aber nur so kann ich mir vorstellen, alle drei Arten von Polymorphismen, die ich kenne, zu verpacken: Ad-hoc , parametrisch und Subtyp . Ich werde weiter unten näher darauf eingehen und die Polymorphismustypen alphabetisch nach Namen sortieren. Derjenige , an dem Sie interessiert sind, ist höchstwahrscheinlich der Subtyp-Polymorphismus , der der letzte ist.

Ad-hoc-Polymorphismus

Ad-hoc-Polymorphismus ist der Vorgang, bei dem mehrere Implementierungen derselben Methode für verschiedene Parametertypen bereitgestellt werden. Im OOP wird dies allgemein als Methodenüberladung bezeichnet . Beispielsweise:

public String format(int a) {
    return String.format("%2d", a);
}

public String format(Date a) {
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a);
}

Beide format Methoden teilen sich eine einzige Schnittstelle , arbeiten jedoch mit Entitäten unterschiedlichen Typs .

Parametrischer Polymorphismus

Parametrischer Polymorphismus ist der Vorgang, bei dem eine Klasse (oder Methode) an einem Typ arbeitet, der selbst ein Parameter der Klasse (oder Methode) ist. Es wird oft als Generika bezeichnet .

Zum Beispiel Java List[T] erwartet einen ParameterT zur Instanziierungszeit, und dieser Parameter definiert den Typ des resultierenden Objekts.

Hinweis für Puristen, die ich absichtlich ignoriere rohe Typen , da ich das Gefühl habe, dass sie in diesem Zusammenhang nur das Wasser trüben würden.

List[String]und List[Date]teilen Sie eine einzelne Schnittstelle , aber arbeiten Sie an (und sind) verschiedenen Typen .

Subtyp-Polymorphismus

Subtyp-Polymorphismus ist wahrscheinlich das, was Sie ursprünglich in Ihrer Frage gemeint haben: Es handelt sich um die Bereitstellung einer einzigen Schnittstelle für mehrere Implementierungen desselben Typs.

So verwenden Sie das übliche Beispiel: AnimalStellt einen Vertrag bereit, den alle Implementierungen einhalten müssen. Dogist ein Animalund unterstützt als solches alle Operationen, die Animaldeklarieren. Nach dem Liskov-Substitutionsprinzip können Sie auf diese Weise eine Instanz verwenden, Dogbei der eine Instanz vonAnimal erwartet wird (aber nicht umgekehrt).

Wenn Catund Dogbeide Unterklassen von sind Animal, teilen sie sich eine einzige Schnittstelle , sind jedoch tatsächlich unterschiedliche Typen .

Ich gehe hier ein bisschen tangential vor, aber der Subtyp-Polymorphismus ist (glaube ich) der einzige, der das Überschreiben erlaubt : das Neudefinieren des Verhaltens einer von einer übergeordneten Klasse definierten Methode. Dies wird oft mit Überladung verwechselt, die, wie wir zuvor gesehen haben, eine Art Polymorphismus ist und tatsächlich keine Unterklassen benötigt (und auch keine Klassen benötigt).


Was ist also mit schnittstellenbasiertem Polymorphismus?
Siamak

@siamak ist das nicht nur eine bestimmte Art von Subtyp-Polymorphismus, bei dem der übergeordnete Typ vollständig abstrakt ist? Oder meinst du etwas anderes?
Nicolas Rinaudo

Meine Absicht der Schnittstelle ist die Schnittstelle als Referenztyp, die in objektorientierten Sprachen wie folgt existiert: Schnittstelle I1 {void M ();} Ich glaube, dass es so viele Unterschiede zwischen Subtyp oder vererbungsbasiertem Polymorphismus und schnittstellenbasiertem Polymorphismus gibt . Weil es beim vererbungsbasierten Polymorphismus zwischen Typen eine "Is-a" -Beziehung gibt, aber beim Interface-Baced-Polymorphismus gibt es so etwas nicht. Tatsächlich könnte ein und dasselbe Verhalten mit unterschiedlichen Implementierungen zwischen verschiedenen Typen (Klassen) geteilt werden
Siamak

Ich muss zugeben, dass ich verwirrt bin - abgesehen von Ihrer etwas ballistischen Herangehensweise an das obere Gehäuse scheint Ihre Beschreibung dessen, was Sie als schnittstellenbasierten Polymorphismus bezeichnen, genau dieselbe zu sein wie meine Beschreibung des Subtyp-Polymorphismus. Ich bin sicher, Sie sehen einen Unterschied, aber ich fürchte, es ist mir wirklich nicht klar.
Nicolas Rinaudo

Wie Sie sehen können, gibt es keine Beziehung zwischen Auto und Vogel und Person, aber sie können sich auf ihre eigene Weise bewegen. Es gibt einen enormen Unterschied zwischen der abstrakten Klasse und der Schnittstelle, und die Verwendung der Schnittstelle ist nicht dasselbe wie die Subtypisierung. Meiner Meinung nach sind Vererbungspolymorphismus und schnittstellenbasierter Polymorphismus nicht dasselbe und nicht gleich. // Es ist schwer, Codierung im Kommentarsegment //
Siamak

6

Es scheint, dass hier die besten Definitionen bereitgestellt werden. Lassen Sie mich also bitte meine zwei Cent hinzufügen , nur für andere Beobachter. Ich hoffe es könnte mehr helfen.

Es gibt zwei Arten von Polymorphismus:

1. Compile-time (static) polymorphism or (ad hoc) polymorphism.

Das ist einfach Methodenüberladung und Bedienerüberladung

2.  Run time or (dynamic) polymorphism.

Die erste Amtszeit wird von der Java- und C ++ - Terminologie geerbt.

Aber in der .NET- Terminologie wird nur die zweite ( ich meine Laufzeitpolymorphismus ) wirklich als Polymorphismus angenommen und einfach als Polymorphismus bezeichnet .

Und soweit ich weiß, gibt es drei Methoden zur Implementierung des ( Laufzeit- ) Polymorphismus .

 1. Parametric polymorphism or simply the use of generics (templates in C++).

 2. Inheritance-based polymorphism or subtyping.

 3. Interface-based polymorphism.

Ein einfaches Beispiel für einen schnittstellenbasierten Polymorphismus:

interface Imobile
{
    void Move();
}

class Person :Imobile
{
    public void Move() { Console.WriteLine("I am a person and am moving in my way."); }
}

class Bird :Imobile
{
    public void Move() { Console.WriteLine("I am a bird and am moving in my way."); }
}

class Car :Imobile
{
    public void Move() { Console.WriteLine("I am a car and am moving in my way."); }
}


class Program
{

    static void Main(string[] args)
    {
        // Preparing a list of objects
        List<Imobile> mobileList = new List<Imobile>();

        mobileList.Add(new Person());
        mobileList.Add(new Bird());
        mobileList.Add(new Car());

        foreach (Imobile mobile in mobileList)
        {
            mobile.Move();
        }

        // Keep the console open
        Console.WriteLine("Press any key to exit the program:");
        Console.ReadKey();
    }
}

Ausgabe:

 I am a person and am moving in my way.
 I am a bird and am moving in my way.
 I am a car and am moving in my way.
 Press any key to exit the program:

Ich sehe immer noch keinen Unterschied, den du machst. Person, Vogel und Auto sind alle Subtypen von Imobile. Person ist ein Unbewegliches, Vogel ist ein Unbewegliches und Auto ist ein Unbewegliches. Wenn Sie eine Variable vom Typ Imobile benötigen würden, könnten Sie entweder eine Instanz von Person, Vogel oder Auto verwenden, alle würden eine Typprüfung durchführen. Genau das bedeutet Subtyp-Polymorphismus.
Nicolas Rinaudo

Vogel und Person und Auto sind keine Subtypen von Imobile, sie sind Implementierer dieser Schnittstelle und "realisieren" diese Schnittstelle auf ihre eigene Weise. Der Begriff "Subtyp" wird häufig zwischen einem realen Typ und einem realen Subtyp verwendet, der von ihm geerbt wurde. und in dieser Situation gibt es eine "Is-a" -Beziehung zwischen ihnen, zum Beispiel ist ein Hund ein Subtyp eines Säugetiers.
Siamak

Aus Sicht des Compilers ist es wahr und richtig, auf eine Schnittstelle zu verweisen und die Referenzen zu verwenden. / BUT / IT ist kein gleichwertiges Konzept mit der Subtypisierung in einer Vererbungsbeziehung. Und ich denke, die Implementierer einer Schnittstelle als Subtypen zu bezeichnen, ist so umständlich und wirklich nicht wahr.
Siamak

Ein Beispiel für einen vererbungsbasierten Polymorphismus wäre gut geeignet, um diese Antwort zu erläutern.
Marcelo Mason

5

Polymorphismus ist eine Software-Codierungsabstraktion, bei der mehrere verschiedene zugrunde liegende Entitäten (normalerweise Daten, aber nicht immer) eine gemeinsame Schnittstelle haben, über die sie zur Laufzeit identisch aussehen und handeln können. Wir verwenden dies als Entwicklungstechnik, um konsistentes Verhalten über einen weiten Bereich ähnlicher, aber nicht identischer Instanzen mit einer absolut minimalen Implementierung zu erzwingen und so die Erwartung von Fehlern und Inkonsistenzen zu verringern.

Paul.


5

Polymorphismus == mehrere Klassen + gleiche Methodensignaturen + klassenspezifisches Verhalten.


2

Mehrere Formen eines einzelnen Objekts werden als Polymorphismus bezeichnet.



2

Polymorphismus ist die Fähigkeit eines Objekts, bei demselben Aufruf anders zu erscheinen und sich anders zu verhalten. Beispiel: Jedes Tier erscheint und klingt anders (wenn Sie es treffen :))


2

Polymorphismus ist eine Funktion von Programmiersprachen, mit der ein Objekt als Instanz seines Supertyps behandelt werden kann.


Downvoter - Würden Sie bitte erklären, warum?
TarkaDaal

1

Eine Reihe von analogen Operationen für verschiedene Typen mit einem einzigen Namen versehen. Wenn es gut gemacht ist, ist die Analogie offensichtlich, z. B. das "Hinzufügen" von Zahlen arithmetisch und das "Hinzufügen" von Zeichenfolgen durch Verkettung (die ihre Längen summiert).


1

Dies ist die Definition, der ich immer gefolgt bin:

Zwei Objekte sind zwischen ihnen polymorph (in Bezug auf ein bestimmtes Protokoll), wenn beide auf dieselben Nachrichten mit derselben Semantik antworten.

Beim Polymorphismus geht es um Nachrichten, darum, in der Lage zu sein, denselben Satz von Nachrichten mit derselben Semantik zu beantworten.

Wenn zwei Objekte auf leer reagieren können? Aber die Semantik der Nachricht ist anders. Dann sind sie nicht polymorph.


1

Polymorphismus auf der unteren Ebene ist die Fähigkeit, Methoden, die von den Implementierern einer Schnittstelle definiert werden, von der Schnittstelleninstanz aus aufzurufen.


1

Polymorphismus ist eine Programmierfunktion, mit der ein Objekt viele Typen ('Formen') haben kann. Sie können es als einen dieser Typen behandeln, je nachdem, was Sie tun müssen, ohne die anderen Typen zu kennen oder sich darum zu kümmern.


1

Polymorphismus ist eine Sprachfunktionalität, mit der algorithmischer Code auf hoher Ebene für mehrere Datentypen unverändert verwendet werden kann. Und der andere Satz, was auch immer es war ... ;-P.

(Die von C ++ unterstützten Typen sind in meiner Antwort aufgelistet und gegenübergestellt: Polymorphismus in c ++ )


0

Das Konzept des Polymorphismus wurde in letzter Zeit zu einem Phänomen. Hier ist die tatsächliche Drift. Runtime definiert, welche Submethode von einer Referenz einer Superklasse aufgerufen werden soll. Was bedeutet nun in der Praxis? Es bedeutet eigentlich nichts. Sie können einfach ohne Polymorphismus codieren. Warum also? Denn wenn wir den Polymorphismus nicht haben, mussten wir uns alle Definitionen der Unterklassenfunktionen merken. Polymorphismus erspart uns dies in der Praxis.

Sie können eine Liste wie folgt definieren:

List list = new List();

Wenn Sie jedoch nachsehen IList, können Sie von der Benutzeroberfläche profitieren:

IList list = new List();

und verwenden Sie die IListReferenz frei. Angenommen, es IListist auch in einer anderen Klasse implementiert, können Sie Methoden dieser unbekannten Klasse erneut über verwendenIList Referenz verwenden, ohne sich an diesen Klassennamen zu erinnern. Wunderbar, nicht wahr?

Jetzt kommen weitere wertvolle Informationen:
Java ist standardmäßig polymorph, während .NET und C ++ in MS nicht die Basisfunktion deklarieren müssen virtual(und in .NEToverride Schlüsselwort deklarieren müssen.

Es gibt auch zwei integrale Regeln im Polymorphismus. Eine ist die Vererbung (über die Schnittstelle impl. Oder über die Klassenerweiterung) und die andere überschreibt. Ohne Überschreiben gibt es keinen Polymorphismus. Beachten Sie, dass das Überladen von Methoden (immer in einer einzelnen Klasse) auch eine Art "minimalistischer" Polymorphismus ist.


1
Das sind mehr als 2 Sätze.
Gefährlich

0

Für eine bestimmte Methodensignatur werden unterschiedliche Methodenimplementierungen für unterschiedliche, hierarchisch verwandte Klassen ausgeführt.


0

Polymorphismus ist die Fähigkeit, verschiedene Klassen zu verwenden, die eine gemeinsame Schnittstelle implementieren (oder eine gemeinsame Basisklasse erweitern), ohne jetzt die spezifische Implementierung zu benötigen, und nur die in der gemeinsamen Schnittstelle verfügbaren Methoden zu verwenden.

Dh: In Java, da sowohl ArrayList als auch LinkedList List implementieren, können Sie, wenn Sie eine Variable als List deklarieren, immer die in List zulässigen Operationen ausführen, unabhängig davon, ob Ihre Variable als ArrayList oder LinkedList instanziiert wurde.


0

Entitäten desselben Typs (dh dieselbe Schnittstelle implementiert oder von derselben Klasse abgeleitet) verhalten sich unterschiedlich (unter demselben Methodennamen).


0

Ich denke, die Implementierung von Methoden derselben Signatur in verschiedenen Klassen (mit einer Art Vererbungsbeziehung, die entweder Extended oder Implements verwendet) ist Methodenüberschreibung und auch Polymorphismus, da wir auf diese Weise viele Formen derselben Methodensignatur erzielen.


-2

Ich denke manchmal werden Objekte dynamisch aufgerufen. Sie sind sich nicht sicher, ob das Objekt ein Dreieck, ein Quadrat usw. in einer klassischen Polyform ist. Beispiel.

Um all diese Dinge hinter sich zu lassen, rufen wir einfach die Funktion der abgeleiteten Klasse auf und gehen davon aus, dass die der dynamischen Klasse aufgerufen wird.

Es ist dir egal, ob es sich um ein Quadrat, ein Dreieck oder ein Rechteck handelt. Sie kümmern sich nur um die Gegend. Daher wird die getArea-Methode abhängig vom übergebenen dynamischen Objekt aufgerufen.


-2

Polymorphismus ist die Fähigkeit einer Funktion, sich automatisch anzupassen, um Eingabedaten verschiedener Datentypen zu akzeptieren. Sie können zwei Double '1.1' und '2.2' hinzufügen und '3.3' oder 'Add' zwei Strings "Stack" und "Overflow" und "StackOverflow" erhalten.


Warum hat jemand dies notiert - dies ist die "wörtliche Antwort" von der National Instrument-Webseite zum Thema Polymorphismus !!!
J-Dizzle

-3

Polymorphismus ist, wenn verschiedene Objekte auf unterschiedliche Weise auf dieselbe Methode reagieren. Zum Beispiel bewegt sich ein Auto auf der Straße, während eine Person auf der Straße geht. Dies sind zwei Objekte, die auf dieselbe Straße unterschiedlich reagieren.


Tatsächlich sieht der Polymorphismus Instanzen verschiedener Klassen als einen gemeinsamen Typ und konnte die in diesem gemeinsamen Typ deklarierten Methoden unabhängig davon verwenden, wie die verschiedenen Klassen diese Methoden implementieren.
GaRRaPeTa
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.