Einzelnen Beitrag anzeigen

Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Generics <> Templates ?

  Alt 29. Jun 2007, 15:57
Zitat von Ghostwalker:
Generics:

Untypisierte "Vorlage", die der Compiler compilieren kann. Diese werden aber erst zur Laufzeit
entsprechend typisiert werden. Was aber auch bedeutet, das eine Typprüfung erst zur Laufzeit
stattfinden kann, da erst da der Typ bekannt ist.


Ist das so richtig ?
Die Typprüfung findet bereits zur Compilezeit statt, allerdings dort wo dein instantiierter Typ deklariert wird - dort kannst du für <T> nämlich nur einen passenden Typen einsetzen.

Ein schönes Beispiel dafür sind typisierte Listen:
Delphi-Quellcode:
type
  TGenericList<T> = class
    where T is TObject
  private
    function GetItem(Index: Integer): T;
    procedure SetItem(Index: Integer; const Value: T);
  public
    procedure Add(AValue: T);
    property Items[Index: Integer]: T read GetItem write SetItem;
  end;
Diese Klasse wir fertig übersetzt in Maschinensprache genau so aussehen wie TObjectList - die Elemente sind TObjects. Sie hat jedoch den Vorteil, dass man Eigenschaften wie "Items" und Methoden wie "Add" wirklich typisieren kann.

Wenn du allerdings einen Typen davon ableitest mit (ich kenne mich mit der Chrome-Syntax nicht aus, kann also falsch sein)
Delphi-Quellcode:
var
  WinControlList = TGenericList<TWinControl>;
dann kann der Compiler schon prüfen, dass nur TWinControl-Objekte darin abgelegt werden. Dann sieht es so aus als ob du den Typ deklariert hättest mit <TWinControl> statt <T>:
Delphi-Quellcode:
type
  // Geht so natürlich nicht
  TGenericList<TWinControl> = class
  private
    function GetItem(Index: Integer): TWinControl;
    procedure SetItem(Index: Integer; const Value: TWinControl);
  public
    procedure Add(AValue: TWinControl);
    property Items[Index: Integer]: TWinControl read GetItem write SetItem;
  end;
... und der Compiler kann dann beim Übersetzen schon einen Typfehler anmeckern, wenn du irgendetwas anderes als ein TWinControl zu deiner Liste hinzufügen willst.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat