Bonjour,

J'utilise Delphi 2009 et les generics en abondance. Mais je rencontre un problème avec ce code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
 
interface
 
uses
  Generics.Collections, Classes;
 
type
TPersistentList<T : class, IPersistentObject<T>> = class(TObjectList<T>)
private
  FAssociatedDAO : IDAO<T>;
public
  constructor Create(AssociatedDAO : IDAO<T>);
  destructor Destroy; override;
  function GetById(Id : Integer) : T;
  procedure Update(ToUpdate : T);
  procedure Save;
end;
 
IPersistentObject<T : class> = interface (IInterface)
  function GetId : Integer;
  procedure SetId(Id : Integer);
end;
 
IDAO<T : class, IPersistentObject<T>> = interface(IInterface)
  function GetList() : TPersistentList<T>;
end;
donc comme vous pouvez le remarquer, il y a dépendance circulaire entre IDAO<T : class, IPersistentObject<T>> qui renvoi un TPersistentList<T> et TPersistentList<T : class, IPersistentObject<T>> qui garde un référence vers IDAO<T>

Je suis donc obligé de déclarer des classes en forward déclaration en en-tête de la partie interface mais voila, je n'arrive pas à déclarer correctement avec les generics !!

Si je déclare :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
type
 
IPersistentObject<T> = interface;
IDAO<T : class, IPersistentObject<T>> = interface;
J'ai l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
[DCC Erreur] BaseDAO.pas(41): E2037 La déclaration de 'IDAO<T>' diffère de la déclaration précédente
au niveau de la déclaration :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
IDAO<T : class, IPersistentObject<T>> = interface(IInterface)
  function GetList() : TPersistentList<T>;
end;
J'ai essayé de mettre en forward declaration : IDAO<T> = interface; IDAO<T : class> = interface;
Toujours le même message d'erreur !

Si quelqu'un à une idée ...