0

ルーチンに、同時にタイプ、文字列のいずれかであるパラメーターを含めることは可能ですか? ルーチンをオーバーロードすることでこれを達成できることはわかっていますが、別の方法でそれを行うことができるかどうか尋ねます.

この型があるとします - TTest = (t1,t2,t3)。タイプ TTest のパラメーターを受け入れるルーチンが必要ですが、同時に文字列になるため、myproc(t1) または myproc('blabla') と呼ぶことができます。

4

2 に答える 2

5

オーバーロードされた関数を使用する必要があります。

問題に対する完全な解決策はすでにあり、これを行う別の方法を探す必要はありません。を受け取る単一の関数を試すこともできますVariantが、その関数は何でも受け取ります。つまり、次も有効です。

myproc(0.5);
myproc(intf);
myproc(-666);

オーバーロードを使用すると、コンパイル時の型の安全性を維持でき、オーバーロードを使用しても一般性が失われることはまったくありません。

于 2012-04-27T12:02:47.030 に答える
0

David Hefferman と Sertac Akyuz の回答に基づいて、両方のソリューションをテストするための小さな例を作成しました。完璧ではなく、両方の可能性を示しているだけです。

unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  ttest = (t1,t2);
  TForm4 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function my(aVar:Variant):String;
    function MyUntype(const aVar):String;
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

{ TForm4 }

procedure TForm4.FormCreate(Sender: TObject);
var aTestTypeVar : ttest;
    aString : String;
begin
 my(t1);
 my(t2);
 my('ssss');
//with untyped params
 aString := 'aaaa';
 MyUntype(aString);
 aTestTypeVar := t1;
 aString := IntToStr(Ord(aTestTypeVar));
 MyUntype(aString);//can not be a numeral due to delphi Help
end;

function TForm4.my(aVar: Variant): String;
begin
 showmessage(VarToStr(aVar));//shows either the string, either position in type
end;

function TForm4.MyUntype(const aVar): String;
begin
 //need to cast the parameter  
 try
  ShowMessage(pchar(aVar))
 except
  showmessage(IntToStr(Ord(ttest(aVar))));
 end;
end;

end.

また、バリアントは遅く、必要な場合にのみ使用する必要があることも知っています。

于 2012-04-27T12:53:34.043 に答える