it-swarm.dev

Warum sind Schnittstellen nützlich?

Ich lerne und programmiere seit einiger Zeit in C #. Trotzdem kann ich die Nützlichkeit von Schnittstellen nicht einschätzen. Sie bringen zu wenig auf den Tisch. Abgesehen von der Bereitstellung der Funktionssignaturen tun sie nichts. Wenn ich mich an die Namen und Signaturen der Funktionen erinnern kann, die implementiert werden müssen, sind sie nicht erforderlich. Sie dienen nur dazu, sicherzustellen, dass die genannten Funktionen (in der Schnittstelle) in der ererbenden Klasse implementiert sind.

C # ist eine großartige Sprache, aber manchmal hat man das Gefühl, dass Microsoft zuerst das Problem erstellt (keine Mehrfachvererbung zulässt) und dann die Lösung bereitstellt, die ziemlich langwierig ist.

Das ist mein Verständnis, das auf begrenzten Codierungserfahrungen basiert. Wie sehen Sie Schnittstellen? Wie oft nutzen Sie sie und warum?

162
Pankaj Upadhyay

Sie dienen nur dazu, sicherzustellen, dass die genannten Funktionen (in der Schnittstelle) in der ererbenden Klasse implementiert sind.

Richtig. Das ist ein ausreichend beeindruckender Vorteil, um die Funktion zu rechtfertigen. Wie andere gesagt haben, ist eine Schnittstelle eine vertragliche Verpflichtung , bestimmte Methoden, Eigenschaften und Ereignisse zu implementieren. Der überzeugende Vorteil einer statisch typisierten Sprache besteht darin, dass der Compiler überprüfen kann, ob ein Vertrag, auf den sich Ihr Code stützt, tatsächlich erfüllt wird.

Schnittstellen sind jedoch eine ziemlich schwache Möglichkeit, vertragliche Verpflichtungen darzustellen. Wenn Sie eine stärkere und flexiblere Darstellung vertraglicher Verpflichtungen wünschen, lesen Sie die Funktion "Codeverträge", die mit der letzten Version von Visual Studio geliefert wurde.

C # ist eine großartige Sprache, aber manchmal hat man das Gefühl, dass zuerst Microsoft das Problem erstellt (keine Mehrfachvererbung zulässt) und dann die Lösung bereitstellt, die ziemlich langwierig ist.

Nun, ich bin froh, dass es dir gefällt.

Alle komplexen Software-Designs sind das Ergebnis des Abwägens widersprüchlicher Funktionen und des Versuchs, den "Sweet Spot" zu finden, der große Vorteile bei geringen Kosten bietet. Wir haben durch schmerzhafte Erfahrung gelernt, dass Sprachen, die Mehrfachvererbung zum Zwecke der gemeinsamen Nutzung der Implementierung zulassen, relativ geringe Vorteile und relativ hohe Kosten haben. Das Zulassen der Mehrfachvererbung nur für Schnittstellen, die keine Implementierungsdetails gemeinsam nutzen, bietet viele Vorteile der Mehrfachvererbung ohne die meisten Kosten.

154
Eric Lippert

enter image description here

In diesem Beispiel weiß der PowerSocket also nichts anderes über die anderen Objekte. Die Objekte hängen alle von der vom PowerSocket bereitgestellten Leistung ab, sodass sie IPowerPlug implementieren und auf diese Weise eine Verbindung herstellen können.

Schnittstellen sind nützlich, da sie Verträge bereitstellen, mit denen Objekte zusammenarbeiten können, ohne dass Sie etwas anderes voneinander wissen müssen.

238
ocodo

Abgesehen von der Bereitstellung der Funktionssignaturen tun sie nichts. Wenn ich mich an die Namen und Signaturen der Funktionen erinnern kann, die implementiert werden müssen, sind sie nicht erforderlich

Der Zweck von Schnittstellen besteht nicht darin, Ihnen zu helfen, sich daran zu erinnern, welche Methode implementiert werden soll. Sie dient dazu, einen Vertrag zu definieren . In foreach P.Brian.Mackey Beispiel (was stellt sich als falsch heraus , aber es ist uns egal) definiert IEnumerable einen Vertrag zwischen foreach und jede Aufzählungssache. Es heißt: "Wer auch immer Sie sind, solange Sie sich an den Vertrag halten (IEnumerable implementieren), verspreche ich Ihnen, dass ich alle Ihre Elemente durchlaufen werde." Und das ist großartig (für eine nicht dynamische Sprache).

Dank Schnittstellen können Sie eine sehr geringe Kopplung zwischen zwei Klassen erreichen.

145
David

Schnittstellen sind der beste Weg, um gut entkoppelte Konstrukte zu erhalten.

Wenn Sie Tests schreiben, werden Sie feststellen, dass konkrete Klassen in Ihrer Testumgebung nicht funktionieren.

Beispiel: Sie möchten eine Klasse testen, die von einer Data Access Service - Klasse abhängt. Wenn diese Klasse mit einem Webdienst oder einer Datenbank kommuniziert, wird Ihr Komponententest in Ihrer Testumgebung nicht ausgeführt (und es wurde ein Integrationstest).

Lösung? Verwenden Sie eine Schnittstelle für Ihren Datenzugriffsdienst und Mock diese Schnittstelle, damit Sie Ihre Klasse testen können als Einheit.

Auf der anderen Seite spielen WPF & Silverlight beim Binden überhaupt nicht mit Interfaces. Dies ist eine ziemlich böse Falte.

37

Schnittstellen sind das Rückgrat des (statischen) Polymorphismus! Auf die Schnittstelle kommt es an. Die Vererbung würde ohne Schnittstellen nicht funktionieren, da Unterklassen grundsätzlich die bereits implementierte Schnittstelle des übergeordneten Elements erben.

Wie oft benutzt du sie und warum machst du das?

Sehr oft. Alles, was steckbar sein muss, ist eine Schnittstelle in meinen Anwendungen. Oft haben Sie ansonsten nicht verwandte Klassen, die dasselbe Verhalten bereitstellen müssen. Sie können solche Probleme nicht mit Vererbung lösen.

Benötigen Sie unterschiedliche Algorithmen, um Operationen mit denselben Daten auszuführen? Verwenden Sie eine Schnittstelle ( siehe Strategiemuster )!

Möchten Sie verschiedene Listenimplementierungen verwenden? Code gegen eine Schnittstelle und der Anrufer muss sich nicht um die Implementierung kümmern!

Es wird aus einem einzigen Grund als eine gute Praxis (nicht nur in OOP) angesehen, seit Ewigkeiten gegen Schnittstellen zu codieren: Es ist einfach, eine Implementierung zu ändern, wenn Sie feststellen, dass sie nicht Ihren Anforderungen entspricht. Es ist ziemlich umständlich, wenn Sie versuchen, dies nur mit Mehrfachvererbung zu erreichen, oder wenn Sie leere Klassen erstellen, um die erforderliche Schnittstelle bereitzustellen.

30
Falcon

Sie haben wahrscheinlich foreach verwendet und festgestellt, dass es sich um ein ziemlich nützliches Iterationswerkzeug handelt. Wussten Sie, dass eine Schnittstelle erforderlich ist, um zu funktionieren, IEnumerable ?

Dies ist sicherlich ein konkreter Fall, der auf die Nützlichkeit einer Schnittstelle hinweist.

12
P.Brian.Mackey

Schnittstellen dienen zur Codierung von Objekten wie ein Stecker zur Haushaltsverkabelung. Würden Sie Ihr Radio direkt an Ihre Hausverkabelung anlöten? Wie wäre es mit Ihrem Staubsauger? Natürlich nicht. Der Stecker und die Steckdose, in die er passt, bilden die "Schnittstelle" zwischen Ihrer Hausverkabelung und dem Gerät, das die Stromversorgung benötigt. Ihre Hausverkabelung muss nichts über das Gerät wissen, außer dass sie einen dreipoligen geerdeten Stecker verwendet und elektrische Energie bei 120 VAC <= 15 A benötigt. Umgekehrt erfordert das Gerät keine arkanen Kenntnisse darüber, wie Ihr Haus verkabelt ist, außer dass es eine oder mehrere dreipolige Steckdosen hat, die günstig angeordnet sind und 120 VAC <= 15 A liefern.

Schnittstellen erfüllen im Code eine sehr ähnliche Funktion. Ein Objekt kann deklarieren, dass eine bestimmte Variable, ein bestimmter Parameter oder ein bestimmter Rückgabetyp von einem Schnittstellentyp ist. Die Schnittstelle kann nicht direkt mit einem Schlüsselwort new instanziiert werden, aber meinem Objekt kann die Implementierung dieser Schnittstelle gegeben oder gefunden werden, mit der es arbeiten muss. Sobald das Objekt seine Abhängigkeit hat, muss es nicht genau wissen, was diese Abhängigkeit ist, es muss nur wissen, dass es die Methoden X, Y und Z für die Abhängigkeit aufrufen kann. Implementierungen der Schnittstelle müssen nicht wissen, wie sie verwendet werden, sie müssen nur wissen, dass von ihnen erwartet wird, dass sie die Methoden X, Y und Z mit bestimmten Signaturen versehen.

Indem Sie mehrere Objekte hinter derselben Schnittstelle abstrahieren, bieten Sie jedem Benutzer von Objekten dieser Schnittstelle einen gemeinsamen Satz von Funktionen. Sie müssen nicht wissen, dass es sich bei dem Objekt beispielsweise um eine Liste, ein Wörterbuch, eine LinkedList, eine OrderedList oder was auch immer handelt. Da Sie wissen, dass all dies IEnumerables sind, können Sie die Methoden von IEnumerable verwenden, um jedes Element in diesen Sammlungen einzeln durchzugehen. Sie müssen nicht wissen, dass eine Ausgabeklasse ein ConsoleWriter, ein FileWriter, ein NetworkStreamWriter oder sogar ein MulticastWriter ist, der andere Arten von Writern verwendet. Alles, was Sie wissen müssen, ist, dass sie alle IWriter (oder was auch immer) sind, und daher haben sie eine "Write" -Methode, an die Sie eine Zeichenfolge übergeben können, und diese Zeichenfolge wird ausgegeben.

11
KeithS

Während es für den Programmierer eindeutig eine Wohltat ist (zumindest zunächst), eine Mehrfachvererbung zu haben, ist dies eine fast triviale Auslassung, und Sie sollten sich (in den meisten Fällen) nicht auf eine Mehrfachvererbung verlassen. Die Gründe dafür sind komplex, aber wenn Sie wirklich darüber erfahren möchten, sollten Sie die Erfahrungen der beiden bekanntesten (von TIOBE-Index ) Programmiersprachen berücksichtigen, die dies unterstützen it: C++ und Python (3. und 8. respektabel).

In Python wird die Mehrfachvererbung unterstützt, wird jedoch von Programmierern fast überall missverstanden. Wenn Sie angeben, dass Sie wissen, wie es funktioniert, müssen Sie dieses Dokument zum Thema lesen und verstehen: Method Resolution Order . Etwas anderes, das in Python passiert ist, ist, dass Schnittstellen irgendwie in die Sprache gelangen - Zope.Interfaces.

Für C++ googeln Sie "Diamanthierarchie C++" und sehen Sie die Hässlichkeit, die Sie gleich abdecken wird. C++ - Profis wissen, wie man Mehrfachvererbung verwendet. Alle anderen spielen normalerweise nur herum, ohne zu wissen, wie die Ergebnisse aussehen werden. Eine andere Sache, die zeigt, wie nützlich Schnittstellen sind, ist die Tatsache, dass eine Klasse in vielen Fällen das Verhalten ihrer Eltern vollständig überschreiben muss. In solchen Fällen ist die übergeordnete Implementierung nicht erforderlich und belastet die untergeordnete Klasse nur mit dem Speicher für die privaten Variablen des übergeordneten Elements, was im C # -Alter möglicherweise keine Rolle spielt, aber bei der eingebetteten Programmierung von Bedeutung ist. Wenn Sie eine Schnittstelle verwenden, ist dieses Problem nicht vorhanden.

Zusammenfassend ist festzuhalten, dass Schnittstellen meiner Meinung nach ein wesentlicher Bestandteil von OOP sind, da sie einen Vertrag durchsetzen. Mehrfachvererbung ist in begrenzten Fällen nützlich und normalerweise nur für Leute, die wissen, wie man sie verwendet. Wenn Sie also ein Anfänger sind, sind Sie derjenige, der durch das Fehlen einer Mehrfachvererbung behandelt wird - dies gibt Ihnen eine bessere Chance, keinen Fehler zu machen.

Historisch gesehen wurzelt die Idee für eine Schnittstelle weit früher als die C # -Designspezifikationen von Microsoft. Die meisten Leute betrachten C # als ein Upgrade über Java (in den meisten Sinnen)) und raten, woher C # seine Schnittstellen hat - Java. Das Protokoll ist ein älteres Wort für dasselbe Konzept, und es ist so älter als .NET.

Update: Jetzt habe ich möglicherweise eine andere Frage beantwortet - warum Schnittstellen statt Mehrfachvererbung, aber dies schien die Antwort zu sein, nach der Sie gesucht haben. Außerdem sollte eine OO Sprache mindestens eine der beiden haben, und die anderen Antworten haben Ihre ursprüngliche Frage abgedeckt.

7
George Penn.

Es fällt mir schwer, mir sauberen, objektorientierten C # -Code ohne die Verwendung von Schnittstellen vorzustellen. Sie verwenden sie immer dann, wenn Sie die Verfügbarkeit bestimmter Funktionen erzwingen möchten, ohne dass Klassen gezwungen werden, von einer bestimmten Basisklasse zu erben. Auf diese Weise kann Ihr Code die entsprechende (niedrige) Kopplungsstufe aufweisen.

Ich bin nicht der Meinung, dass Mehrfachvererbung besser ist als Schnittstellen, noch bevor wir argumentieren, dass Mehrfachvererbung mit eigenen Schmerzen verbunden ist. Schnittstellen sind ein grundlegendes Werkzeug, um Polymorphismus und die Wiederverwendung von Code zu ermöglichen. Was braucht man mehr?

6
Daniel B

Ich kann sagen, dass ich mich darauf beziehe. Als ich anfing, etwas über OO und C # zu lernen, habe ich auch keine Schnittstellen bekommen. Das ist in Ordnung. Wir müssen nur auf etwas stoßen, das Sie die Annehmlichkeiten von Schnittstellen schätzen lässt.

Lassen Sie mich zwei Ansätze ausprobieren. Und verzeihen Sie mir die Verallgemeinerungen.

Versuch 1

Angenommen, Sie sprechen Englisch als Muttersprache. Sie reisen in ein anderes Land, in dem Englisch nicht die Muttersprache ist. Sie benötigen Hilfe. Sie brauchen jemanden, der Ihnen helfen kann.

Fragen Sie: "Hey, wurden Sie in den Vereinigten Staaten geboren?" Das ist Vererbung.

Oder fragst du: "Hey, sprichst du Englisch"? Dies ist die Schnittstelle.

Wenn Sie sich für das interessieren, was es tut, können Sie sich auf Schnittstellen verlassen. Wenn Sie sich für das interessieren, was ist, verlassen Sie sich auf die Vererbung.

Es ist in Ordnung, sich auf die Vererbung zu verlassen. Wenn Sie jemanden brauchen, der Englisch spricht, Tee mag und Fußball mag, sollten Sie besser nach einem Briten fragen. :) :)

Versuch 2

Ok, versuchen wir es mit einem anderen Beispiel.

Sie verwenden verschiedene Datenbanken und müssen abstrakte Klassen implementieren, um mit ihnen arbeiten zu können. Sie übergeben Ihre Klasse an eine Klasse des DB-Anbieters.

public abstract class SuperDatabaseHelper
{
   void Connect (string User, string Password)
}

public abstract class HiperDatabaseHelper
{
   void Connect (string Password, string User)
}

Mehrfachvererbung, sagst du? Versuchen Sie das mit dem obigen Fall. Das kannst du nicht. Der Compiler weiß nicht, welche Connect-Methode Sie aufrufen möchten.

interface ISuperDatabaseHelper
{
  void Connect (string User, string Password)
}

interface IHiperDatabaseHelper
{
   void Connect (string Password, string User)
}

Jetzt können wir - zumindest in C # - mit etwas arbeiten, mit dem wir Schnittstellen explizit implementieren können.

public class MyDatabaseHelper : ISuperDatabaseHelper, IHiperDatabaseHelper
{
   IHiperDataBaseHelper.Connect(string Password, string User)
   {
      //
   }

   ISuperDataBaseHelper.Connect(string User, string Password)
   {
      //
   }

}

Fazit

Die Beispiele sind nicht die besten, aber ich denke, es kommt auf den Punkt.

Sie "bekommen" Schnittstellen nur, wenn Sie das Bedürfnis danach haben. Bis sie denken, dass sie nichts für dich sind.

5
Luiz Angelo

Ich persönlich liebe die abstrakte Klasse und benutze sie mehr als eine Schnittstelle. Der Hauptunterschied besteht in der Integration in .NET-Schnittstellen wie IDisposable, IEnumerable usw. und in COM-Interop. Außerdem ist der Schreibaufwand für die Schnittstelle etwas geringer als für eine abstrakte Klasse, und eine Klasse kann mehr als eine Schnittstelle implementieren, während sie nur von einer Klasse erben kann.

Das heißt, ich finde, dass die meisten Dinge, für die ich eine Schnittstelle verwenden würde, besser von einer abstrakten Klasse bedient werden. Mit reinen virtuellen Funktionen - abstrakten Funktionen - können Sie einen Implementierer zwingen, eine Funktion zu definieren, ähnlich wie eine Schnittstelle einen Implementierer zwingt, alle seine Mitglieder zu definieren.

Normalerweise verwenden Sie jedoch eine Schnittstelle, wenn Sie der Superklasse kein bestimmtes Design auferlegen möchten, während Sie eine abstrakte Klasse verwenden würden, um ein wiederverwendbares Design zu erhalten, das bereits größtenteils implementiert ist.

Ich habe häufig Schnittstellen zum Schreiben von Plugin-Umgebungen unter Verwendung des System.ComponentModel-Namespace verwendet. Sie sind sehr praktisch.

5
Jonathan Henson

Es gibt zwei Hauptgründe:

  1. Fehlende Mehrfachvererbung. Sie können von einer Basisklasse erben und eine beliebige Anzahl von Schnittstellen implementieren. Dies ist die einzige Möglichkeit, Mehrfachvererbung in .NET durchzuführen.
  2. COM-Interoperabilität. Für alles, was von "älteren" Technologien verwendet werden muss, müssen Schnittstellen definiert sein.
4
Tangurena

Schnittstellen an sich sind nicht sehr nützlich. Bei der Implementierung durch konkrete Klassen sehen Sie jedoch, dass Sie die Flexibilität haben, eine oder mehrere Implementierungen durchzuführen. Der Bonus ist, dass das Objekt, das die Schnittstelle verwendet, nicht wissen muss, wie die Details der tatsächlichen Implementierung ablaufen - das nennt man Kapselung.

3
Ronald

Durch die Verwendung von Schnittstellen bleibt ein System entkoppelt und lässt sich leichter umgestalten, ändern und neu bereitstellen. Es ist ein sehr zentrales Konzept der objektorientierten Orthodoxie, und ich habe es zum ersten Mal erfahren, als C++ - Gurus "reine abstrakte Klassen" erstellten, die Schnittstellen durchaus gleichwertig sind.

3
Jesse C. Slicer

Als junger Programmierer/Entwickler sehen Sie beim Erlernen von C # möglicherweise nicht die Nützlichkeit der Benutzeroberfläche, da Sie Ihre Codes möglicherweise mithilfe Ihrer Klassen schreiben und der Code einwandfrei funktioniert. Im realen Szenario müssen Sie jedoch eine skalierbare, robuste und wartbare Anwendung erstellen Einige Architekturen und Muster, die nur mithilfe der Schnittstelle möglich sind, sind beispielsweise Abhängigkeitsinjektionen.

2
Adewole Ayobami

Sie werden hauptsächlich zur Wiederverwendbarkeit von Code verwendet. Wenn Sie in die Schnittstelle codieren, können Sie eine andere Klasse verwenden, die von dieser Schnittstelle erbt und nicht alles kaputt macht.

Sie sind auch sehr nützlich in Webservices, in denen Sie dem Client mitteilen möchten, was eine Klasse tut (damit sie sie verwenden können), ihnen aber nicht den tatsächlichen Code geben möchten.

2
Tom Squires

Eine Implementierung in der realen Welt:

Sie können ein Objekt als Schnittstellentyp umwandeln:

IHelper h = (IHelper)o;
h.HelperMethod();

Sie können eine Liste einer Schnittstelle erstellen

List<IHelper> HelperList = new List<IHelper>();

Mit diesen Objekten können Sie auf alle Schnittstellenmethoden oder -eigenschaften zugreifen. Auf diese Weise können Sie eine Schnittstelle für Ihren Teil eines Programms definieren. Und bauen Sie die Logik darauf auf. Dann kann jemand anderes Ihre Schnittstelle in seinen Geschäftsobjekten implementieren. Wenn sich die BO ändern, können sie die Logik für die Schnittstellenkomponenten ändern und erfordern keine Änderung der Logik für Ihr Stück.

1
SoylentGray

Folgendes ist Pseudocode:

class MyClass{

    private MyInterface = new MyInterfaceImplementationB();

    // Code using Thingy 

}

interface MyInterface{

    myMethod();

}

class MyInterfaceImplementationA{ myMethod(){ // method implementation A } }

class MyInterfaceImplementationB{ myMethod(){ // method implementation B } }

class MyInterfaceImplementationC{ myMethod(){ // method implementation C } }

Die letzten Klassen können völlig unterschiedliche Implementierungen sein.

Sofern keine Mehrfachvererbung möglich ist, erfordert die Vererbung die Implementierung der übergeordneten Klasse, wodurch die Dinge starrer werden. Das Programmieren gegen Schnittstellen hingegen kann dazu führen, dass Ihr Code oder ein Framework äußerst flexibel ist. Wenn Sie jemals auf einen Fall stoßen, in dem Sie sich gewünscht haben, Sie könnten Klassen in einer Vererbungskette austauschen, werden Sie verstehen, warum.

Beispielsweise könnte ein Framework, das einen Reader bereitstellt, der ursprünglich zum Lesen von Daten von der Festplatte vorgesehen war, erneut implementiert werden, um etwas Ähnliches, jedoch auf völlig andere Weise zu tun. Wie zum Beispiel Morsecode interpretieren.

0
James P.

Schnittstellen sorgen für Plug-in-Modularität, indem sie Klassen einen Mechanismus bieten, mit dem sie bestimmte Arten von Nachrichten verstehen (und abonnieren) können, die Ihr System übermittelt. Ich werde näher darauf eingehen.

In Ihrer Anwendung entscheiden Sie, dass beim Laden oder erneuten Laden eines Formulars alle darin enthaltenen Elemente gelöscht werden sollen. Sie definieren eine IClear -Schnittstelle, die Clear implementiert. Darüber hinaus entscheiden Sie, dass das Formular versuchen soll, seinen Status beizubehalten, wenn der Benutzer auf die Schaltfläche Speichern klickt. Somit erhält alles, was sich an ISave hält, eine Nachricht, um seinen Zustand beizubehalten. In der Praxis verarbeiten die meisten Schnittstellen natürlich mehrere Nachrichten.

Was Schnittstellen auszeichnet, ist, dass gemeinsames Verhalten ohne Vererbung erreicht werden kann. Die Klasse, die eine bestimmte Schnittstelle implementiert, versteht einfach, wie sie sich verhält, wenn ein Befehl ausgegeben wird (eine Befehlsnachricht) oder wie sie reagiert, wenn sie abgefragt wird (eine Abfragenachricht). Im Wesentlichen verstehen die Klassen in Ihrer Anwendung die Nachrichten, die Ihre Anwendung bereitstellt. Dies erleichtert den Aufbau eines modularen Systems, in das Dinge eingesteckt werden können.

In den meisten Sprachen gibt es Mechanismen (wie LINQ ) zum Abfragen von Dingen, die sich an eine Schnittstelle halten. Dies hilft Ihnen normalerweise dabei, bedingte Logik zu eliminieren, da Sie nicht unterschiedlichen Dingen (die nicht unbedingt aus derselben Vererbungskette abgeleitet sind) mitteilen müssen, wie sie sich ähnlich verhalten sollen (gemäß einer bestimmten Nachricht). Stattdessen sammeln Sie alles, was eine bestimmte Nachricht versteht (hält sich an eine Schnittstelle) und veröffentlichen die Nachricht.

Zum Beispiel könnten Sie ersetzen ...

Me.PublishDate.Clear()
Me.Subject.Clear()
Me.Body.Clear()

...mit:

For Each ctl As IClear In Me.Controls.OfType(Of IClear)()
    ctl.Clear()
Next

Was sich effektiv sehr anhört:

Höre, höre! Würde jeder, der Clearing versteht, bitte Clear jetzt!

Auf diese Weise können wir programmgesteuert vermeiden, dass jedes einzelne Element aufgefordert wird, sich selbst zu löschen. Und wenn in Zukunft löschbare Elemente hinzugefügt werden, antworten sie einfach ohne zusätzlichen Code.

0
Mario T. Lanza