27

Ich habe einige Fragen über das Konzept der statischen Polymorphismus Ich höre etwas über; Sie können sie hauptsächlich im Kontext von C++ interpretieren, aber ich würde auch sprachunabhängige Antworten (, daher sowohl C++ als auch sprachunabhängig) zu schätzen wissen.Statische Polymorphie Definition und Implementierung

  1. Wie wir statischen Polymorphismus im Allgemeinen definieren? Als Beispiel glaube ich, dass die std::sort-Funktion von C++ als statisch polymorph betrachtet werden sollte, da sie von einer Schnittstelle abhängt, die von einigen Objekten wie Iteratoren und genaues Verhalten unter der Schnittstelle der bereitgestellten Iteratoren bestimmt werden kann in der Kompilierzeit. Ist diese Erklärung, wie wir statischen Polymorphismus definieren, oder ist es nur eine Beschreibung eines bestimmten Falles und es gibt noch mehr?

  2. Was sind die gemeinsamen Codemuster der Verwendung von statischen Polymorphismus in C++? Außerdem: Wird SP nur über Vorlagen in C++ erreicht?

  3. Ist es wahr, dass ein UML-Klasse gegeben Diagramm nicht direkt beschreibt, wie Polymorphismus behandelt wird und somit kann es zumindest teilweise umgesetzt entweder statisch oder dynamisch sein? Mit anderen Worten: Ist die Wahl zwischen statischem und dynamischem Polymorphismus unabhängig vom OOP-Modell und somit bis zum Implementierer zu entscheiden?

  4. Ist der statische Polymorphismus nur C++ - spezifisch und damit verwandt, wie Vorlagen funktionieren? Wenn nicht, ist es in anderen Mainstream-Sprachen neben C++ vorhanden? Können wir ein Äquivalent statischen Polymorphismus in Java haben, C# .. irgendetwas, und bringt es irgendwelche Vorteile?

  5. Die wichtigsten ... Was sind die tatsächlichen Vorteile der Verwendung von statischen Polymorphie? Ich denke, wir können zustimmen, dass es Code-Flexibilität reduziert; Was sind die Vorteile, außer - im Fall von C++ - Speichern einer Zeigerdereferenz (virtuelle Funktion/Zeiger-zur-Funktion/Delegiertenkosten)? Was ist die Klasse von Problemen wo statische Polymorphie ist besonders nützlich, die richtige Wahl für die Implementierung?

+0

Wir können zustimmen, dass es Code-Flexibilität reduziert ?? –

+1

Ich denke, er meinte "Komplexität" oder möglicherweise "Redundanz". –

+0

Nein, ich meinte Flexibilität; unter der Annahme, dass alle Designs mit statischem Polymorphismus mit dynamischem Polymorphismus implementiert werden können, aber nicht umgekehrt - die Verwendung von statischem Polymorphismus für einen bestimmten Fall impliziert, dass in Zukunft ein Bedarf besteht, es dynamisch neu zu schreiben, wenn sich die Anforderungen ändern. Nur mein Denken – Kos

Antwort

13
  1. Das statische polymorphe Verhalten ist type polymorphism, das zur Kompilierungszeit statt zur Laufzeit auftritt.
  2. Ja.
  3. UML ist, wie Klassen zur Laufzeit interagieren - ich glaube nicht, dass es ein UML-Format für die Beschreibung von Vorlagen gibt, aber ich könnte falsch liegen.
  4. Soweit ich weiß, ist es C++ spezifisch, aber ich bin nicht positiv, da ich nicht jede Sprache verwendet habe, die jemals erfunden wurde. :) JIT-Sprachen wie C# und Java sind jedoch häufig sehr gut darin, die Auswirkungen indirekter Aufrufe auf die Leistung zu eliminieren. Dabei werden Informationen verwendet, die zur Laufzeit und nicht zur Kompilierzeit gesammelt werden. Ob dies zur Kompilierzeit ist oder nicht, ist irgendwie in der Luft, aber immerhin heißt es Just-In-Time Compiler.
  5. Der Hauptvorteil ist einfach die Leistung. Runtime Polymorphismus kann alles statische Polymorphismus tun können, tun (in der Tat kann es tun), aber es trägt die Kosten der indirekten Gespräche (was teuer sein kann, wenn es genug von ‚em)

Nun Vorlagen selbst haben viele Anwendungen, die über Kompilierzeit-Polymorphie hinausgehen - zum Beispiel die SFINAE-Magie, die boost::bind Arbeit macht, sind sicherlich nicht polymorph - es ist nur dort, um Inkonsistenzen in der Sprache selbst zu glätten.

+3

"2. Ja." Was ist mit Funktionsüberladung? –

+1

@Charles: Ich habe noch nie jemanden gehört, der "statischen Polymorphismus" überladen nannte (obwohl ich denke, dass es passt). –

+0

Es hängt natürlich davon ab, wie Sie antworten (1). –

5

Wie wir statischen Polymorphismus im Allgemeinen definieren?

Der beste Weg, um es anhand von Beispielen zu verstehen. Policy Based Design ist ein Beispiel für statische Polymorphie. Und meiner Meinung nach ist es eine sehr leistungsfähige Technik, um statische Polymorphie zu erreichen. Ein anderes Beispiel ist Curiously recurring template pattern (CRTP), das ebenfalls eine leistungsfähige Technik ist.