AGB  ·  Datenschutz  ·  Impressum  







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

Eingeschränkte Generics (Bug?)

Ein Thema von Neutral General · begonnen am 14. Mai 2010 · letzter Beitrag vom 14. Mai 2010
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Eingeschränkte Generics (Bug?)

  Alt 14. Mai 2010, 13:13
Hallo,

Habe ein kleines Problem mit den Generics. Weiß nicht ob folgendes ein Bug ist, oder ob ich was falsch mache:

Delphi-Quellcode:
type
  // Ein Interface
  IIDObject = interface
    function GetID: Integer;
  end;

  // Testklasse, die dieses Interface Implementieren
  TTest = class(TInterfacedObject, IIDObject)
    function GetID: Integer;
  end;

  // Eine Objectlist, abgeleitet von TList<IIDObject>
  // und einem Generischen Parameter.
  // Die Items-Property soll jetzt überdeckt werden.
  TIDObjectList<T: IIDObject> = class(TList<IIDObject>)
  private
    function GetItem(Index: Integer): T;
    procedure SetItem(Index: Integer; const Value: T);
  public
    property Items[Index: Integer]: T read GetItem write SetItem;
  end;

implementation

{ TIDObjectList<T> }

function TIDObjectList<T>.GetItem(Index: Integer): T;
begin
  Result := inherited Items[Index];
end;

procedure TIDObjectList<T>.SetItem(Index: Integer; const Value: T);
begin
  Items[Index] := Value;
end;
Der Code funktioniert soweit.

Wenn ich nun folgenden Code habe:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var tmp: TIDObjectList<TObject>;
begin
  tmp := TIDObjectList<TObject>.Create;
  tmp.Free;
end;
bekomme ich den Fehler:

Zitat:
[DCC Fehler] Unit1.pas(47): E2514 Typparameter 'T' muss Interface 'IIDObject' unterstützen
was ja vollkommen korrekt ist!

ALLERDINGS:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var tmp: TIDObjectList<TTest>;
begin
  tmp := TIDObjectList<TTest>.Create;
  tmp.Free;
end;
erhalte ich hier auch einen Fehler:

Zitat:
[DCC Fehler] Unit1.pas(82): E2010 Inkompatible Typen: 'TTest' und 'IIDObject'
Und als Fehler-Zeile wird die letzte der Unit (noch hinter dem "end.") markiert.

An wem liegts? An Delphi oder an mir?

PS: Ich benutze Delphi2009

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Eingeschränkte Generics (Bug?)

  Alt 14. Mai 2010, 13:22
Vermutlich wird hier nicht auf Object <> Interface verglichen und man muß ein Interface übergeben, wenn man es so in der Deklaration verlangt.
Selbst wenn das Objekt dieses Interface unterstützen würde.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Eingeschränkte Generics (Bug?)

  Alt 14. Mai 2010, 13:25
Um das ganze noch etwas verwirrender zu machen.

Delphi-Quellcode:
// Wenn ich den ganzen Code so lasse wie er auch oben steht und die GetItem-Methode von so:
// (alt)
function TIDObjectList<T>.GetItem(Index: Integer): T;
begin
  Result := inherited Items[Index];
end;

// auf so ändere
// (neu)
function TIDObjectList<T>.GetItem(Index: Integer): T;
var tmp: T;
begin
  Result := tmp;
end;
Dann compiliert es

Wenn ich schreibe:

Delphi-Quellcode:
function TIDObjectList<T>.GetItem(Index: Integer): T;
var tmp: T;
begin
  tmp := inherited Items[Index];
  Result := tmp;
end;
Dann gibts wieder den oben genannten Fehler.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Eingeschränkte Generics (Bug?)

  Alt 14. Mai 2010, 13:45
Unter D2010 compiliert es, wenn ich folgendes schreibe:

  TIDObjectList<T: IIDObject> = class(TList<T>) Viele Grüße
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Eingeschränkte Generics (Bug?)

  Alt 14. Mai 2010, 13:53
Zitat von mirage228:
Unter D2010 compiliert es, wenn ich folgendes schreibe:

  TIDObjectList<T: IIDObject> = class(TList<T>) Viele Grüße
Ja aber das hilft mir in meiner Situation nicht wirklich. Hintergrund ist, dass ich eine Funktion habe, der ich eine Liste mit IIDObject-Objekten übergeben will. In der Funktion benötige ich auch nur die im Interface deklarierten Methoden.

Ich hätte dann z.B. eine TTest1-Liste und eine TTest2-Liste. Sowohl TTest1 als auch TTest2 würden IIDObject implementieren.
Eine normale TObjectList<TTest1> bzw. TObjectList<TTest2> kann ich nicht verwenden, weil die nicht zueinander kompatibel sind. (Keinen gemeinsamen Vorfahren bis auf TObject). Deswegen bin ich auf die Idee oben gekommen. Eine Liste die von einer TList<IIDObject> ableitet. Der Parameter der Funktion wäre dann vom Typ TList<IIDObject>. Ich könnte dann eine TIDObjectList<TTest1> und eine TIDObjectList<TTest2> übergeben.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Eingeschränkte Generics (Bug?)

  Alt 14. Mai 2010, 14:00
Wenn ich nochmal überlege:
- du willst eine Liste, welche Interfaces (IIDObject oder Nachfahre) enthält
- willst dann aber die Liste mit Objekten (welche zwar IIDObject unterstützt, aber selber kein Interface ist) erstellen.

So kann das natürlich nicht gehn.

Also wenn du die Liste nun mit dem Interface erstellst,
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var tmp: TIDObjectList<IIDObject>;
begin
  tmp := TIDObjectList<IIDObject>.Create;
  tmp.Free;
end;
dann kannst du diesem nun Interfaces (IIDObject) oder Objekte (welche IIDObject unterstützen und bei Übergabe in das Interface umgewandelt werden) übergeben.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Eingeschränkte Generics (Bug?)

  Alt 14. Mai 2010, 14:07
Ja ich weiß. Also ich habe ja eine Interface-Liste. So oder so. Meine abgeleitete TIIDObjectList ist ja im Grunde auch eine Interface-Liste.

Allerdings kann ich bei einer TIDObjectList nur auf die Methoden der Objekte zugreifen, die vom Interface unterstützt werden. Das ist aber nicht gewollt.

Deswegen der Typ-Parameter damit ich die Items-Property der Interface-Liste überschreiben/überdecken kann und intern die Interfaces quasi auf die Typ-Parameter-Klasse caste.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Eingeschränkte Generics (Bug?)

  Alt 14. Mai 2010, 14:20
[info]
irgendwie war des DPs Codeformatter futsch

- hier war grade keine Codeformatierung zu sehn
- und alles zwischen < und > wurde ebenfalls nicht angezeigt
(falls sich grad wer über meinen Code-Abschnitt in #6 wunderte)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: Eingeschränkte Generics (Bug?)

  Alt 14. Mai 2010, 16:09
Hallo,

Wollte mich mal melden um Bescheid zu sagen, dass ichs geschafft habe. Zuerst habe ich statt des Interfaces eine abstrakte Klasse genommen. Problem war dann aber immernoch:

Delphi-Quellcode:
function TIDObjectList<T>.GetItem(Index: Integer): T;
begin
  Result := inherited Items[Index];
end;
Hier wurde dann im konkreten Fall einem TTest ein TIDObject (entspricht IIDObject) zugewiesen. Was natürlich nicht geht und der blöde (= schlaue) Compiler leider gemerkt hat. Casten a la:

Result := T(inherited Items[Index]); funktioniert mit diesen generischen Dingern leider nicht. Dann habe ich.. sagen wir.. manuell gecastet

Delphi-Quellcode:
function TIDObjectList<T>.GetItem(Index: Integer): T;
var tmp: Pointer;
begin
  tmp := inherited Items[Index];
  Move(tmp,Result,SizeOf(Pointer));
end;
Und jetzt funktioniert es
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  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 02:02 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