AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Generics mit Einschränkungen auf Ordinaltypen?

Ein Thema von Deep-Sea · begonnen am 17. Nov 2010 · letzter Beitrag vom 17. Nov 2010
Antwort Antwort
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#1

Generics mit Einschränkungen auf Ordinaltypen?

  Alt 17. Nov 2010, 10:13
Delphi-Version: 5
Morgen Jungs

Ich wollte mich mal wieder den Generics bedienen. Das Problem ist, dass ich als Typparameter nur Ordinaltypen verwenden will und werde. Diese Einschränkung ist ja aber leider nicht möglich. Ich brauche sie aber, da ich Konstrukte nutzen muss die nur mit Ordinaltypen funktionieren (z.B. für Schleifen, für die Größenangabe bei Arrays, etc.).
Irgendeine Idee?
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Generics mit Einschränkungen auf Ordinaltypen?

  Alt 17. Nov 2010, 11:21
Morgen Jungs

Ich wollte mich mal wieder den Generics bedienen. Das Problem ist, dass ich als Typparameter nur Ordinaltypen verwenden will und werde.
Damit hast Du ja schon Deine Beschränkung. Irgendwann musst Du ja Deine generische Klasse kokretisieren, z.B.
Delphi-Quellcode:
TFoo<T> =class
  procedure TueDies: T;
end;

TIntegerFoo= class(TFoo<integer>);
Letztendlich weisst Du ja, was Du tust und musst Dich daher nicht mit constraints vor Dir selber und Deinem Handeln schützen, oder?

BTW, Dein Profil zeigt Delphi 5, das hat noch keine Generics!
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Generics mit Einschränkungen auf Ordinaltypen?

  Alt 17. Nov 2010, 11:46
Ja schon klar. Aber das Problem ist, dass es so nicht geht, wenn ich z.B. eine Schleife oder ein Array mit Hilfe des Typparameters programmieren will.
Delphi-Quellcode:
TFoo<T> = class
  procedure Blubb;
end;

procedure TFoo<T>.Blubb;
var
  LSchleife: T;
begin
  For LSchleife := Low(T) to High(T) do ... ;
end;
Das geht nicht, da Delphi - verständlicherweise - meckert, dass er für die Schleife einen Ordinaltypen braucht. Den habe ich zwar vor zu übergeben, aber davon kann Delphi ja nun mal nicht ausgehen.

PS: Also bei mir zeigt mein Profil schon lange Delphi 2009 Professional an
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Generics mit Einschränkungen auf Ordinaltypen?

  Alt 17. Nov 2010, 12:04
Evtl. so:
Delphi-Quellcode:
TFoo<T: record> = class // Beschränkung auf Wertetypen
  procedure Blubb;
end;

procedure TFoo<T>.Blubb;
var
  LSchleife: T;
  LMin: T;
  LMax: T;
begin
  if TypeInfo(T)=TypeInfo(integer) then begin
    LMin:= Low(integer);
    LMax:= High(integer);
  end else
  if TypeInfo(T)=TypeInfo(cardinal) then begin
    LMin:= Low(cardinal);
    LMax:= High(cardinal);
  end; // usw.
  For LSchleife := LMin to LMax do ... ;
end;
Hab's allerdings nicht getestet, nur 'ne Idee...

PS: Also bei mir zeigt mein Profil schon lange Delphi 2009 Professional an
Richtig, aber oben unter dem Topic steht noch "Delphi Version: 5"
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Generics mit Einschränkungen auf Ordinaltypen?

  Alt 17. Nov 2010, 12:07
[add]
selbes Grundthema:
http://www.delphipraxis.net/154472-g...klarieren.html
[/add]


Antwort, welche ich selber bei Sowas schon gehört hab:
Für sowas sind Generics nicht gedacht.

Grund, Delphi verfügt nur über einen Single-Pass-Compiler,
solche speziellen Typgruppen gibt es nicht (in C, wo Delphi es abgekupfert hat)
und da Delphi bei Parsen dieses Codes noch nicht weiß um welchen Typ es sich irgendwann mal handeln wird, kann man auf so spezifische Eigenschaften des gewünschten Typs nicht zugreifen.


Schau dir einfach mal meine letzten Threads zu den besch*** Generigs an.
Mein Fazit: Generics könnten sowas von cool sein, aber für z.B. sowas wie das hier, sind die einfach nicht zu gebrauchen ... leider.

@webcss: Ja, solche Hacks gehn schon, aber
diese machen absolut keinen Spaß,
sind umständlich,
ineffektiv / teilweise Rechenintensiv,
und, wenn man sie an vielen Stellen einsetzt, auch noch fehleranfällig und wartungsintensiv.

Ordinale Typen gibt es viele (nicht nur diese Beiden)
und ich hab es schon bei den 3 Typen AnsiString, UnicodeString und WideString aufgegeben, weil es einfach zu unübersichtlich wurde.

@Deep-Sea: Verzichte einfach auf die Generics, verwende in der Klasse den Integer und eventuell noch eine zweite Klasse mit Int64 (oder so ähnlich).
$2B or not $2B

Geändert von himitsu (17. Nov 2010 um 12:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Generics mit Einschränkungen auf Ordinaltypen?

  Alt 17. Nov 2010, 12:28
Schade schade ... auch wenn ich damit eig. schon gerechnet habe ...
Verzichte einfach auf die Generics, verwende in der Klasse den Integer und eventuell noch eine zweite Klasse mit Int64 (oder so ähnlich).
Wie du schon selbst einige Zeilen davor sagtest, gibt es viele Ordinaltypen
Genau deswegen wollte ich es ja so lösen, denn in dem Fall geht es mir um Enums. Aktuell wirklich nur zwei ... aber in Zukunft vlt. mal dutzende.
Na mal sehen, wie ich es schön lösen kann ...

Find's halt doof von Delphi, denn Interfaces kann ich auch zur Einschränkung nutzen


@webcss:
Ach da ... joa, vergessen zu setzen
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Generics mit Einschränkungen auf Ordinaltypen?

  Alt 17. Nov 2010, 12:35
jupp, sowas wie Interface und Object kannst du als Einschränkung nutzen,
aber auch da wird letzendlich auch Vieles nicht funktionieren ... siehe mein verlinkter String-Thread, also da wo es mal um Objekte geht.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Generics mit Einschränkungen auf Ordinaltypen?

  Alt 17. Nov 2010, 15:17
Vielleicht kannst du etwas Logik von Compilezeit in Richtung Laufzeit verschieben. Z.B. könntest du TFoo im Konstruktor eine TypeInfo übergeben und dann irgendwie so:
Delphi-Quellcode:
function Iterate(ATypeInfo: PTypeInfo): Cardinal;
var
  i: Integer;
  TypeData: PTypeData;
begin
  TypeData := GetTypeData(ATypeInfo);
  for i := TypeData^.MinValue to TypeData^.MaxValue do
    Writeln(GetEnumName(ATypeInfo, i));
end;

begin
  Iterate(TypeInfo(TTypeKind));
end.
arbeiten. Mit der mangelnde Typsicherheit (Enum -> Integer) müsstest du bei einer Lösung mit Generics vermutlich auch leben.
Uli Gerhardt
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:03 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