Delphi/Паскаль: перегрузка конструктора с другим прототипом

У меня нет опыта с ksh, но я использовал и удар и zsh. Я предпочитаю zsh по удару из-за его поддержки очень мощного файла globbing, переменных модификаторов расширения и более быстрого заполнения клавишей Tab.

Вот быстрое введение: http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-shell-youll-ever-need/

20
задан David Dombrowsky 20 November 2009 в 23:58
поделиться

2 ответа

Попробуйте добавить повторно ввести перед второй перегрузкой , например это:

  TfrmEndoscopistSearch = class(TForm)
  public
    /// original constructor kept for compatibility
    constructor Create(AOwner : TComponent); overload; override;
    /// additional constructor allows for a caller-defined base data set
    constructor Create(AOwner : TComponent; ADataSet : TDataSet; ACaption : string = ''); reintroduce; overload;
  end;

Это компилируется в Turbo Delphi. Мне нужен был public , чтобы он скомпилировался, потому что перегрузка опубликованных методов ограничена.

19
ответ дан 29 November 2019 в 23:00
поделиться

Есть действительно простой способ избежать этого. Дайте вашему новому конструктору другое имя. В отличие от некоторых других популярных языков, Delphi имеет именованные конструкторы ; вам не обязательно называть их Create. Вы можете вызвать новый CreateWithDataset и вообще не мешать виртуальному конструктору Create.

TfrmEndoscopistSearch = class(TForm)
  /// original constructor kept for compatibility
  constructor Create(AOwner: TComponent); override;
  /// additional constructor allows for a caller-defined base data set
  constructor CreateWithDataset(AOwner: TComponent; ADataSet: TDataSet; ACaption: string = '');
end;

Фактически, если вы не создаете экземпляр этого класса полиморфно, вам даже не понадобится исходный конструктор. Вы можете объявить свой новый следующим образом:

TfrmEndoscopistSearch = class(TForm)
  /// additional constructor allows for a caller-defined base data set
  constructor Create(AOwner: TComponent; ADataSet: TDataSet; ACaption: string = ''); reintroduce;
end;

Попытка вызвать конструктор с одним аргументом непосредственно в TfrmEndoscopistSearch приведет к ошибке компиляции.


(Создание его полиморфно обычно требует использования Application.CreateForm:

Application.CreateForm(TfrmEndoscopistSearch, frmEndoscopistSearch);

Это всегда вызывает виртуальный конструктор с одним аргументом, представленный в TComponent. Если это ваша основная форма, вам не нужно этого делать. Я уже писал о своих чувствах в Application.CreateForm раньше.)

31
ответ дан 29 November 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: