Frage

Angenommen, wir haben:

interface Foo 
{
 bool Func(int x);
}

class Bar: Foo
{
  bool Func(int x)
  {
   return (x>0);
  }  
}

class Baz: Foo
{
  bool Func(int x)
  {
   return (x<0);
  }  
}

Jetzt können wir um Bar und Baz als Foos werfen und ihre Func Methoden aufrufen.

Die Delegierten vereinfachen dies ein wenig:

delegate bool Foo(int x);

bool Bar(int x)
{
 return (x<0);
}

bool Baz(int x)
{
 return (x>0);
}

Jetzt können wir um Bar und Baz als Foo Delegierten werfen.

Was ist der wirkliche Nutzen der Delegierten, mit Ausnahme kürzeren Code zu bekommen?

War es hilfreich?

Lösung

Es gibt einen kleinen Unterschied, delegiert die Membervariablen der Klassen, in denen zugreifen können, sie definiert sind. In C # (im Gegensatz zu Java) alle inneren Klasse betrachtet statisch sein. Deshalb, wenn Sie eine Schnittstelle verwenden einen Rückruf zu verwalten, z eine Action für eine Schaltfläche. Die Umsetzung der innere Klasse muss bestanden werden (über den Konstruktor) Verweise auf die Teile der enthaltenden Klasse, die es brauchen kann während des Rückrufs zu interagieren. Die Delegierten haben nicht diese Einschränkung daher die Menge an Code reduziert erforderlich, um den Rückruf zu implementieren.

Shorter, prägnanter Code ist auch ein würdiger Vorteil.

Andere Tipps

Von einer Software Engineering Perspektive Sie haben Recht, Delegierte sind ähnlich wie Funktionsschnittstellen, dass sie eine Funktion Interface Prototypen.

Sie können auch viel in der gleichen Art und Weise verwendet werden: Statt eine ganze Klasse, dass enthält die Methode der Weitergabe Sie müssen Sie in nur einem Delegierten passieren kann. Das spart eine ganze Menge Code und erzeugt viel lesbaren Code.

Darüber hinaus wird mit dem Aufkommen der Lambda-Ausdrücke können sie nun auch leicht auf Fly definiert werden, die ein großer Bonus ist. Während es möglich ist, Klassen on the fly in C # zu bauen, es ist wirklich ein großer Schmerz im Hintern.

Vergleich der beiden ist ein interessantes Konzept. Ich hatte vorher nicht darüber nachgedacht, wie viel gleich die Ideen von einem Anwendungsfall und Code-Strukturierung Standpunkt sind.

Ein Delegierter hat mit einer Interface-Referenz viel gemeinsam teilen, die von dem Anrufer Sicht eine einzige Methode hat.

Im ersten Beispiel, Baz und Bar sind Klassen, die vererbt werden können und instanziiert. Im zweiten Beispiel, Baz und Bar sind Methoden.

Sie können keine Schnittstelle Verweise auf nur jeder Klasse gelten, die die Schnittstelle Vertrag übereinstimmt. Die Klasse muss ausdrücklich erklären, dass er die Schnittstelle unterstützt. Sie können einen Delegaten Bezug auf jedes Verfahren anwenden, das die Signatur übereinstimmt.

Sie können nicht enthalten statische Methoden in dem Dienstvertrag Schnittstelle. (Obwohl Sie statische Methoden auf mit Erweiterungsmethoden verschrauben kann). Sie können mit einem Delegierten Bezug auf statische Methoden beziehen.

Nein, die Delegierten sind für Methodenzeiger. Dann können Sie sicherstellen, dass die Signatur der Methode zugeordnet w / die Delegierten korrekt ist.

Auch dann müssen Sie nicht die Struktur der Klasse kennen. Auf diese Weise können Sie eine Methode verwenden, die Sie geschrieben haben, in eine Methode in einer anderen Klasse zu übergeben, und definieren die Funktionalität, die Sie haben wollen passieren.

Werfen Sie einen Blick auf die List <> Klasse mit der Methode Suchen . Jetzt erhalten Sie zu definieren, was bestimmt, ob etwas eine Übereinstimmung vorhanden ist oder nicht, ohne Gegenstände zu erfordern in der Klasse enthaltenen IListFindable oder etwas ähnliches zu implementieren.

Sie Delegierten als Parameter in Funktionen übergeben können (Ok technisch Delegierten Objekte werden, wenn sie kompiliert, aber das ist nicht der Punkt hier). Sie könnten ein Objekt als Parameter (offensichtlich), übergeben, aber dann binden Sie diese Art von Objekt an die Funktion als Parameter. Mit Delegierten können Sie eine beliebige Funktion übergeben im Code auszuführen, der die gleiche Signatur hat, unabhängig davon, wo es herkommt.

Man kann denken von Delegierten als Schnittstelle für ein Verfahren, das, was Argumente und Rückgabetyp ein Verfahren definiert, muss der Delegat passen müssen

Ja, ein Delegierter kann mit einem Verfahren als Schnittstelle betrachtet werden.

Ein Delegierter ist eine typisierte Methode Zeiger. Dies gibt Ihnen mehr Flexibilität als Schnittstellen, weil Sie die Vorteile der Kovarianz und Kontra nehmen kann, und Sie können Objektstatus ändern (Sie würden die diesen Zeiger passieren müssen, um mit Schnittstelle basiert functors).

Außerdem haben die Delegierten viele nette syntaktischer Zucker, die Sie Dinge sie tun können wie miteinander zu verknüpfen, leicht.

Schnittstellen und Delegierten sind zwei völlig verschiedene Dinge, obwohl ich die Versuchung zu beschreiben Delegierten in Interface-ähnlichen Begriffen zum besseren Verständnis verstehen ... aber nicht wissen, die Wahrheit zu Verwirrung auf der ganzen Linie führen kann.

Die Delegierten wurden (teilweise) inspiriert wegen der schwarzen Kunst der C ++ Methodenzeiger unzureichend für bestimmte Zwecke zu sein. Ein klassisches Beispiel ist die Implementierung einer Message-Passing oder Ereignisbehandlungsmechanismus. Die Delegierten können Sie eine Methodensignatur ohne Kenntnis einer Klasse Typen oder Schnittstellen definieren. - Ich könnte eine ‚Leere Eventhandler (Ereignis * e)‘ delegieren definieren und für jede Klasse aufrufen, die es implementiert

Für einen Einblick in dieses klassische Problem, und warum Delegierten sind wünschenswert dieses lesen und dann diese .

mindestens einen Vorschlag für das Hinzufügen von Verschlüssen (d.h. anonyme Teilnehmer) zu Java, sind sie gleichwertig Schnittstellen mit einer einzelnen Element-Methode.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top