Что ж, простая проблема: если вы повторно введете метод, он будет скрывать родительский метод (ы).Это должно быть именно то, что вы хотите, но проверьте этот код:
type
TClassParent = class
public
procedure DoSomething; overload;
procedure DoSomething(Something: Integer); overload;
end;
TClassChild = class(TClassParent)
public
procedure DoSomething(SomethingElse: string); reintroduce;
end;
var
Child: TClassChild;
begin
Child := TClassChild.Create;
Child.DoSomething;
Child.DoSomething(1024);
Child.DoSomething('Something');
Это дает вам две ошибки!Зачем?Потому что оба метода DoSomething в родительском объекте теперь скрыты!Иногда ты этого хочешь.В других случаях нет.А если нет, вам нужно снова добавить эти недостающие методы в дочерний класс, вызывая унаследованный метод следующим образом:
procedure TClassChild.DoSomething(SomethingElse: string);
begin
inherited DoSomething(SomethingElse);
end;
Опять же, это то, что вы хотите, верно?Скрытие всех родительских методов с одинаковыми именами.Только не забывайте, что вы все равно можете вызывать унаследованные методы.Также помните, когда вы связываете интерфейсы с родительским классом.Дочерний класс все еще будет поддерживать интерфейс, но вызов методов через интерфейс вместо объекта приведет к вызову родителя, а не ребенка!Повторное представление методов - хорошая практика, если вы хотите скрыть методы от родителя.Это также скрывает виртуальные методы с тем же именем!Обычно было бы лучше переопределить виртуальные методы, но при изменении списка параметров использование reintroduce фактически отключило бы родительский класс в обычных обстоятельствах за пределами класса.В классе у вас все еще есть доступ к ним без предупреждений ...