6

ただの質問です、私は持っています:

myclass = class
public
  function Funct1: String;
  function Funct2: Integer;
end;

それは私にエラーをもたらすので、私は試してみました:

myclass = class
public
  function Funct1: String; overload;
  function Funct2: Integer; overload;
end;

しかし同じ問題。デルフィはそれが同じパラメータを持っていると教えてくれます。さて、私は尋ねます、例のように同じ名前で異なる出力を持つより多くの機能を持つためにモードで行うことは可能ですか?助けてくれてありがとう。

アップデート

申し訳ありませんが、funct1とfunct2ではなく、funct1の両方でエラーが発生したため、次のようになります。

myclass = class
public
  function Funct1: String; overload;
  function Funct1: Integer; overload;
end;

そうすると、コンパイラは次のエラーを返します。

[DCCエラー]Project1.dpr(15):同じパラメーターを持つE2252メソッド'funct1'が既に存在します[DCCエラー]Project1.dpr(22):E2037'funct1'の宣言が以前の宣言と異なります

もちろん、エラーが発生し、両方の関数のいずれかに名前を変更する必要があるため(以前は混乱していました)、エラーなしでこのような状況を実現するためのトリックやその他の解決策があるかどうかを知りたいと思いました。再度、感謝します。

4

5 に答える 5

13

var関数をパラメーターを取るプロシージャーに変えることができます。

myclass = class
public
  procedure Funct1(var AResult: String); overload;
  procedure Funct1(var AResult: Integer); overload;
end;
于 2011-09-15T14:56:23.963 に答える
12

まず、関数をオーバーロードするには、同じ名前にする必要があります。

第二に、これは不可能です。オーバーロードされた関数には、異なるパラメーターが必要です。

あなたの場合、コンパイラがどの関数を呼び出すかを知る方法はありません (両方の名前が Funct1 に変更されていると仮定します):

var
  v: Variant;
  mc: myclass;
begin
  v := mc.Funct1;
end;
于 2011-09-15T10:53:45.927 に答える
10

あなたが投稿するものは意味がありません。関数の名前Funct1Funct2と異なるため、最初の例は問題なくコンパイルされます。

メソッド (または関数) が同じ名前を持つ場合にのみ問題が発生します。次に、通常、overloadディレクティブは適切ですが、overload戻り値だけでは関数を区別できません

したがって、名前が同じであると仮定すると、あなたが望むことは不可能です。これらの関数に別のパラメーター シグネチャがない場合、これらの関数をオーバーロードする方法はありません。それらに異なる名前を付けることができますが、明らかに異なることを行うため、とにかく好ましいです。


FWIW、あなたの質問は、実際に問題が発生している正確なコードを明らかに投稿していないという事実によって欠陥があります。問題の原因となっている正確なコードを常に投稿してください。また、エラー メッセージがある場合は、常に正確なエラー メッセージを投稿してください (通常は、IDE のほとんどの部分またはDelphi のメッセージ ダイアログ)。エラー メッセージに行番号がある場合は、投稿するソース コードでそれを示してください。必ずしも同じ行番号があるとは限りません。

于 2011-09-15T10:52:36.667 に答える
3

すでに述べたように、やりたいようにはできません。ただし、"AsInteger" や "AsString" などの別の名前で各関数を簡単に実装することもできます。コードはより明確になり、これは通常、VCL 内で行われる方法です。

TmyClass = class (TObject)
public
  function AsString : string;
  function AsInteger : Integer;
end;
于 2011-09-15T14:51:04.447 に答える