Предполагается ли, что в реализации методов могут отсутствовать аргументы?

Я сталкиваюсь с некоторыми распространенными ошибками IDE в Delphi XE2 (RAD Studio), но сами проблемы меня не беспокоят. Это результат одной из этих ошибок, которая заставила меня наткнуться на что-то еще.

Каким-то образом автодополнение решило уничтожить несколько методов формы, так что раньше...

procedure TForm1.Button1Click(Sender: TObject);

в реализации стало что-то вроде...

procedure TForm1.Buproced(Sendure :);

(не точно, но в какой-то степени так)

Итак, мне пришлось вручную исправить эти методы. Однако я случайно починил один из них на...

procedure TForm1.Button1Click;

хотя так и должно было быть...

procedure TForm1.Button1Click(Sender: TObject);

тем не менее, он все еще компилировался и работал нормально.

Для проверки запустите новое приложение VCL Forms и отбросьте только один элемент управления TButton, создайте обработчик событий для OnClick и измените его процедуру на...

procedure TForm1.Button1Click;
var
  B: TButton;
begin
  B:= TButton(Sender);
  B.Caption:= 'Something';
end;

Это должно быть возможно? Или, возможно, это ошибка IDE и/или компилятора?


person Jerry Dodge    schedule 28.07.2013    source источник
comment
Единственная причина исключения параметров, которую я могу понять, — это сокращение объема кода.   -  person Jerry Dodge    schedule 28.07.2013


Ответы (2)


В Delphi вы можете опустить параметры в реализации. Это не баг, это фича.

Надлежащая сигнатура метода оценивается объявлением в разделе интерфейса.

person nullptr    schedule 28.07.2013
comment
Я никогда не использовал эту функцию. Это очень вводит в заблуждение, когда вы читаете код. ИМХО, это слабость языка: я не вижу ни одной причины такого поведения, особенно с Delphi IDE, которая пишет код за вас (например, с помощью Ctrl+Shift+C из интерфейса). Во времена Turbo Pascal это могло иметь смысл... Сейчас просто сбивает с толку. - person Arnaud Bouchez; 28.07.2013
comment
@ArnaudBouchez, действительно слабость. Я никогда не видел причин (кроме лени) использовать эту функцию. Даже во времена Turbo Pascal. - person LU RD; 28.07.2013
comment
Действительно, я всегда использую автодополнение кода с тех пор, как оно у меня появилось, и с тех пор я никогда не писал реализацию метода класса без него. - person Jerry Dodge; 28.07.2013
comment
@Arnaud Причина в обслуживании. Изменения в списке параметров (или даже типе результата в случае функции!) могут быть сделаны в единственном объявлении в разделе интерфейса. Я никогда не использую его. - person NGLN; 29.07.2013
comment
Что мне не нравится в дополнении классов, так это то, что оно пропускает значения параметров по умолчанию в части реализации прототипов методов. Тогда вы не сможете увидеть, что определенный параметр имеет значение по умолчанию в первом представлении (если вы не заполните это значение параметра по умолчанию для прототипа самостоятельно). - person TLama; 29.07.2013
comment
@TLama: На самом деле, я предпочитаю, чтобы в реализации отсутствовали параметры по умолчанию. В самом моем коде не имеет большого значения, какие значения по умолчанию, и если я обнаружу, что мне нужно изменить значения по умолчанию во время обслуживания, тогда на одно место для поиска значений меньше. - person afrazier; 29.07.2013

Это намеренная и задокументированная функция языка. Это часть документации, описывающая эту функцию, с моим дополнительным акцентом:

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

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

person David Heffernan    schedule 29.07.2013