AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Generics und Typparameter

Ein Thema von Codewalker · begonnen am 6. Nov 2011 · letzter Beitrag vom 6. Nov 2011
Antwort Antwort
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#1

Generics und Typparameter

  Alt 6. Nov 2011, 17:10
Hallo zusammen.

Ich möchte mir eine generische Klasse für einen einfachen Ringspeicher schreiben. Dazu verwalte ich (genau wie TList<T> ) die Elemente des Speichers in einem array of T . Das compiliert soweit ganz gut, bis ich die Add-Funktion implementieren will. Dann bekomme ich den Fehler:

Code:
E2571 Typparameter 'T' hat keine Klassen- oder Interface-Einschränkung
Was soll mir das sagen und warum kann ich es nicht genau so machen wie bei TList. Hier mal der auf nötigste zusammengestrichene Code:

Delphi-Quellcode:
type
 TRing<T> = class(TEnumerable<T>)
 private
  FItems: array of T;
 {...}
 public
   procedure Add(const Value: T);
   {...}
 end;

{...}

procedure TRing<T>.Add(const Value: T);
var
  Pos: Integer;
begin
  Pos := (Current + 1) mod Size;
  FItems[Pos] := T; // <- hier meckert er
end;
Die Add-Methode einer einfachen Liste scheint aber genau so zu funktionieren. Also .. was tun?
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.478 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: Generics und Typparameter

  Alt 6. Nov 2011, 17:12
Ändere das T mal in Value ab:

FItems[Pos] := Value; // <- hier meckerte er
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Generics und Typparameter

  Alt 6. Nov 2011, 17:17
grks, manchmal wird man einfach betriebsblind (wobei die Fehlermeldung nicht hilfreich war).
Danke Dir
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
8.506 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Generics und Typparameter

  Alt 6. Nov 2011, 19:23
So einen Ringspeicher habe ich gerade erst implementiert. Dabei habe ich für den Zugriff auf die Elemente zu Pointern gegriffen, so dass ich auch Records darin speichern und direkt darauf zugreifen kann.

// EDIT:
Sprich:
Delphi-Quellcode:
  TCircularBuffer<T> = class
  public
    type
      TBufferPointer = ^T;
  strict private
    var
      FElements: TArray<T>;
  [...]
  public
    type
      TBufferEnumerator = class(TEnumerator<TCircularBuffer<T>.TBufferPointer>)
      [...]
    procedure Next;
    function GetEnumerator: TBufferEnumerator;
    property Current: TBufferPointer read GetCurrent;
    property Size: Integer read GetSize write SetSize;
    property Element[AIndex: Integer]: TBufferPointer read GetElement; default;
  end;
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke ( 6. Nov 2011 um 19:27 Uhr)
  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 09:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf