Почему Delphi допускает неправильные параметры конструктора?

Это может показаться действительно глупым вопросом, но я не знаю, почему это даже разрешено компилировать:

program ConstructorWithParam;
{$APPTYPE CONSOLE}
uses
 System.SysUtils;
type
 TThing = class(TObject)
 private
 FParent: TObject;
 public
 constructor Create(const AParent: TObject);
 end;
{ TThing }
constructor TThing.Create; // <- WTF? Why does the compiler not complain?
begin
 FParent := AParent;
end;
var
 Thing: TThing;
begin
 try
 Thing := TThing.Create(TObject.Create);
 Readln;
 except
 on E: Exception do
 Writeln(E.ClassName, ': ', E.Message);
 end;
end.

Я использую Delphi XE5 и не тестировался в других версиях. Спасибо.

1 ответ

Предполагается, что первое объявление в классе формы является правильным. Версия реализации не нуждается в определении необходимых параметров; они взяты из первоначальной декларации. Это часть самого языка.

Вот хороший пример, иллюстрирующий точку:

type
 TMyClass = class (Tobject)
 procedure DoSometimg(DoA, DoB: Boolean);
 end;

Реализация:

procedure TMyClass.DoSomething; // Note both parameters missing
begin
 if DoA then // Note not mentioned in implementation declaration
 DoOneThing; // but still can be used here
 if DoB then
 DoAnotherThing;
end;

Я лично предпочитаю совпадение как деклараций реализации, так и интерфейсов, поскольку упрощает идентификацию параметров, не перескакивая столько же в редакторе кода.

licensed under cc by-sa 3.0 with attribution.