Ententypisierung

Ententypisierung In der Computerprogrammierung ist eine Anwendung der Ententest- "Wenn es wie eine Ente geht und es wie eine Ente quetscht, dann muss es eine Ente sein" -, um festzustellen, ob eine Objekt kann für einen bestimmten Zweck verwendet werden. Mit Nominative Typisierungein Objekt ist eines bestimmten Typs Wenn es deklariert ist (oder wenn die Assoziation eines Typs mit dem Objekt durch Mechanismen wie z. Objektvererbung). Bei der Ententypisierung ist ein Objekt eines bestimmten Typs Wenn es alles hat Methoden und Eigenschaften, die von diesem Typ erforderlich sind.[1][2] Die Enten-Typisierung kann als nutzungsbasierte strukturelle Äquivalenz zwischen einem bestimmten Objekt und den Anforderungen eines Typs angesehen werden. Sehen strukturelle Typisierung für eine weitere Erklärung der Strukturäquivalenz.

Beispiel

Dies ist ein einfaches Beispiel in Python 3 Das zeigt, wie ein Objekt in einem beliebigen Kontext verwendet werden kann, bis es so verwendet wird, dass es nicht unterstützt.

Klasse Ente:  def schwimmen(selbst):  drucken("Entenschwimmen")  def fliegen(selbst):  drucken("Entenfliegen") Klasse Wal:  def schwimmen(selbst):  drucken("Walschwimmen") zum Tier in [Ente(),, Wal()]:  Tier.schwimmen()  Tier.fliegen() 

Ausgabe:

Ente Schwimmende Entenfliege Whale Swimming AttributeError: 'Wal' Objekt hat kein Attribut 'Fly'

Wenn wir also annehmen, dass alles schwimmen kann, ist eine Ente, weil Enten schwimmen können, werden wir einen Wal als Ente betrachten eine Ente.

In statisch getippten Sprachen

In einigen statisch typisiert Sprachen wie Boo[3] und D,[4][5] Die Überprüfung des Klassentyps kann nicht zur Laufzeit angegeben werden, anstatt zu kompilieren.

Vergleich mit anderen Typsystemen

Struktursysteme

Ententypisierung ähnelt, aber anders als, strukturelle Typisierung. Strukturelle Typisierung ist a statische Typisierung System, das Typkompatibilität und Äquivalenz durch die Struktur eines Typs bestimmt, während die Enten -Typisierung ist dynamisch und bestimmt die Typkompatibilität nur durch den Teil der Struktur eines Typs, auf den er zugegriffen wird Laufzeit.

Das Typoskript,[6] und Ulme,[7] Sprachen unterstützen die strukturelle Typisierung in unterschiedlichem Maße.

Protokolle und Schnittstellen

Protokolle und Schnittstellen Bieten Sie eine Möglichkeit, ausdrücklich zu erklären, dass einige Methoden, Operatoren oder Verhaltensweisen definiert werden müssen (z. B. müssen a haben Quacksalber() Methode). Wenn eine Bibliothek von Drittanbietern eine Klasse implementiert, die nicht geändert werden kann, kann ein Client keine Instanz davon mit einer dieser Bibliothek unbekannten Schnittstelle verwenden, auch wenn die Klasse tatsächlich die Schnittstellenanforderungen erfüllt. Eine häufige Lösung für dieses Problem ist die Adaptermuster. Im Gegensatz dazu würde das Objekt bei der Ententypisierung direkt akzeptiert, ohne dass ein Adapter erforderlich ist.

Vorlagen oder generische Typen

Schablone, oder generisch Funktionen oder Methoden anwenden den Ententest in a statische Typisierung Kontext; Dies bringt alle Vor- und Nachteile von statische versus dynamische Typprüfung Im Algemeinen. Die Ententypisierung kann auch flexibler sein, da nur die Methoden tatsächlich zur Laufzeit genannt müssen implementiert werden, während Vorlagen Implementierungen aller Methoden erfordern, die kann nicht bewiesen werden unerreichbar zur Kompilierungszeit.

In Sprachen wie Java, Scala und Objective-C, Betrachtung Kann verwendet werden, um zu überprüfen, ob Objekte Methoden implementieren oder sogar die erforderlichen Methoden zur Laufzeit hinzufügen.

Zum Beispiel, Java's Methodhandle -API kann auf diese Weise verwendet werden.[8]

Siehe auch

Verweise

  1. ^ "Glossar - Python 3.7.1 Dokumentation". docs.python.org. Abgerufen 2018-11-08.
  2. ^ "Python Duck Typing - Beispiel". Technikstunden. 2020-06-28. Abgerufen 2020-07-26.
  3. ^ Boo: EntentypisierungArchiviert 6. Oktober 2008 bei der Wayback -Maschine
  4. ^ "Dynamische Klassen und Ententypern".
  5. ^ "Metaprogramm - Enten -Typing in D".
  6. ^ "SE Radio Episode 384: Boris Cherny auf TypeScript". se-radio.net. Abgerufen 2019-10-25.
  7. ^ Czaplicki, Evan. "Kernsprache · Eine Einführung in Elm". Abgerufen 30. Januar 2017.
  8. ^ "Stackoverflow: Implementieren Sie die Enten -Typing mit Java MethodsHandles". Abgerufen 13. Juni 2020.