AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TList / Generics vererben

Ein Thema von Martin W · begonnen am 16. Jan 2015 · letzter Beitrag vom 17. Jan 2015
Antwort Antwort
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#1

TList / Generics vererben

  Alt 16. Jan 2015, 22:18
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

Geändert von Martin W (16. Jan 2015 um 22:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: TList / Generics vererben

  Alt 16. Jan 2015, 23:41
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;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: TList / Generics vererben

  Alt 17. Jan 2015, 08:14
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);
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: TList / Generics vererben

  Alt 17. Jan 2015, 08:46
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: TList / Generics vererben

  Alt 17. Jan 2015, 08:49
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;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (17. Jan 2015 um 08:51 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: TList / Generics vererben

  Alt 17. Jan 2015, 12:11
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 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