¿Cómo ocultar un procedimiento protegido de un objeto?
-
29-10-2019 - |
Pregunta
En una clase base, hay un protegido procedimiento. Al heredar esa clase, quiero ocultar ese procedimiento de ser utilizado desde el exterior. Intenté anularlo desde el interior del privado e incluso estricto privado secciones, pero aún se puede llamar desde el exterior. La clase original no es mía, así que no puedo cambiar cómo TOriginal
se define.
¿Es posible ocultar este procedimiento en mi clase heredada? ¿Y cómo?
type
TOriginal = class(TObject)
protected
procedure SomeProc;
end;
TNew = class(TOriginal)
strict private
procedure SomeProc; override;
end;
Solución
Los métodos protegidos son ya oculto desde el exterior. (Principalmente; ver más abajo). No puede reducir la visibilidad de un miembro de la clase. Si la clase base declaró el método protegido, entonces todos los descendientes de esa clase pueden usar el método.
En Delphi, otro código dentro de la misma unidad que una clase puede acceder a los miembros protegidos de esa clase, incluso el código de clases no relacionadas. Eso a veces puede ser útil, pero generalmente para trabajar en torno a otras deficiencias de diseño. Si tienes algo que se supone que "realmente" está protegido, puedes hacerlo estricto protegido, y luego la regla de acceso especial de la misma unidad no se aplica.
Otros consejos
Una vez expuesto, no puede ocultarlo, pero puede hacer esto para detectar a dónde se llama de manera limitada
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