Der Unterschied besteht darin, was etwas ist und wie sich etwas verhält.
Viele Sprachen versuchen, die beiden miteinander zu verbinden, aber es sind ganz unterschiedliche Dinge.
Wenn wie ist was und was ist wie ...
Wenn alles davon erbt, ergeben sich object
einige Vorteile wie: Jede Objektvariable kann jeden Wert enthalten. Aber das ist auch der Knackpunkt , alles muss sich verhalten ( die wie ) wie ein object
und sieht aus wie ( das , was ) ein object
.
Aber:
- Was ist, wenn Ihr Objekt keine aussagekräftige Definition von Gleichheit hat?
- Was ist, wenn es keinen aussagekräftigen Hash hat?
- Was ist, wenn Ihr Objekt nicht geklont werden kann, Objekte jedoch?
Entweder wird der object
Typ im Wesentlichen unbrauchbar - da das Objekt keine Gemeinsamkeit für alle möglichen Instanzen bietet. Oder es wird Objekte geben, die eine gebrochene / object
schuhhörnige / absurde Definition einer vermuteten universellen Eigenschaft haben, die bis auf eine Reihe von Fallstricken ein fast universelles Verhalten beweist.
Wenn Was nicht mit Wie verbunden ist
Alternativ können Sie das Was und das Wie getrennt halten. Dann können sich mehrere verschiedene Typen (mit überhaupt keinem gemeinsamen Was ) auf die gleiche Weise verhalten, wie es der Mitarbeiter beim Wie gesehen hat . In diesem Sinne ist die Idee eines Iterator
nicht ein spezifisches Was , sondern ein Wie . Insbesondere wie interagieren Sie mit einer Sache, wenn Sie noch nicht wissen, mit was Sie interagieren ?
Java (und ähnliche) ermöglichen Ansätze dazu mithilfe von Schnittstellen. Eine Schnittstelle in dieser Hinsicht beschreibt die Kommunikationsmittel und implizit ein Protokoll der Kommunikation und des Handelns, das befolgt wird. Jedes Was, das sich als von einem bestimmten Wie deklariert , besagt, dass es die relevante Kommunikation und Aktion unterstützt, die im Protokoll beschrieben sind. Dadurch kann jeder Mitarbeiter auf dem verlassen Wie und ab steckenzubleiben nicht exakt angeben , welche Was ‚s verwendet werden kann.
C ++ (und ähnliche) ermöglichen Ansätze hierfür durch Ententypisierung. Einer Vorlage ist es egal, ob der kollaborierende Typ deklariert, dass er einem Verhalten folgt, nur dass innerhalb eines bestimmten Kompilierungskontexts das Objekt auf eine bestimmte Weise interagiert werden kann. Auf diese Weise können C ++ - Zeiger und Objekte, die bestimmte Operatoren überschreiben, von demselben Code verwendet werden. Weil sie die Checkliste erfüllen, um als gleichwertig zu gelten.
- unterstützt * a, a->, ++ a und einen ++ -> Eingabe- / Weiterleitungsiterator
- unterstützt * a, a->, ++ a, a ++, --a und a-- -> bidirektionalen Iterator
Der zugrunde liegende Typ muss nicht einmal einen Container iterieren, es kann auch was sein . Darüber hinaus können einige Mitarbeiter noch allgemeiner arbeiten. Stellen Sie sich vor, eine Funktion wird nur benötigt a++
. Ein Iterator kann dies erfüllen, ebenso ein Zeiger, eine Ganzzahl und jedes implementierte Objekt operator++
.
Unter- und Überspezifikation
Das Problem bei beiden Ansätzen liegt unter und über der Spezifikation.
Für die Verwendung einer Schnittstelle muss das Objekt deklarieren, dass es ein bestimmtes Verhalten unterstützt. Dies bedeutet auch, dass der Ersteller dies von Anfang an ausführen muss. Dies führt dazu, dass einige What 's den Schnitt nicht machen, da sie ihn nicht deklariert haben. Es bedeutet auch, dass immer Was einen gemeinsamen Vorfahren hat, die Schnittstelle, die das Wie darstellt . Dies kehrt zum ursprünglichen Problem von zurück object
. Dies führt dazu, dass Mitarbeiter ihre Anforderungen zu stark spezifizieren, während gleichzeitig einige Objekte entweder aufgrund fehlender Deklaration unbrauchbar werden oder ausgeblendete Fallstricke auftreten, da ein erwartetes Verhalten schlecht definiert ist.
Die Verwendung einer Vorlage erfordert, dass der Mitarbeiter mit einem völlig unbekannten Was arbeitet und durch seine Interaktionen ein Wie definiert . In gewissem Maße erschwert dies das Schreiben von Mitarbeitern, da es das Was für seine Kommunikationsprimitive (Funktionen / Felder / usw.) analysieren und gleichzeitig Kompilierungsfehler vermeiden muss, oder zumindest darauf hinweisen muss, wie ein bestimmtes Was nicht seinen Anforderungen für das Wie entspricht . Dies ermöglicht es dem Mitarbeiter, das absolute Minimum von einem bestimmten Was zu fordern , wodurch der breiteste Bereich dessen verwendet werden kann , was verwendet werden soll. Leider hat dies den Nachteil, dass unsinnige Verwendungen von Objekten zugelassen werden, die technisch die Kommunikationsprimitive für eine bestimmte Person liefernWie , aber befolgen Sie nicht das implizite Protokoll, das das Auftreten aller möglichen schlechten Dinge zulässt.
Iteratoren
In diesem Fall ist ein Iterator
ist ein Wie es eine Abkürzung für eine Beschreibung der Wechselwirkung ist. Alles, was dieser Beschreibung entspricht, ist per Definition ein Iterator
. Wenn wir wissen, wie wir allgemeine Algorithmen schreiben können, haben wir eine kurze Liste mit ' Wie wird ein bestimmtes Was gegeben ? ', Das bereitgestellt werden muss, damit der Algorithmus funktioniert. Diese Liste enthält die Funktion / Eigenschaften / usw. Ihre Implementierung berücksichtigt die spezifischen Aspekte , mit denen sich der Algorithmus befasst.