Скрытие без параметров Создать с повторным введением? - PullRequest
6 голосов
/ 18 ноября 2010

когда я начинал с Delphi, я читал, что единственный способ избежать бесполезных вызовов конструктора Create без параметров - это выбросить в него исключение или утверждение. Когда я впервые использовал ключевое слово reintroduce на этой неделе, я обнаружил, что оно, похоже, тоже решает эту проблему.

Test = class
private
    n_ : Integer;
public
    constructor Create(n : Integer); reintroduce;
end;

Вызов Test.Create дает мне желаемую ошибку компилятора. Есть ли проблемы с этим подходом?

Ответы [ 2 ]

4 голосов
/ 18 ноября 2010

Что ж, простая проблема: если вы повторно введете метод, он будет скрывать родительский метод (ы).Это должно быть именно то, что вы хотите, но проверьте этот код:

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 фактически отключило бы родительский класс в обычных обстоятельствах за пределами класса.В классе у вас все еще есть доступ к ним без предупреждений ...

1 голос
/ 18 ноября 2010

Если вы определяете конструктор с другой сигнатурой, вы фактически скрываете другой конструктор, отсюда и предупреждение.Директива reintroduce сообщает компилятору, что вы знаете, что вы делаете, поэтому он не показывает предупреждение.

Таким образом, единственный эффект заключается в том, что вы скрываете предыдущий конструктор.

Если вам нужно несколько вариантов конструктора, вы можете использовать директиву перегрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...