Нет. Невозможно заставить код, находящийся вне вашего контроля, , а не вызывать то, что в противном случае было бы совершенно доступно. Лучшее, что вы можете сделать, - это настоятельно не рекомендовать практику в документации к классу.
Каковы последствия, если потомок вызывает унаследованный метод? Если это значит, что программа перестает работать, то пусть будет так. Программист, который пишет класс-потомок, протестирует код, заметит, что он не работает, а затем сверится с документацией для метода, чтобы убедиться, что он использует его правильно (в этот момент он узнает, что это не так).
Вы могли бы пойти другим путем. Вместо того, чтобы делать функцию виртуальной и иметь потомки, переопределяющие ее, предоставьте свойство-указатель защищенного метода.
type
TGetFileImpl = procedure of object;
TAncestor = class
private
FGetFile: TGetFileImpl;
protected
property GetFileImpl: TGetFileImpl write FGetFile write FGetFile;
public
procedure GetFile; // not virtual.
end;
TDescendant = class(TAncestor)
private
procedure SpecializedGetFile;
public
constructor Create;
end;
procedure TAncestor.GetFile;
begin
if Assigned(GetFileImpl) then
GetFileImpl
else begin
// Do default implementation instead
end;
end;
constructor TDescendant.Create;
begin
GetFileImpl := SpecializedGetFile;
end;
Базовый класс предоставляет указатель на метод, который потомки могут назначить, чтобы указать, что они хотят иметь свою собственную специальную обработку. Если потомок предоставляет значение для этого свойства, то метод GetFile
базового класса будет использовать его. В противном случае он будет использовать стандартную реализацию. Определите TGetFileImpl
, чтобы соответствовать любой подписи GetFile
.