Grundlegendes zu Delphi-Klassen- (und Datensatz-) Helfern

Mit der vor einigen Jahren (in Delphi 2005) hinzugefügten Funktion "Class Helpers" können Sie einer vorhandenen Klasse (oder einem Datensatz) neue Funktionen hinzufügen, indem Sie der Klasse (Datensatz) neue Methoden hinzufügen..

Im Folgenden finden Sie einige weitere Ideen für Klassenhelfer. Erfahren Sie, wann Sie Klassenhelfer einsetzen und wann nicht.

Klassenhelfer für…

Mit einfachen Worten, ein Klassenhelfer ist ein Konstrukt, das eine Klasse durch die Einführung neuer Methoden in die Helferklasse erweitert. Mit einem Klassenhelfer können Sie eine vorhandene Klasse erweitern, ohne sie tatsächlich zu ändern oder von ihr zu erben.

Um die TStrings-Klasse der VCL zu erweitern, deklarieren und implementieren Sie einen Klassenhelfer wie den folgenden:

 Art TStringsHelper = Klassenhelfer für TStrings Öffentlichkeit Funktion Enthält (const aString: string): boolean; Ende; 

Die oben genannte Klasse "TStringsHelper" ist eine Klassenhilfe für den Typ TStrings. Beachten Sie, dass TStrings in Classes.pas definiert ist, einer Einheit, die standardmäßig in der uses-Klausel für die Einheit eines Delphi-Formulars verfügbar ist.

Die Funktion, die wir dem TStrings-Typ mit unserem Klassen-Helfer hinzufügen, ist "Contains". Die Implementierung könnte folgendermaßen aussehen:

 Funktion TStringsHelper.Contains (const aString: string): boolean; Start Ergebnis: = -1 IndexOf (aString); Ende; 

Ich bin mir sicher, dass Sie das Obige oft in Ihrem Code verwendet haben, um zu überprüfen, ob einige TStrings-Nachkommen, wie z. B. TStringList, einen Zeichenfolgenwert in ihrer Items-Auflistung haben.

Beachten Sie, dass beispielsweise die Items-Eigenschaft einer TComboBox oder einer TListBox vom Typ TStrings ist.

Nach der Implementierung von TStringsHelper und einem Listenfeld in einem Formular (mit dem Namen "ListBox1") können Sie jetzt überprüfen, ob eine Zeichenfolge Teil der Listbox Items-Eigenschaft ist, indem Sie Folgendes verwenden:

 wenn ListBox1.Items.Contains ('irgendein String') dann

Klassenhelfer Go und NoGo

Die Implementierung von Klassenhelfern hat einige positive und einige negative Auswirkungen auf Ihre Codierung.

Im Allgemeinen sollten Sie vermeiden, Ihre eigenen Klassen zu erweitern - als müssten Sie Ihren eigenen benutzerdefinierten Klassen einige neue Funktionen hinzufügen - und die neuen Elemente in der Klassenimplementierung direkt hinzufügen - und keinen Klassenhelfer verwenden.

Klassenhelfer sind daher eher dazu gedacht, eine Klasse zu erweitern, wenn Sie sich nicht auf die normale Klassenvererbung und Schnittstellenimplementierungen verlassen können (oder müssen).

Ein Klassenhelfer kann keine Instanzdaten deklarieren, wie z. B. neue private Felder (oder Eigenschaften, die solche Felder lesen / schreiben würden). Das Hinzufügen neuer Klassenfelder ist zulässig.

Ein Klassenhelfer kann neue Methoden hinzufügen (Funktion, Prozedur).

Vor Delphi XE3 konnten Sie nur Klassen und Datensätze erweitern - komplexe Typen. Ab Delphi XE 3 können Sie auch einfache Typen wie Integer oder String oder TDateTime erweitern und Konstruktionen wie die folgenden haben:

 var s: string; Start s: = 'Delphi XE3-Helfer'; s: = s.UpperCase.Reverse; Ende; 

Ich werde in naher Zukunft über Delphi XE 3 schreiben.

Wo ist MEIN Klassenhelfer?

Eine Einschränkung bei der Verwendung von Klassenhelfern, die Ihnen helfen könnten, sich in den Fuß zu schießen, ist die Tatsache, dass Sie mehrere Helfer definieren und einem Typ zuordnen können. An einer bestimmten Stelle im Quellcode gilt jedoch nur ein oder kein Helfer. Es gilt der im nächstgelegenen Bereich definierte Helfer. Der Gültigkeitsbereich der Klassen- oder Datensatzhilfe wird auf normale Delphi-Weise festgelegt (z. B. von rechts nach links in der uses-Klausel der Unit)..

Dies bedeutet, dass Sie möglicherweise zwei TStringsHelper-Klassenhelfer in zwei verschiedenen Einheiten definieren, von denen jedoch nur einer bei tatsächlicher Verwendung angewendet wird!

Wenn in der Unit, in der Sie die eingeführten Methoden verwenden, kein Klassenhelfer definiert ist - was in den meisten Fällen der Fall ist -, wissen Sie nicht, welche Klassenhelferimplementierung Sie tatsächlich verwenden würden. Zwei Klassenhelfer für TStrings, die unterschiedlich benannt sind oder sich in unterschiedlichen Units befinden, haben möglicherweise eine unterschiedliche Implementierung für die "Contains" -Methode im obigen Beispiel.

Verwenden Sie oder nicht?

Ja, aber seien Sie sich der möglichen Nebenwirkungen bewusst.

Hier ist eine weitere praktische Erweiterung für den oben erwähnten Helfer der Klasse TStringsHelper

 TStringsHelper = Klassenhelfer für TStrings Privat Funktion GetTheObject (const ein Faden: Zeichenfolge): TObject; Verfahren SetTheObject (const ein Faden: Zeichenfolge; const Wert: TObject); Öffentlichkeit Eigentum ObjectFor [const ein Faden : Zeichenfolge]: Objekt lesen GetTheObject schreiben SetTheObject; Ende;… Funktion TStringsHelper.GetTheObject (const ein Faden: Zeichenfolge): TObject; var idx: integer; Start Ergebnis: = Null; idx: = IndexOf (aString); wenn idx> -1 dann Ergebnis: = Objekte [idx]; Ende; Verfahren TStringsHelper.SetTheObject (const ein Faden: Zeichenfolge; const Wert: TObject); var idx: integer; Start idx: = IndexOf (aString); wenn idx> -1 dann Objekte [idx]: = Wert; Ende; 

Wenn Sie einer Zeichenfolgenliste Objekte hinzugefügt haben, können Sie erraten, wann Sie die obige praktische Hilfseigenschaft verwenden müssen.