Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TList / Generics vererben (https://www.delphipraxis.net/183524-tlist-generics-vererben.html)

Martin W 16. Jan 2015 22:18

TList / Generics vererben
 
Hi,

lassen sich Generics "vererben"?

Also vom Typ:

Delphi-Quellcode:
type
  TFarbe = class
  end;

type
  TRot = class(TFarbe)
  end;

type
  TBlau = class(TFarbe)
  end;


procedure CleanColor;
var
  varListRed: TList<TRot>;
  varListBlue: TList<TBlau>;
  varListToEdit: ???
begin
 
  if (...) then
    varListToEdit := varListRed
  else
    varListToEdit := varListBlue;
 
  (...)

  varListToEdit.DoSomething;
  varListToEdit.TrimExcess

end;
Geht so etwas?

(Alternativ bräuchte ich nur Standardfunktionen, die alle TList, unabhängig von der Typisierung haben, also z.B. TrimExccess).

Viele Grüße,
Martin

Stevie 16. Jan 2015 23:41

AW: TList / Generics vererben
 
Das grundlegende Problem hab ich hier schonmal beschrieben.

In deinem Fall kannst du mit einem Hardcast arbeiten sofern du nicht versuchst nen TRot in ne liste von TBlau zu stecken:

Delphi-Quellcode:
procedure CleanColor;
var
  varListRed: TList<TRot>;
  varListBlue: TList<TBlau>;
  varListToEdit: TList<TFarbe>;
begin
 
  if (...) then
    varListToEdit := TList<TFarbe>(varListRed);
  else
    varListToEdit := TList<TFarbe>(varListBlue);
 
  (...)
  varListToEdit.DoSomething;
  varListToEdit.TrimExcess
end;

Dejan Vu 17. Jan 2015 08:14

AW: TList / Generics vererben
 
Geht das nicht in Delphi?
Delphi-Quellcode:
Procedure Foo<T> (A : TList<T:TFarbe>);
begin
  A.DoSomething;
  A.Bar;
End;
...

if this then Foo<TRot>(varListRed) else Foo<TBlau>(varListBlue);

Sir Rufo 17. Jan 2015 08:46

AW: TList / Generics vererben
 
Nicht ganz, denn es muss eine Methode sein.
Delphi-Quellcode:
TFoo = class
  class procedure Bar<T>( List : TList<T> );
end;

class procedure TFoo.Bar<T>( List : TList<T> );
begin
  List.TrimExcess;
end;

Stevie 17. Jan 2015 08:49

AW: TList / Generics vererben
 
Die Routine bringt aber nix, wenn sie generisch ist, kannste sie nicht unter das if/else schreiben und für jegliche TList<T> nutzen, weil du immernoch nen T angeben musst. Die fehlende Kontravarianz ist hier das Problem.

Sonst hättse ja gleich das hier schreiben können, nech?

Delphi-Quellcode:
if (...) then
  varListRed.TrimExcess
else
  varListBlue.TrimExcess;

Dejan Vu 17. Jan 2015 12:11

AW: TList / Generics vererben
 
Zitat:

Zitat von Stevie (Beitrag 1286807)
Die Routine bringt aber nix, wenn sie generisch ist...

nicht? Ich ersetze die Zuweisung zu 'varEditList' durch den Aufruf der Methode. Deine 'nech'-Alternative verstößt gegen DRY, ist also nicht äquivalent.
Aber im Prinzip verstehe ich deinen Einwand.

Ganz so einfach, wie man das gerne hätte, wird es natürlich nicht. Dazu muss man den generischen Ansatz durchziehen.

Oder ich nehme Reflection, oder wie das bei Delphi heißt (RTTI oder so) und mache es so:
1. Das T der TList<T> ermitteln.
2. Per RTTI die Methode mit dem Typparameter und der Liste aufrufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz