4 votes

Une classe générique Delphi peut-elle descendre de son argument de classe ?

J'ai essayé de définir une classe TSingleton générique et héritable. Voici ce que j'avais en cours :

  TSingleton<RealClass, InheritsFrom : class> = class(InheritsFrom)
  strict private
    class var FInstance : RealClass;
  protected
    procedure InstanceInitialization;virtual;
  public
    destructor Destroy; override;
    class procedure Create; reintroduce;
    class function Instance : RealClass;
    class procedure InstanceFree;
  end;

L'objectif était de pouvoir "insérer" le modèle de singleton dans un arbre d'héritage. Ainsi, au lieu de déclarer quelque chose comme ceci :

  TMySingletonComponent = class(TComponent)

  end;

Pour mettre en œuvre le modèle de singleton, je devrais déclarer quelque chose comme ceci :

  TMyGenericSingletonComponent = class(TSingleton<TMyGenericSingletonComponent,TComponent>)
  end;

Malheureusement, cela ne fonctionnera pas. J'obtiens l'erreur suivante (dans D2010) :

  TSingleton<RealClass, InheritsFrom : class> = class(InheritsFrom) ///E2021 Class type required

Je me demandais si cela fonctionnerait dans Delphi XE. Existe-t-il un "hack" propre que je pourrais utiliser pour que cela fonctionne dans D2010 ? Y a-t-il des raisons fondamentales pour lesquelles cela ne peut pas fonctionner ?

5voto

Barry Kelly Points 30330

Par conception, il n'est pas possible de créer une classe générique qui dérive d'un de ses arguments de type.

3voto

Mason Wheeler Points 52022

Non, cela ne fonctionnera pas. Vous essayez de définir une classe en fonction d'elle-même. Tout ce que vous mettez dans les paramètres doit déjà être entièrement défini.

2voto

A. Bouchez Points 209

Que voulez-vous obtenir ?

Selon moi, les singletons sont diaboliques. Ils ont été introduits à cause d'une mauvaise conception OOP du C++ (pour l'accès aux flux d'entrée/sortie dans les applications de console, pour autant que je m'en souvienne). Et ils ont tendance à être très difficiles à maintenir.

On peut toujours s'en passer. Il ne s'agit absolument pas d'une méthode de programmation "classique Delphi", car Delphi ne souffre pas des problèmes liés au C++ que j'ai mentionnés.

Quelques (ab)usages du singleton dans les projets Java. Cherchez sur Google, et vous verrez ce que je veux dire.

Utiliser une propriété d'une classe commune avec un getter, initialiser une instance si le champ correspondant est encore nul, ou renvoyer directement le pointeur de champ à l'instance si elle a déjà été créée. Vous aurez la fonction singleton, avec de bonnes performances, un code agréable, une bonne pratique de la POO (pas de classe "globale"), et la possibilité d'exécuter la classe sans aucune fonction singleton, si vous n'avez pas besoin de cette fonction plus tard (à des fins de test, par exemple).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X