Delphi/pascal: le fait de surcharger un constructeur à un autre prototype
Je suis en train de créer une classe enfant de TForm avec
- spéciale constructeur pour certains cas, et
- un constructeur par défaut qui permettra de maintenir la compatibilité avec le code actuel.
C'est le code que j'ai maintenant:
interface
TfrmEndoscopistSearch = class(TForm)
public
/// original constructor kept for compatibility
constructor Create(AOwner : TComponent); overload; override;
/// additional constructor allows for a caller-defined base data set
constructor Create(AOwner : TComponent; ADataSet : TDataSet; ACaption : string = ''); overload;
end;
Il semble fonctionner, mais je reçois toujours le message d'avertissement du compilateur:
[Avertissement] test.pas(44): la Méthode de "Créer" des peaux de méthode virtuelle de la base type 'TCustomForm'
- L'ajout de "surcharge;" après le deuxième constructeur ne compile pas. "[Erreur] test.pas(44): la Déclaration de "Créer" se distingue de la précédente déclaration".
- en faisant le deuxième constructeur d'une classe de la fonction compile sans erreurs ou des avertissements, mais meurt avec une violation d'accès lors de l'exécution (tous les membres de vars est nul).
OriginalL'auteur David Dombrowsky | 2009-11-18
Vous devez vous connecter pour publier un commentaire.
Essayez d'ajouter
reintroduce
avant la secondeoverload
, comme ceci:Cette compile de Turbo Delphi. J'avais besoin de la
public
à faire compiler, car la surcharge depublished
méthodes est limitée.OriginalL'auteur Uli Gerhardt
Il y a vraiment un moyen facile d'éviter cela. Donner à votre nouveau constructeur un nom différent. Contrairement à certains autres langues populaires, Delphi a nommé constructeurs; vous n'avez pas à appeler à Créer. Vous pouvez appeler votre nouveau CreateWithDataset et ne pas interférer avec le virtuel Créer constructeur.
En fait, sauf si vous êtes l'instanciation de cette classe polymorphically, vous n'avez même pas besoin de l'original de constructeur. Vous pouvez déclarer votre nouveau comme ceci:
Tente d'appeler l'un argument constructeur directement sur TfrmEndoscopistSearch produirait une erreur de compilation.
(Création polymorphically entraînerait généralement à l'aide de l'Application.CreateForm:
Qui appelle toujours un argument virtuel constructeur introduit dans TComponent. Sauf si c'est votre formulaire principal, vous n'avez pas besoin de le faire. J'ai écrit au sujet de mes sentiments sur Demande.CreateForm avant.)
OriginalL'auteur Rob Kennedy
Cela devrait faire l'affaire
OriginalL'auteur Radacina