OBS/Adminhilfe/Generics

Aus OBS Wiki
Zur Navigation springen Zur Suche springen
Für diese Seite wurde eine Zugriffsbeschränkung eingerichtet. Falls du diese Nachricht siehst, bist du nicht berechtigt, diese Seite einzusehen.

Dies ist eine zugriffsgeschützte Seite.


Admin-Hilfe

OBS-Administration / Installation
kundenspezifische Anpassungen
OBS Protokolle
Shop-Administration

HINWEIS: Bisher werden in XE8 nur generische Klassen, aber noch keine generischen Methoden und Prozeduren untestützt.

Übersicht

Generics in Delphi sind abstrakte Klassen, auch parameterabhängige Klassen, die für mehrere Datentypen gültige Funktionen vereinen.
Zuerst wird die generische Klasse mit einem Parameter anstatt des des Datentypen definiert.
Bei der Erstellung von Objektinstanzen aus der generischen Klasse wir diesen Objekten zur Entwurfszeit ein Datentyp zugeordnet, der an die Stelle des Parameters tritt.

Anwendungsmöglichkeiten

Anwendungsmöglichkeiten beinhalten die Nutzung als Dictionary, Liste, .

Definieren von generischen Klassen

Generische Klassen werden in Delphi wie folgt definiert:

type
  generic KLASSENNAME < PARAMETER > = class
    ATTRIBUTE
    FUNKTIONEN/METHODEN/PROZEDUREN
  end;

Erzeugen von Objektinstanzen der generischen Klasse

Beim Erzeugen eines neuen Objektes der generischen Klasse wird diesem zur Entwurfszeit ein Datentyp zugeordnet.

type 
  OBJEKTNAME = specialize KLASSENNAME < DATENTYP >; 

Beispiele

Als Standardbeispiel gilt eine Objektliste aus unbekannten Klassen, sozusagen ein Array von Hand.

type
  generic TList<T> = class
    Items: array of T;
    procedure Add(Value: T);
    function Get(Position: Integer); 
  end;

implementation
 
procedure TList.Add(Value: T);
begin
  SetLength(Items, Length(Items) + 1);
  Items[Length(Items) - 1] := Value;
end;

function TList.Get(Position: Integer): T;
begin 
  result := T[Position];
end;

Diese Klasse kann dann als Listenobjekt eines bestimmten Datentypen wiederaufgerufen werden, muss dazu dann spezialisiert werden:

Type  
  TIntegerList = specialize TList<Integer>;
  TPointerList = specialize TList<Pointer>;
  TStringList = specialize TList<string>;

TPointerList.Add(EinPointer);
TPointerList.Get(0);

Damit stehen die in der generischen Klasse definierten Funktionen Add und Get für alle Datentypen zur Verfügung.

Vorteile und Probleme

Generics bieten einige Vorteile, aber auch einige mögliche Probleme, die vermieden werden müssen.
Vorteile:

  • Codeeinsparen durch Wiederverwendbarkeit
  • Bessere Übersichtlichkeit und Wartbarkeit des Codes

Risiken:

  • Wenn in den Prozeduren Funktionen genutzt werden, die Datentypspezifisch sind, muss eine Abfrage mittels ClassType, ClassParent' oder InheritsFrom erfolgen.