Как скрыть защищенную процедуру объекта? - PullRequest
7 голосов
/ 22 февраля 2012

В одном базовом классе есть защищенная процедура.При наследовании этого класса я хочу скрыть эту процедуру от использования извне.Я попытался переопределить его из приватных и даже строгих приватных секций, но его все равно можно вызвать извне.Класс Original не мой, поэтому я не могу изменить способ определения TOriginal.

Можно ли скрыть эту процедуру в моем унаследованном классе?И как?

type
  TOriginal = class(TObject)
  protected
    procedure SomeProc;
  end;

  TNew = class(TOriginal)
  strict private
    procedure SomeProc; override;
  end;

Ответы [ 2 ]

11 голосов
/ 22 февраля 2012

Защищенные методы уже скрыты снаружи. (В основном; см. Ниже.) Вы не можете уменьшить видимость члена класса. Если базовый класс объявил метод защищенным, то все потомки этого класса могут использовать метод.


В Delphi другой код в том же модуле, что и класс, может получить доступ к защищенным членам этого класса, даже код из не связанных классов. Иногда это может быть полезно, но обычно для обхода других недостатков дизайна. Если у вас есть что-то, что «действительно, действительно» должно быть защищено, вы можете сделать это строгим защищенным, и тогда специальное правило доступа для одного и того же устройства не применяется.

1 голос
/ 23 февраля 2012

Разобравшись, вы не можете скрыть это, но вы можете сделать это, чтобы определить, где он вызывается ограниченным образом

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
...