Как скрыть защищенную процедуру объекта?

В одном базовом классе есть защищенная процедура. При наследовании этого класса я хочу скрыть эту процедуру от использования извне. Я попытался переопределить его изнутри частного и даже строго частного разделов, но он все еще может вызываться извне. Класс 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
Другие вопросы по тегам