Grundlegendes zu Delphi Class (und Record) -Helfern

click fraud protection

Ein Feature der Delphi-Sprache, das vor einigen Jahren hinzugefügt wurde (vor langer Zeit) in Delphi 2005) mit dem Namen "Klassenhelfer" ermöglicht es Ihnen, einer vorhandenen Klasse (oder einem Datensatz) neue Funktionen hinzuzufügen, indem Sie der Klasse (Datensatz) neue Methoden hinzufügen.

Im Folgenden finden Sie weitere Ideen für Klassenhelfer. + Erfahren Sie, wann und wann Sie Klassenhelfer nicht verwenden sollen.

Klassenhelfer für...

Mit einfachen Worten, ein Klassenhelfer ist ein Konstrukt, das eine Klasse erweitert, indem neue Methoden in die Hilfsklasse eingeführt werden. Mit einem Klassenhelfer können Sie vorhandene Klassen erweitern, ohne sie tatsächlich zu ändern oder von ihnen 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. ÖffentlichkeitFunktion Enthält (const aString: string): boolean; Ende; 

Die obige Klasse mit dem Namen "TStringsHelper" ist ein Klassenhelfer für den Typ TStrings. Beachten Sie, dass TStrings in Classes.pas definiert ist, einer Einheit, die standardmäßig in der Verwendungsklausel für any verfügbar ist

instagram viewer
Delphi Formeinheit zum Beispiel.

Die Funktion, die wir mit unserem Klassenhelfer zum TStrings-Typ hinzufügen, lautet "Enthält". Die Implementierung könnte folgendermaßen aussehen:

Funktion TStringsHelper. Enthält (const aString: string): boolean; Start
Ergebnis: = -1 <> IndexOf (aString); Ende; 

Ich bin sicher, dass Sie die oben genannten Punkte in Ihrem Code oft verwendet haben, um zu überprüfen, ob einige Nachkommen von TStrings, wie z. B. TStringList, einen Zeichenfolgenwert in der Items-Auflistung haben.

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

Nachdem Sie den TStringsHelper und ein Listenfeld in einem Formular (mit dem Namen "ListBox1") implementiert haben, können Sie jetzt überprüfen, ob eine Zeichenfolge Teil der Eigenschaft "Listenfeldelemente" ist, indem Sie Folgendes verwenden:

wenn ListBox1.Items. Enthält ('eine Zeichenfolge') dann... 

Klassenhelfer gehen und NoGo

Die Implementierung von Klassenhelfern hat einige positive und einige (Sie könnten denken) negative Auswirkungen auf Ihre Codierung.

Im Allgemeinen sollten Sie vermeiden, Ihre eigenen Klassen zu erweitern - als müssten Sie neue Funktionen hinzufügen Ihre eigenen benutzerdefinierten Klassen - fügen Sie die neuen Inhalte direkt in die Klassenimplementierung ein - ohne eine Klasse zu verwenden Helfer.

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

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

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

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 haben Konstrukte wie:

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

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

Wo ist MEIN Klassenhelfer?

Eine Einschränkung bei der Verwendung von Klassenhelfern, die Ihnen helfen könnten, sich selbst in den Fuß zu schießen, ist die Tatsache, dass Sie mehrere Helfer definieren und einem einzigen Typ zuordnen können. Es gilt jedoch nur null oder ein Helfer an einer bestimmten Stelle im Quellcode. Es gilt der im nächstgelegenen Bereich definierte Helfer. Der Umfang der Klassen- oder Aufzeichnungshilfe wird im Normalfall festgelegt Delphi Mode (zum Beispiel von rechts nach links in der Verwendungsklausel der Einheit).

Dies bedeutet, dass Sie möglicherweise zwei Helfer der TStringsHelper-Klasse in zwei verschiedenen Einheiten definieren, aber nur eine gilt, wenn sie tatsächlich verwendet wird!

Wenn in der Einheit, 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 verschiedenen Einheiten befinden, haben möglicherweise eine unterschiedliche Implementierung für die Methode "Enthält" im obigen Beispiel.

Verwenden oder nicht?

Ja, aber beachten Sie die möglichen Nebenwirkungen.

Hier ist eine weitere praktische Erweiterung des oben genannten Helfers der TStringsHelper-Klasse


TStringsHelper = Klassenhelfer für TStrings. PrivatFunktion GetTheObject (const ein Faden: Zeichenfolge): TObject; Verfahren SetTheObject (const ein Faden: Zeichenfolge; const Wert: TObject); ÖffentlichkeitEigentum ObjectFor [const ein Faden: Zeichenfolge]: Objekt lesen GetTheObject schreiben SetTheObject; Ende;... Funktion TStringsHelper. GetTheObject (const ein Faden: Zeichenfolge): TObject; var
idx: Ganzzahl; 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: Ganzzahl; Start
idx: = IndexOf (aString); wenn idx> -1 dann Objekte [idx]: = Wert; Ende; 

Wenn du gewesen bist Hinzufügen von Objekten zu einer Zeichenfolgenlistekönnen Sie erraten, wann Sie die oben genannte praktische Hilfseigenschaft verwenden sollen.

instagram story viewer