Comment masquer une procédure protégée d'un objet?
-
29-10-2019 - |
Question
Dans une classe de base, il y a une procédure protected .Lors de l'héritage de cette classe, je souhaite empêcher que cette procédure ne soit utilisée de l'extérieur.J'ai essayé de le remplacer depuis les sections private et même strict private , mais il peut toujours être appelé de l'extérieur.La classe Original n'est pas la mienne, donc je ne peux pas changer la façon dont TOriginal
est défini.
Est-il possible de masquer cette procédure dans ma classe héritée?Et comment?
type
TOriginal = class(TObject)
protected
procedure SomeProc;
end;
TNew = class(TOriginal)
strict private
procedure SomeProc; override;
end;
La solution
Les méthodes protégées sont déjà masquées de l'extérieur.(Surtout; voir ci-dessous.) Vous ne pouvez pas réduire la visibilité d'un membre de classe.Si la classe de base a déclaré la méthode protégée, alors tous les descendants de cette classe peuvent utiliser la méthode.
Dans Delphi, un autre code de la même unité qu'une classe peut accéder aux membres protégés de cette classe, même du code provenant de classes non liées.Cela peut parfois être utile, mais généralement pour contourner d'autres défauts de conception.Si vous avez quelque chose qui est "vraiment, vraiment" censé être protégé, vous pouvez le rendre strict protégé, puis la règle spéciale d'accès à la même unité ne s'applique pas.
Autres conseils
Une fois exposé, vous ne pouvez pas le cacher mais vous pouvez le faire pour repérer où il est appelé de manière limitée
TOriginalClass = class
public
procedure Foo;
end;
TNewClass = class(TOriginalClass)
public
procedure Foo; reintroduce;
end;
implementation
procedure TNewClass.Foo;
begin
Assert(False, 'Do not call Foo from this class');
inherited Foo;
end;
var Obj: TNewClass;
Obj := TNewClass.Create;
Obj.Foo; // get assert message
Will not get Assert error if declared as TOriginalClass
var Obj: TOriginalClass;
Obj := TNewClass.Create;
Obj.Foo; // Never get the assert message