Delegation (objektorientierte Programmierung)

Im Objekt orientierte Programmierung, Delegation bezieht sich auf die Bewertung eines Mitglieds (Eigentum oder Methode) von einem Objekt (der Empfänger) im Kontext eines anderen ursprünglichen Objekts (der Absender). Die Delegation kann explizit durchgeführt werden, indem das Sendungsobjekt an das empfangende Objekt weitergegeben wird, das in jedem in jedem durchgeführt werden kann objektorientierte Sprache; Oder implizit nach den Mitgliedern der Suchregeln der Sprache, die die Sprachunterstützung für die Funktion erfordert. Implizite Delegation ist die grundlegende Methode für die Wiederverwendung von Verhaltensweisen in Prototypbasierte Programmierung, korrespondierend zu Nachlass in Klassenbasierte Programmierung. Die bekanntesten Sprachen, die die Delegation auf Sprachebene unterstützen, sind Selbst, was den Begriff der Delegation durch seinen Begriff von beinhaltet veränderlich Elternteil Schlüssel die bei der Methode -Suche auf Selbstaufrufe verwendet werden, und JavaScript; sehen JavaScript -Delegation.

Der Begriff Delegation wird auch lose für verschiedene andere Beziehungen zwischen Objekten verwendet; sehen Delegation (Programmierung) für mehr. Häufig verwirrte Konzepte verwenden einfach ein anderes Objekt, genauer gesagt als als Beratungsgespräch oder Anhäufung; und Bewertung eines Mitglieds auf einem Objekt durch Bewertung des entsprechenden Mitglieds an einem anderen Objekt, insbesondere im Kontext des empfangenden Objekts, das genauer bezeichnet wird Weiterleitung (Wenn sich ein Wrapper -Objekt nicht an das verpackte Objekt übergibt).[1][2][a] Das Delegationsmuster ist ein Software -Designmuster Zur Implementierung der Delegation, obwohl dieser Begriff auch lose zur Beratung oder Weiterleitung verwendet wird.

Überblick

Dieses Gefühl von Delegation Als Programmiersprache wurde definiert Lieberman In seinem 1986er Artikel "prototypische Objekte zur Implementierung eines gemeinsam genutzten Verhaltens in objektorientierten Systemen".

Die Delegation hängt davon ab Dynamische Bindung, wie es erfordert, dass ein bestimmter Methodenaufruf zur Laufzeit verschiedene Codesegmente aufrufen kann. Es wird durchgehend verwendet Mac OS (und sein Vorgänger Nächster Schritt) als Mittel zum Anpassen des Verhaltens von Programmkomponenten.[3] Es ermöglicht Implementierungen wie die Verwendung einer einzelnen OS-bereitgestellten Klasse zum Verwalten von Windows, da die Klasse einen programmspezifischen Delegierten einnimmt und das Standardverhalten bei Bedarf überschreiben kann. Wenn der Benutzer beispielsweise auf das Feld Schließen klickt, sendet der Fenstermanager dem Delegierten ein Fenster, das: Anruf anrufen soll, und der Delegierte kann das Schließen des Fensters verzögern, wenn nicht gespeicherte Daten durch den Inhalt des Fensters dargestellt werden.

Delegation kann charakterisiert (und unterschieden von Weiterleitung) wie späte Bindung des Selbst:[4]

... Nachrichten, die an die gesendet wurden self (oder this) Variable im übergeordneten "kommt" zu dem Objekt zurück, das ursprünglich die Nachricht erhalten hat.

Das heißt, das self In einer Methodendefinition im Empfangsobjekt ist nicht statisch an dieses Objekt zur Definitionszeit gebunden (z. B. Kompilierungszeit oder wenn die Funktion an ein Objekt angehängt ist), sondern vielmehr an Auswertung Zeit ist es an die gebunden Original Objekt.

Es wurde argumentiert, dass die Delegation in einigen Fällen bevorzugt werden kann Nachlass Um den Programmcode lesbarer und verständlicher zu gestalten.[5] Obwohl explizite Delegation ziemlich weit verbreitet ist, implementieren relativ wenige große Programmiersprachen die Delegation als alternatives Modell zur Vererbung. Die genaue Beziehung zwischen Delegation und Vererbung ist kompliziert; Einige Autoren betrachten sie als gleichwertig oder einen Sonderfall von anderen.[6]

Sprachunterstützung für die Delegation

In Sprachen, die die Delegation über Methoden -Lookup -Regeln unterstützen, wird die Verbreitung von Methoden so definiert, wie sie für virtuelle Methoden in der Vererbung definiert ist: Es ist immer die spezifischste Methode, die während der Methodensuche ausgewählt wird. Daher ist es das Original Empfängerentität, das der Beginn der Methodensuche ist, obwohl sie die Kontrolle an ein anderes Objekt weitergegeben hat (über eine Delegationsverbindung, nicht eine Objektreferenz).

Die Delegation hat den Vorteil, dass sie zur Laufzeit stattfinden kann und nur eine Teilmenge von Einheiten irgendeiner Art beeinflusst und sogar zur Laufzeit entfernt werden kann. Die Vererbung richtet sich dagegen typischerweise eher auf den Typ als auf die Instanzen und ist auf die Kompilierung der Zeit beschränkt. Andererseits kann die Vererbung statisch typeprüft werden, während die Delegation im Allgemeinen ohne Generika nicht kann (obwohl eine eingeschränkte Version der Delegation staty typeSafe sein kann[7]). Die Delegation kann als "Laufzeitvererbung für bestimmte Objekte" bezeichnet werden.

Hier ist ein Pseudocode Beispiel in a C#/Java Wie Sprache:

Klasse A {  Leere Foo() {  // "Dies" auch unter den Namen "aktuell", "ich" und "Selbst" in anderen Sprachen bekannt  Dies.Bar();  }  Leere Bar() {  drucken("eine Bar");  } }; Klasse B {  Privatgelände delegieren A a; // Delegationslink  Öffentlichkeit B(A a) {  Dies.a = a;  }  Leere Foo() {  a.Foo(); // rufen Sie Foo () auf der A-Instanz an  }  Leere Bar() {  drucken("B.Bar");  } }; a = Neu A(); b = Neu B(a); // Delegation zwischen zwei Objekten festlegen 

Berufung b.foo() wird darin enden, dass B.Bar gedruckt werden, seitdem this bezieht sich auf Original Empfängerobjekt, bim Kontext von a. Die daraus resultierende Mehrdeutigkeit von this wird bezeichnet als Objektschizophrenie.

Übersetzen des Impliziten this in einen expliziten Parameter, den Anruf (in B, mit a ein Delegierter) a.foo() wird übersetzt in A.foo(b)mit der Art von a Für die Methodenauflösung, aber das delegierende Objekt b für die this Streit.

Mithilfe der Vererbung beträgt der analoge Code (unter Verwendung von Großbuchstaben, um zu betonen, dass die Lösung auf Klassen basiert, nicht auf Objekten):

Klasse A {  Leere Foo() {  Dies.Bar();  }  Leere Bar() {  drucken("Eine Bar");  } }; Klasse B erweitert A {  Öffentlichkeit B() {}  Leere Foo() {  super.Foo(); // rufen Sie Foo () der Superklasse an (a)  }  Leere Bar() {  drucken("B.Bar");  } }; b = Neu B(); 

Berufung b.foo() wird darin enden, dass B.Bar. In diesem Fall, this ist eindeutig: Es gibt ein einzelnes Objekt, b, und this.bar() Löst die Methode auf der Unterklasse auf.

Programmiersprachen unterstützen diese ungewöhnliche Form der Delegation im Allgemeinen nicht als Sprachkonzept, aber es gibt einige Ausnahmen.

Doppeler Vererbung

Wenn die Sprache sowohl Delegation als auch Vererbung unterstützt, kann man dies tun Doppeler Vererbung Indem Sie beide Mechanismen gleichzeitig wie in verwenden

Klasse C erweitert A {  DelegationLink D d; } 

Dies erfordert zusätzliche Regeln für die Suche nach Methoden, da es jetzt potenziell zwei Methoden gibt, die als die spezifischsten bezeichnet werden können (aufgrund der beiden Suchpfade).

Verwandte Bereiche

Die Delegation kann als Mechanismus mit niedrigem Niveau zum Austausch von Code und Daten zwischen Entitäten beschrieben werden. So baut es die Grundlage für andere Sprachkonstrukte auf. Vor allem rollenorientierte Programmierung Sprachen haben Delegation verwendet, insbesondere die älteren sachlich verwendet Anhäufung während der Behauptung, Delegation zu verwenden. Dies sollte nicht als Betrug angesehen werden, sondern nur die Pluraldefinitionen dessen, was die Delegation bedeutet (wie oben beschrieben).

In jüngerer Zeit wurde auch die Arbeit zum Vertrieb der Delegation durchgeführt, also z. Kunden einer Suchmaschine (billige Hotelzimmer finden) können eine gemeinsame Einheit verwenden, um die besten Hits und die allgemeinen wiederverwendbaren Funktionalität zu teilen.

Die Delegation wurde auch zur Resolution von Ratschlägen in vorgeschlagen Aspekt-orientiertes Programmieren von Ernst und Lorenz im Jahr 2003.

Siehe auch

Unterscheiden:

Anmerkungen

  1. ^ Beck 1997 verwendet die Begriffe "einfache Delegation", wenn das empfangende Objekt keinen Zugriff auf das Sendungsobjekt hat und "Selbstdelegation" für den Zugriff auf das Sendeobjekt hat. In der modernen Sprache "Weiterleiten" und "Delegation", wie in diesem Artikel verwendet.

Verweise

  1. ^ Gamma et al. 1995, "Delegation", S. 20–21.
  2. ^ Beck 1997, "Delegation", S. 64–69.
  3. ^ Apple (2009-08-20). "Kakao -Grundlagenhandbuch: Delegierte und Datenquellen". Apple Developer -Verbindung. Abgerufen 2009-09-11.
  4. ^ "Überschneidende Klassen und Prototypen". Perspektiven der Systeminformatik: 5. Internationaler Andreierhov Memorial Conference, PSI 2003, Akademgorodok, Novosibirsk, Russland, 9.-12. Juli 2003, überarbeitete Papiere. p.38.
  5. ^ [1]Trygve Reenskaug, Abteilung für Informatik, Universität von Oslo, "Der Fall für lesbare Code" (2007)
  6. ^ Stein, Lynn Andrea. Die Delegation ist Vererbung. OOPSLA '87 Konferenzbereitschaft zu objektorientierten Programmiersystemen, Sprachen und Anwendungen. S. 138–146. doi:10.1145/38807.38820.
  7. ^ Günter Kniesel (1999-11-19). "Typ-Safe-Delegation für die Anpassung der Laufzeitkomponenten". Ecoop '99-Objektorientierte Programmierung. Vorlesungsnotizen in Informatik. Vol. 1628. Springer. S. 351–366. Citeseerx 10.1.1.33.7584. doi:10.1007/3-540-48743-3_16. ISBN 978-3-540-66156-6. Archiviert von das Original Am 1999-11-19. Abgerufen 2015-03-04. Dieses Papier schlägt eine objektbasierte Vererbung (auch als Delegation bezeichnet) als Ergänzung zur rein weiterleiterbasierten Objektzusammensetzung vor. Es präsentiert eine TypeSafe-Integration der Delegation in ein klassenbasiertes Objektmodell und zeigt, wie es die Probleme überwindet, mit denen die Interaktion mit der Weiterleitung basierender Komponenten konfrontiert ist, wie es die unabhängige Erweiterbarkeit von Komponenten und eine unerwartete Anpassung der dynamischen Komponenten unterstützt.

Externe Links