Computerwissenschaften

Grundlegendes zu Delphi Class (und Record) -Helfern

Mit einer vor einigen Jahren hinzugefügten Funktion der Delphi-Sprache (bereits in Delphi 2005. namens „Klassenhelfer“ 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 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:


type
TStringsHelper=class helper for TStrings
public
function Contains(const aString : string) : boolean;
end;

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 beispielsweise standardmäßig in der Verwendungsklausel für die Einheit eines Delphi- Formulars verfügbar ist .

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


function TStringsHelper.Contains(const aString: string): boolean;
begin
result := -1 <> IndexOf(aString);
end;

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 einer TComboBox oder einer TListBox vom Typ TStrings ist.

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


if ListBox1.Items.Contains('some string') then ...

 

Klassenhelfer gehen und NoGo

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

Im Allgemeinen sollten Sie vermeiden, Ihre eigenen Klassen zu erweitern – als müssten Sie Ihren eigenen benutzerdefinierten Klassen neue Funktionen hinzufügen -, die neuen Inhalte direkt in die Klassenimplementierung einfügen – ohne einen Klassenhelfer zu verwenden.

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;
begin
s := 'Delphi XE3 helpers';
s := s.UpperCase.Reverse;
end;

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 des Klassen- oder Aufzeichnungshelfers wird auf normale Delphi- Weise festgelegt (z. B. von rechts nach links in der Verwendungsklausel des Geräts).

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 TStringsHelper-Klassenhelfers


TStringsHelper=class helper for TStrings
private
function GetTheObject(const aString: string): TObject;
procedure SetTheObject(const aString: string; const Value: TObject);
public
property ObjectFor[const aString : string]: TObject read GetTheObject write SetTheObject;
end;
...
function TStringsHelper.GetTheObject(const aString: string): TObject;
var
idx : integer;
begin
result := nil;
idx := IndexOf(aString);
if idx > -1 then result := Objects[idx];
end;
procedure TStringsHelper.SetTheObject(const aString: string; const Value: TObject);
var
idx : integer;
begin
idx := IndexOf(aString);
if idx > -1 then Objects[idx] := Value;
end;

Wenn Sie einer Zeichenfolgenliste Objekte hinzugefügt haben. können Sie erraten, wann die oben genannte praktische Hilfseigenschaft verwendet werden soll.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.