Je travaille sur des tutoriels à la fois dans Delphi et Lazarus. J'utilise Delphi 10.1 Berlin Update 2 et Lazarus 1.6.2.Pourquoi un constructeur valide dans Delphi échoue dans Lazarus?
Les constructeurs suivants fonctionnent dans Delphi, mais le constructeur de la classe TDog
échoue dans Lazarus avec une erreur "identificateur en double".
Tous les tutoriels et les forums que j'ai cherché ressemblent à ceci ne devrait pas être un problème.
unit Animal;
interface
uses
classes;
type
TAnimal = class
private
FName: String;
FBrain: Integer;
FBody: Integer;
FSize: Integer;
FWeight: Integer;
public
constructor create(Name: String; Brain, Body, Size, Weight: Integer);
procedure Eat; virtual;
property Name: String read FName;
property Brain: Integer read FBrain;
property Body: Integer read FBody;
property Size: Integer read FSize;
property Weight: Integer read FWeight;
end;
implementation
constructor TAnimal.create(Name: String; Brain, Body, Size, Weight: Integer);
begin
FName:= Name;
FBrain:= Brain;
FBody:= Body;
FSize:= Size;
FWeight:= Weight;
end;
procedure TAnimal.Eat;
begin
Writeln('TAnimal.eat called');
end;
end.
unit Dog;
interface
uses
classes,
Animal;
type
TDog = class (TAnimal)
private
FEyes: Integer;
FLegs: Integer;
FTeeth: Integer;
FTail: Integer;
FCoat: String;
procedure Chew;
public
constructor create(Name: String; Size, Weight, Eyes, Legs,
Teeth, Tail: integer; Coat: String);
procedure Eat; override;
end;
implementation
//following fails in Lazarus
constructor TDog.create(Name: String; Size, Weight, Eyes, Legs,
Teeth, Tail: integer; Coat: String);
//this works, changing implementation also
//constructor Create(aName: String; aSize, aWeight, Eyes, Legs,
// Teeth, Tail: integer; Coat: String);
begin
inherited Create(Name, 1, 1, Size, Weight);
FEyes:= Eyes;
FLegs:= Legs;
FTeeth:= Teeth;
FTail:= Tail;
FCoat:= Coat;
end;
procedure TDog.Chew;
begin
Writeln('TDog.chew called');
end;
procedure TDog.Eat;
begin
inherited;
Writeln('TDog.eat called');
chew;
end;
end.
Puisque vous dupliquez le même nom de constructeur avec des paramètres de différence, vous devez soit réintroduire le constructeur, soit utiliser '{$ mode delphi}'. –
Merci pour les réponses. J'ai essayé le {$ mode delphi} et ça a fait l'affaire. reintroduce n'a eu aucun effet, et aucun ne permettrait d'utiliser le nom de la classe (Dog) comme variable d'instance. Même si tout fonctionne bien dans Delphi, je vais garder tout unique à partir de maintenant. Il semble juste commun dans Java & C# de nommer les variables d'instance de classe en minuscules après le nom de la classe car les langues sont sensibles à la casse. –