Salut,
j'ai un petit soucis avec des constructeurs virtuels surchargé.
Le contexte :
voici un code d'exemple avec les déclarations des différents constructeurs :
L'objectif :
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 program ConstructeurVirtuelSurcharge; {$APPTYPE CONSOLE} uses SysUtils; type TMere=Class public constructor Create(A:String;S:String);Overload;Virtual; constructor Create; reintroduce; overload; virtual; //constructor Create(A:String;B:Integer);Overload;Virtual;Abstract; //constructor Create(A:String;B:Pointer);Overload;Virtual;Abstract; end; TFille = class(TMere) public constructor Create(A:String;B:Integer);reintroduce;Overload; end; TFils = class(TMere) public constructor Create(A:String;B:Pointer);reintroduce;Overload; end; TPetiteFille = class(TFille) public constructor Create(A:String;B:Double);reintroduce;Overload; end; TMereClass = Class of TMere; TFilleClass = Class of TFille; TPetiteFilleClass = Class of TPetiteFille; { TMere } constructor TMere.Create; begin end; constructor TMere.Create(A:String;S:String); begin end; { TFille } constructor TFille.Create(A:String;B:Integer); begin end; { TFils } constructor TFils.Create(A: String; B: Pointer); begin end; { TPetitEnfant } constructor TPetiteFille.Create(A: String; B: Double); begin end; var clsOfTMere :TMereClass; clsOfTFille :TFilleClass; R:TMere; begin R:=TFille.create('S',Integer(1)); //Create de TFille R.free; R:=TFille.create('S','S1');//Create de TMere R.free; { code à simplifier if type='fils' then R:=TFils.Create('S',1) //Create de TFils then R:=TFille.Create('S',1) //Create de TFille } clsOfTMere:=TFille; R:=ClsOfTMere.Create('S','S2'); //Create de TMere R.Free; //Erreur à la compilation : //There is no overloaded version of 'create' that can be called with these arguments (E2250) R:=ClsOfTMere.Create('S',1); // Create de TFille //Un cast TFille(ClsOfTMere) fonctionne mais ne simplifie pas le code R.Free; clsOfTMere:=TFils; R:=ClsOfTMere.Create('S','S2'); //Create de TMere R.Free; //Erreur identique à la compilation R:=ClsOfTMere.Create('S',Nil); //Create de TFils //R.Free; clsOfTFille :=TFille; R:=ClsOfTFille.Create('S','S2');//Create de TMere R.Free; R:=ClsOfTFille.Create('S',1);//Create de TFille R.Free; end.
J'aimerais modifié un code existant ressemblant à qq chose comme
en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if type='fils' then R:=TFils.Create('S',1) //Create de TFils then R:=TFille.Create('S',1) //Create de TFille
Je pensais que l'utilisation d'une référence de classe pouvait m'aider à simplifier ce code mais sur un appel de constructeur surchargé déclaré dans une classe dérivée, j'ai l'erreur suivante à la compilation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 type TMereClass = Class of TMere; ... if type='fils' then clsOfTMere:=TFils then clsOfTMere:=TFille, ClsOfTMere.Create('S',1) //Create de TFils ou de TFille
Un cast TFille(ClsOfTMere).create(...) fonctionne mais ne simplifie pas le code.There is no overloaded version of 'create' that can be called with these arguments (E2250)
Comment résoudre ce cas, ie. utiliser de maniére générique un constructeur virtuel surchargé déclaré dans des classes dérivées ?
L'ajout dans la classe ancêtre (TMere) des prototypes suivants:
régle le probléme mais dans mon contexte je ne peux pas modifier la classe ancêtre existante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 constructor Create(A:String;B:Integer);Overload;Virtual;Abstract; constructor Create(A:String;B:Pointer);Overload;Virtual;Abstract;
J'utilise Delphi 2006 qui permet l'usage de ClassHelper mais je préfére éviter cette solution.
J'ai bien peur que cela soit insoluble, à moins que...
En espérant avoir été assez clair.
Partager