[{"@context":"http:\/\/schema.org\/","@type":"BlogPosting","@id":"https:\/\/wiki.edu.vn\/wiki11\/2020\/12\/25\/untertypisierung-wikipedia\/#BlogPosting","mainEntityOfPage":"https:\/\/wiki.edu.vn\/wiki11\/2020\/12\/25\/untertypisierung-wikipedia\/","headline":"Untertypisierung – Wikipedia","name":"Untertypisierung – Wikipedia","description":"before-content-x4 Form des Typpolymorphismus after-content-x4 In der Programmiersprachtheorie Untertypisierung (ebenfalls Subtyp Polymorphismus oder Einschlusspolymorphismus) ist eine Form des Typpolymorphismus, bei","datePublished":"2020-12-25","dateModified":"2020-12-25","author":{"@type":"Person","@id":"https:\/\/wiki.edu.vn\/wiki11\/author\/lordneo\/#Person","name":"lordneo","url":"https:\/\/wiki.edu.vn\/wiki11\/author\/lordneo\/","image":{"@type":"ImageObject","@id":"https:\/\/secure.gravatar.com\/avatar\/44a4cee54c4c053e967fe3e7d054edd4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/44a4cee54c4c053e967fe3e7d054edd4?s=96&d=mm&r=g","height":96,"width":96}},"publisher":{"@type":"Organization","name":"Enzyklop\u00e4die","logo":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":600,"height":60}},"image":{"@type":"ImageObject","@id":"https:\/\/upload.wikimedia.org\/wikipedia\/en\/thumb\/d\/d1\/Inheritance.svg\/350px-Inheritance.svg.png","url":"https:\/\/upload.wikimedia.org\/wikipedia\/en\/thumb\/d\/d1\/Inheritance.svg\/350px-Inheritance.svg.png","height":"217","width":"350"},"url":"https:\/\/wiki.edu.vn\/wiki11\/2020\/12\/25\/untertypisierung-wikipedia\/","wordCount":6843,"articleBody":" (adsbygoogle = window.adsbygoogle || []).push({});before-content-x4Form des Typpolymorphismus (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4In der Programmiersprachtheorie Untertypisierung (ebenfalls Subtyp Polymorphismus oder Einschlusspolymorphismus) ist eine Form des Typpolymorphismus, bei der a Subtyp ist ein Datentyp, der mit einem anderen Datentyp verkn\u00fcpft ist (der Supertyp) durch einen Begriff der Substituierbarkeit, was bedeutet, dass Programmelemente, typischerweise Unterprogramme oder Funktionen, die geschrieben wurden, um Elemente des Supertyps zu bearbeiten, auch Elemente des Untertyps bearbeiten k\u00f6nnen. Wenn S ein Subtyp von T ist, wird die Subtypisierungsbeziehung oft S (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4Beispiele[edit] Beispiel f\u00fcr Subtypen: wobei Vogel der Supertyp ist und alle anderen Subtypen sind, wie durch den Pfeil in der UML-Notation angegebenEin einfaches praktisches Beispiel f\u00fcr Untertypen ist in der Abbildung rechts dargestellt. Der Typ “Vogel” hat drei Untertypen “Ente”, “Kuckuck” und “Strau\u00df”. Konzeptionell ist jedes davon eine Vielzahl des Grundtyps “Vogel”, der viele “Vogel” -Eigenschaften erbt, jedoch einige spezifische Unterschiede aufweist. In diesem Diagramm wird die UML-Notation verwendet, wobei Pfeile mit offenem Kopf die Richtung und den Typ der Beziehung zwischen dem Supertyp und seinen Subtypen anzeigen.Als praktischeres Beispiel k\u00f6nnte eine Sprache die Verwendung ganzzahliger Werte \u00fcberall dort erm\u00f6glichen, wo Gleitkommawerte erwartet werden (Integer P.T.((v)}}{ displaystyle T = {v in D mid P_ {T} (v) }}S.={v\u2208D.\u2223 P.T.((v) und P.s((v)}}{ displaystyle S = {v in D mid P_ {T} (v) { text {und}} P_ {s} (v) }}Das Pr\u00e4dikat T. = P.T.{ displaystyle P_ {T}} wird neben angewendet P.s{ displaystyle P_ {s}} als Teil des zusammengesetzten Pr\u00e4dikats S. definieren S.. Die beiden Pr\u00e4dikate sind verbundenDaher m\u00fcssen beide zutreffen, damit ein Wert ausgew\u00e4hlt werden kann. Das Pr\u00e4dikat S. = T. \u2227P.s{ displaystyle land P_ {s}} = P.T.\u2227P.s{ displaystyle P_ {T} land P_ {s}} fasst das Pr\u00e4dikat zusammen T., damit S. \u00d6fS.ubfeinmichly((ceint,felichneineS.ubfeinmichlyN.einme)}}{ displaystyle Felinae = {cat in Felidae mid ofSubfamily (cat, felinaeSubfamilyName) }}F.elichs={ceint\u2208F.elichneine\u2223 \u00d6fGenus((ceint,felichsGenusN.einme)}}{ displaystyle Felis = {cat in Felinae mid ofGenus (cat, felisGenusName) }}Die Konjunktion von Pr\u00e4dikaten wurde hier durch Anwendung des zweiten Pr\u00e4dikats auf den Wertebereich ausgedr\u00fcckt, der dem ersten Pr\u00e4dikat entspricht. Als Typen angesehen, Felis T.{ displaystyle s in T}. Im obigen Beispiel k\u00f6nnen wir die Funktion erwarten ofSubfamily auf Werte aller drei Typen anwendbar sein Felidae, Felinae und Felis.Subtypisierungsschemata[edit]Typentheoretiker unterscheiden zwischen nominelle Untertypisierung, in denen nur auf bestimmte Weise deklarierte Typen Untertypen voneinander sein d\u00fcrfen, und strukturelle Subtypisierung, bei dem die Struktur zweier Typen bestimmt, ob einer ein Subtyp des anderen ist oder nicht. Die oben beschriebene klassenbasierte objektorientierte Untertypisierung ist nominal; Eine strukturelle Subtypisierungsregel f\u00fcr eine objektorientierte Sprache k\u00f6nnte sagen, dass wenn Objekte vom Typ sind EIN kann alle Nachrichten verarbeiten, die Objekte vom Typ sind B. kann damit umgehen (dh wenn sie alle die gleichen Methoden definieren), dann EIN ist ein Subtyp von B. unabh\u00e4ngig davon, ob einer vom anderen erbt. Dies wird so genannt Ente tippen ist in dynamisch typisierten objektorientierten Sprachen \u00fcblich. Gute strukturelle Subtypisierungsregeln f\u00fcr andere Typen als Objekttypen sind ebenfalls bekannt.[citation needed]Implementierungen von Programmiersprachen mit Untertypisierung fallen in zwei allgemeine Klassen: inklusive Implementierungen, bei denen die Darstellung eines beliebigen Wertes vom Typ EIN repr\u00e4sentiert auch den gleichen Wert bei Typ B. wenn EIN::T.2S.1\u2192S.2\u2264::T.1\u2192T.2{ displaystyle T_ {1} leq: S_ {1} quad S_ {2} leq: T_ {2} \u00fcber S_ {1} rightarrow S_ {2} leq: T_ {1} rightarrow T_ { 2}}Der Argumenttyp von S.1 \u2192 S.2 wird als kontravariant bezeichnet, da die Subtypisierungsbeziehung daf\u00fcr umgekehrt ist, w\u00e4hrend der R\u00fcckgabetyp kovariant ist. Informell erfolgt diese Umkehrung, weil der verfeinerte Typ in den von ihm akzeptierten Typen “liberaler” und in dem zur\u00fcckgegebenen Typ “konservativer” ist. Genau das funktioniert in Scala: a n-ary Funktion ist intern eine Klasse, die die erbt FunktionN (-A1, -A2,\u2026, -An, + B) Merkmal (das als allgemeine Schnittstelle in Java-\u00e4hnlichen Sprachen angesehen werden kann), wobei A1, A2,\u2026 Ein sind die Parametertypen und B. ist der R\u00fcckgabetyp; “”– –“Bevor der Typ bedeutet, dass der Typ kontravariant ist, w\u00e4hrend”+“bedeutet kovariant.In Sprachen, die Nebenwirkungen zulassen, wie in den meisten objektorientierten Sprachen, reicht die Subtypisierung im Allgemeinen nicht aus, um sicherzustellen, dass eine Funktion sicher im Kontext einer anderen verwendet werden kann. Liskovs Arbeit in diesem Bereich konzentrierte sich auf die Subtypisierung des Verhaltens, die neben der in diesem Artikel diskutierten Sicherheit des Typsystems auch erfordert, dass die Subtypen alle Invarianten beibehalten, die durch die Supertypen in einigen Vertr\u00e4gen garantiert werden.[4] Diese Definition der Untertypisierung ist im Allgemeinen unentscheidbar und kann daher nicht von einer Typpr\u00fcfung \u00fcberpr\u00fcft werden.Die Untertypisierung ver\u00e4nderlicher Referenzen \u00e4hnelt der Behandlung von Funktionsargumenten und R\u00fcckgabewerten. Nur-Schreib-Referenzen (oder sinkt) sind kontravariante, wie Funktionsargumente; schreibgesch\u00fctzte Referenzen (oder Quellen) sind kovariant wie R\u00fcckgabewerte. Ver\u00e4nderbare Referenzen, die sowohl als Quellen als auch als Senken fungieren, sind unver\u00e4nderlich.Beziehung zur Vererbung[edit]Subtypisierung und Vererbung sind unabh\u00e4ngige (orthogonale) Beziehungen. Sie m\u00f6gen zusammenfallen, aber keiner ist ein Sonderfall des anderen. Mit anderen Worten, zwischen zwei Typen S. und T.sind alle Kombinationen von Subtypisierung und Vererbung m\u00f6glich:S. ist weder ein Subtyp noch ein abgeleiteter Typ von T.S. ist ein Subtyp, aber kein abgeleiteter Typ von T.S. ist kein Subtyp, sondern ein abgeleiteter Typ von T.S. ist sowohl ein Subtyp als auch ein abgeleiteter Typ von T.Der erste Fall wird durch unabh\u00e4ngige Typen veranschaulicht, wie z Boolean und Float.Der zweite Fall kann durch die Beziehung zwischen veranschaulicht werden Int32 und Int64. In den meisten objektorientierten Programmiersprachen Int64 sind durch Vererbung nicht verwandt Int32. jedoch Int32 kann als Subtyp von betrachtet werden Int64 da jeder 32-Bit-Ganzzahlwert in einen 64-Bit-Ganzzahlwert heraufgestuft werden kann.Der dritte Fall ist eine Folge der Funktionsuntertypisierung der Eingangskontravarianz. Nehmen Sie eine Superklasse an T. eine Methode haben m R\u00fcckgabe eines Objekts des gleichen Typs (dh die Art von m ist T \u2192 T.Beachten Sie auch, dass das erste Argument von m ist dies \/ self) und ein abgeleiteter Klassentyp S. von T.. Durch Vererbung die Art von m im S. ist S \u2192 S.. Damit S. ein Subtyp von sein T. die Art von m im S. muss ein Subtyp des Typs von sein m im T., mit anderen Worten: S \u2192 S \u2264: T \u2192 T.. Durch Bottom-up-Anwendung der Funktionsuntertypisierungsregel bedeutet dies: S \u2264: T. und T \u2264: S., was nur m\u00f6glich ist, wenn S. und T. sind gleich. Da Vererbung eine irreflexive Beziehung ist, S. kann kein Subtyp von sein T..Subtypisierung und Vererbung sind kompatibel, wenn alle geerbten Felder und Methoden des abgeleiteten Typs Typen haben, die Subtypen der entsprechenden Felder und Methoden des geerbten Typs sind.Zw\u00e4nge[edit]In Zwangs-Subtypisierungssystemen werden Subtypen durch implizite Typkonvertierungsfunktionen von Subtyp zu Supertyp definiert. F\u00fcr jede Subtypisierungsbeziehung (S. (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4"},{"@context":"http:\/\/schema.org\/","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/wiki.edu.vn\/wiki11\/#breadcrumbitem","name":"Enzyklop\u00e4die"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/wiki.edu.vn\/wiki11\/2020\/12\/25\/untertypisierung-wikipedia\/#breadcrumbitem","name":"Untertypisierung – Wikipedia"}}]}]