Как какой тип параметры без типа в классе TStringStream:
function Read(var Buffer; Count: Longint): Longint; override;
Каков тип Буферного параметра (действительно ли это - тип Указателя?).
Несколько лет назад я написал статью на эту тему:
Нетипизированные параметры используются в некоторых ситуациях; метод TStream.Read
, о котором вы спрашиваете, наиболее точно соответствует процедуре Move
, о которой я писал. Вот отрывок:
процедура Move (const Source; var Dest; Count: Integer);
Процедура
Move
копирует данные из произвольной переменной. в любую другую переменную. Он должен принимать источники и назначения все типы, что означает, что он не может требовать какого-либо одного типа. Процедура не изменяет значение переменной, переданной дляИсточник
, так что в объявлении параметра используетсяconst
вместоvar
, что является более распространенный модификатор для нетипизированных параметров.
В случае TStream.Read
источником является содержимое потока, поэтому вы не передаете его в качестве параметра, а местом назначения является ] Параметр буфера
, указанный в вопросе. Вы можете передать любой тип переменной для этого параметра, но это означает, что вам нужно быть осторожным. Это ваша задача, а не компилятор, чтобы убедиться, что содержимое потока действительно является допустимым значением для типа параметра, который вы предоставляете.
Прочтите оставшуюся часть моей статьи, чтобы узнать о других ситуациях, когда Delphi использует нетипизированные параметры.
var
в списке параметров - это синтаксис Delphi для вызова по ссылке . Его можно набрать как, например, параметр AllowChange в обработчике OnChanging в Listview:
procedure TSomeForm.LVOnChanging(Sender: TObject; ...; var AllowChange: Boolean);
begin
if SomeProblemOccurred then
AllowChange := False;
end;
или нетипизированный , как в вашем примере.
Обратитесь к справке Delphi для "Нетипизированных параметров"
Вы можете передать любой тип, но вы должны привести его в реализации. В справке указано, что вы не можете передать ему числовую или нетипизированную числовую константу. Итак, в основном вы должны знать, какого типа ожидать, а компилятор не может вам помочь, поэтому вам нужна веская причина, чтобы сделать это таким образом. Я полагаю, это может быть полезно, если вам нужен метод для обработки несовместимых типов, но, опять же, вы можете написать несколько перегруженных версий для каждого ожидаемого типа, я бы предложил это как лучшее решение.