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.