Je n'ai pas une version suffisamment récente pour répondre directement à votre question, mais gardez à l'esprit qu'il ne vraiment importe si la classe est abstraite . Tout ce qui est fait, c'est que le compilateur vous empêche d'appeler un constructeur directement sur la classe. Si vous placez la référence de classe dans une variable de référence de classe, le compilateur vous permettra d'appeler le constructeur sur la variable, et lors de l'exécution, vous aurez une instance de la classe supposée instable.
var
c: TClass;
o: TObject;
begin
c := TMyAbstractClass;
o := c.Create;
Assert(o is TMyAbstractClass);
end;
Ce qui est vraiment important est si la classe a des méthodes abstraites. Vous pouvez vérifier cela assez facilement. Regardez dans le VMT de la classe. Tout emplacement de méthode virtuelle contenant un pointeur sur System._AbstractError
est une méthode abstraite. La partie la plus délicate est de savoir combien d'emplacements de méthodes virtuelles doivent être vérifiés, puisque cela n'est pas enregistré. Allen Bauer demonstrated how to do that dans une réponse à another question, mais dans les commentaires Mason Wheeler souligne qu'il peut retourner des valeurs plus grandes que ce qu'il devrait. Il mentionne la fonction GetVirtualMethodCount
du JCL, ce qui devrait donner un nombre plus précis de méthodes virtuelles définies par l'utilisateur. En utilisant cette fonction et GetVirtualMethod
, aussi du JCL, nous obtenons cette fonction:
function HasAbstractMethods(c: TClass): Boolean;
var
i: Integer;
begin
Result := True;
for i := 0 to Pred(GetVirtualMethodCount(c)) do
if GetVirtualMethod(c, i) = @_AbstractError then
exit;
Result := False;
end;
Si une classe abstraite n'a pas de méthode abstraite, alors comment abstraite peut-il vraiment? Il doit avoir été marqué abstrait pour empêcher les développeurs de créer des instances de celui-ci, mais si vous le souhaitez, vous pouvez en créer des instances, donc marquer une classe abstraite est vraiment plus un avertissement qu'une restriction réelle sur l'utilisation.
La réponse à cette question http://stackoverflow.com/questions/791004/how-can-i-detect-if-a-delphi-class-has-a-virtual-constructor pourrait vous aider. – RobS