Как скрыть защищенную процедуру объекта?
В одном базовом классе есть защищенная процедура. При наследовании этого класса я хочу скрыть эту процедуру от использования извне. Я попытался переопределить его изнутри частного и даже строго частного разделов, но он все еще может вызываться извне. Класс Original не мой, поэтому я не могу изменить, как TOriginal
определено.
Можно ли скрыть эту процедуру в моем унаследованном классе? И как?
type
TOriginal = class(TObject)
protected
procedure SomeProc;
end;
TNew = class(TOriginal)
strict private
procedure SomeProc; override;
end;
2 ответа
Защищенные методы уже скрыты извне. (В основном; см. Ниже.) Вы не можете уменьшить видимость члена класса. Если базовый класс объявил метод защищенным, то все потомки этого класса могут использовать метод.
В Delphi другой код в том же модуле, что и класс, может обращаться к защищенным членам этого класса, даже к коду из не связанных классов. Иногда это может быть полезно, но обычно для обхода других недостатков дизайна. Если у вас есть что-то, что "действительно, действительно" должно быть защищено, вы можете сделать это строго защищенным, и тогда специальное правило доступа для одного и того же устройства не применяется.
Разобравшись, вы не можете скрыть это, но вы можете сделать это, чтобы определить, где он вызывается ограниченным образом.
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