Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Eine Generics TObjectList<T> als Parameter

  Alt 30. Okt 2012, 14:06
Da wir einen Typconstraint auf class haben, können wir davon ausgehen dass jedes T eine Klasse ist.
Somit können wir auch gefahrlos einen Hardcast auf TCustomObjectList<TObject> machen (Stichwort: Kovarianz).

Bei der Instanzierung einer Liste, merken wir uns, von welchem Typ T ist.
Dies muss auf Instanzebene gespeichert werden, damit wir auch nach dem zuvor erwähnten Hardcast noch die richtige Klasse herausbekommen.

Delphi-Quellcode:
type
  TCustomObjectList<T: class> = class(TObjectList<T>)
  private
    FItemClass: TClass;
  public
    constructor Create(AOwnsObjects: Boolean = True); overload;
    function AsNonGeneric: TCustomObjectList<TObject>;
    property ItemClass: TClass read FItemClass;
  end;

  TCustomObjectList = TCustomObjectList<TObject>;

function TCustomObjectList<T>.AsNonGeneric: TCustomObjectList<TObject>;
begin
  Result := TCustomObjectList<TObject>(Self);
end;

constructor TCustomObjectList<T>.Create(AOwnsObjects: Boolean);
begin
  inherited Create(AOwnsObjects);
  FItemClass := T;
end;

procedure Test(ObjectList: TCustomObjectList);
begin
  Writeln(objectList.ItemClass.ClassName);
end;

var
  ZahlungsartList: TCustomObjectList<TZahlungsart>;
  Postleitzahlen: TCustomObjectList<TPostleitzahlen>;
begin
  ZahlungsartList := TCustomObjectList<TZahlungsart>.Create;
  Postleitzahlen := TCustomObjectList<TPostleitzahlen>.Create;

  Test(ZahlungsartList.AsNonGeneric);
  Test(Postleitzahlen.AsNonGeneric);
end.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat