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;
Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top