Delphi: la Compréhension des constructeurs

je suis à la recherche de comprendre

  • virtuel
  • remplacer
  • surcharge
  • réintroduire

lorsqu'il est appliqué à l'objet des constructeurs. Chaque fois que j'ajoutez des mots-clés jusqu'à ce que le compilateur s'arrête et (après 12 ans de développement de Delphi), je préfère savoir ce que je fais, plutôt que de tenter des choses au hasard.

Donné un hypothétique ensemble d'objets:

TComputer = class(TObject)
public
    constructor Create(Cup: Integer); virtual;
end;

TCellPhone = class(TComputer)
public
    constructor Create(Cup: Integer; Teapot: string); virtual;
end;

TiPhone = class(TCellPhone)
public
    constructor Create(Cup: Integer); override;
    constructor Create(Cup: Integer; Teapot: string); override;
end;

La façon dont je veux qu'ils se comportent est probablement évident, à partir des déclarations, mais:

  • TComputer a la simple constructeur, et les descendants pouvez la remplacer
  • TCellPhone a un autre constructeur, et les descendants pouvez la remplacer
  • TiPhone remplace les deux constructeurs, l'appel de la version héritée de chaque

Maintenant que le code ne compile pas. je veux comprendre pourquoi il ne fonctionne pas. je tiens également à comprendre la bonne façon de remplacer les constructeurs. Ou peut-être que vous ne pourrait jamais remplacer les constructeurs? Ou peut-être qu'il est parfaitement acceptable de remplacer les constructeurs? Peut-être que vous ne devriez jamais avoir plusieurs constructeurs, peut-être qu'il est parfaitement acceptable d'avoir plusieurs constructeurs.

je veux comprendre la pourquoi. Fixation il serait alors évident.

Voir aussi

Edit: je suis également à la recherche pour obtenir un certain raisonnement sur l'ordre de virtual, override, overload, reintroduce. Parce que lorsque l'on essaie toutes les combinaisons de mots-clés, le nombre de combinaisons explose:

  • virtuel; surcharge;
  • virtuel; override;
  • remplacer; surcharge;
  • remplacer; virtual;
  • virtuel; override; surcharge;
  • virtuel; surcharge; override;
  • surcharge; virtual; override;
  • remplacer; virtual; surcharge;
  • remplacer; surcharge; virtual;
  • surcharge; override; virtual;
  • etc

Edit 2: je suppose que nous devrions commencer par "est la hiérarchie de l'objet même possible?" Si non, pourquoi pas? Par exemple, est-il fondamentalement incorrect d'avoir un constructeur à partir d'un ancêtre?

TComputer = class(TObject)
public
    constructor Create(Cup: Integer); virtual;
end;

TCellPhone = class(TComputer)
public
    constructor Create(Cup: Integer; Teapot: string); virtual;
end;

je m'attends à ce que TCellPhone a maintenant deux constructeurs. Mais je ne trouve pas la combinaison de mots-clés dans Delphi pour vous, il pense que c'est une bonne chose à faire. Je suis fondamentalement tort de penser que je peux avoir deux constructeurs ici dans TCellPhone?


Remarque: Tout en dessous de cette ligne n'est pas strictement nécessaire pour répondre à la
question - mais peut aider à expliquer
ma pensée. Peut-être vous pouvez le voir,
basé sur mon processus de pensée, ce qui
pièce essentielle, je suis absent que
tout devient clair.

Maintenant ces déclarations ne compile pas:

//Method Create hides virtual method of base type TComputer:
TCellPhone = class(TComputer)
   constructor Create(Cup: Integer; Teapot: string);  virtual;

//Method Create hides virtual method of base type TCellPhone:
TiPhone = class(TCellPhone)
public
   constructor Create(Cup: Integer); override;
   constructor Create(Cup: Integer; Teapot: string); overload;  <--------
end;

Alors d'abord je vais essayer de fixation TCellPhone. je vais commencer par hasard ajout de la overload mot-clé (je sais que je ne veux pas reintroduce parce que ce serait de masquer les autres constructeurs, je ne veux pas):

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer; Teapot: string); virtual; overload;
end;

Mais qui échoue: Field definition not allowed after methods or properties.

je sais par expérience que, même si je n'ai pas un champ après une méthode ou une propriété, si j'inverse l'ordre des virtual et overload mots-clés: Delphi taire:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer; Teapot: string); overload; virtual; 
end;

Mais j'ai toujours l'erreur:

Méthode de "Créer" des peaux de méthode virtuelle de la base type 'TComputer'

Donc j'ai essayer d'enlever les deux mots clés:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer; Teapot: string);
end;

Mais j'ai toujours l'erreur:

Méthode de "Créer" des peaux de méthode virtuelle de la base type 'TComputer'

Donc je me résigne à maintenant essayer reintroduce:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer; Teapot: string); reintroduce;
end;

Et maintenant TCellPhone compile, mais il a fait des choses bien pire pour TiPhone:

TiPhone = class(TCellPhone)
public
   constructor Create(Cup: Integer); override; <-----cannot override a static method
   constructor Create(Cup: Integer; Teapot: string); override; <-----cannot override a static method
end;

Les deux sont à se plaindre que je ne peut pas les remplacer, j'ai donc supprimer le override mot-clé:

TiPhone = class(TCellPhone)
public
   constructor Create(Cup: Integer);
   constructor Create(Cup: Integer; Teapot: string);
end;

Mais maintenant le 2ème créer, dit-il, doivent être marqués avec la surcharge, ce que je fais (en fait, je vais le marquer à la fois que la surcharge de travail, car je sais ce qui va arriver si je n'ai pas):

TiPhone = class(TCellPhone)
public
   constructor Create(Cup: Integer); overload;
   constructor Create(Cup: Integer; Teapot: string); overload;
end;

Tous tout est bon dans le interface section. Malheureusement, mon implémentations ne fonctionne pas. Mon seul paramètre du constructeur de TiPhone ne peut pas appeler le constructeur hérité:

constructor TiPhone.Create(Cup: Integer);
begin
    inherited Create(Cup); <---- Not enough actual parameters
end;
  • À partir de Delphi 9 de l'aide: les déclarations de Méthode peuvent inclure des directives spéciales qui ne sont pas utilisés avec d'autres fonctions ou procédures. Les Directives devraient apparaître dans la déclaration de classe, pas dans la définition de la déclaration, et doit toujours être énumérés dans l'ordre suivant: reintroduce; overload; reliure; convention d'appel; abstract; avertissement, où la liaison est virtual, dynamic, ou override; convention d'appel est register, pascal, cdecl, stdcall, ou safecall; et d'avertissement est platform, deprecated, ou library.
  • Delphi 5 encore est venu avec un excellent niveau de Langue écrite Guide expliquant ces déclarations dans les détails.
  • Essayez TCellPhone.Créer(Cup); au lieu de l'héritage de Créer(Cup);
InformationsquelleAutor Ian Boyd | 2010-10-06