オーバーロード

オーバーロードは、名前の同じ関数や手続きの存在が許可されることを言います。例を見て見ましょう。

function MyFunc(i, j: Integer): Integer; overload;
begin
  ShowMessage('1番です');
  Result := i + j;
end;
  
function MyFunc(i: Integer; j: Double): Double; overload;
begin
  ShowMessage('2番です');
  Result := i + j;
end;
  
function MyFunc(i: Double; j: Integer): Double; overload;
begin
  ShowMessage('3番です');
  Result := i + j;
end;
  
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  d: Double;
begin
  i := MyFunc(10, 10);
  ShowMessage(IntToStr(i));
 
  d := MyFunc(2, 3.3);
  ShowMessage(FloatToStr(d));
 
  d := MyFunc(4.2, 3);
  ShowMessage(FloatToStr(d));
end;

関数の後ろに overload を付けてやればオーバーロードすることが出来ます。それぞれをどのように判断しているのかというと、それは引数で判断されています。 引数の数、型で違いを付けてやればコンパイラはどの関数、手続きを使えばよいのかを判断できます。

また、オーバーロード関数でデフォルト引数を使用すると、あいまいさが生じることがあります。

function MyFunc(i: Integer): Integer; overload;
begin
  Result := i * i;
end;
  
function MyFunc(i: Integer; j: Integer = 0): Integer; overload;
begin
  Result := i * j;
end;
  
procedure TForm1.Button1Click(Sender: TObject);
begin
  MyFunc(2, 3);
  MyFunc(5); // あいまい
end;

up next
Last update 2002/3/10