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;
¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top