ルーチンに、同時にタイプ、文字列のいずれかであるパラメーターを含めることは可能ですか? ルーチンをオーバーロードすることでこれを達成できることはわかっていますが、別の方法でそれを行うことができるかどうか尋ねます.
この型があるとします - TTest = (t1,t2,t3)。タイプ TTest のパラメーターを受け入れるルーチンが必要ですが、同時に文字列になるため、myproc(t1) または myproc('blabla') と呼ぶことができます。
ルーチンに、同時にタイプ、文字列のいずれかであるパラメーターを含めることは可能ですか? ルーチンをオーバーロードすることでこれを達成できることはわかっていますが、別の方法でそれを行うことができるかどうか尋ねます.
この型があるとします - TTest = (t1,t2,t3)。タイプ TTest のパラメーターを受け入れるルーチンが必要ですが、同時に文字列になるため、myproc(t1) または myproc('blabla') と呼ぶことができます。
オーバーロードされた関数を使用する必要があります。
問題に対する完全な解決策はすでにあり、これを行う別の方法を探す必要はありません。を受け取る単一の関数を試すこともできますVariant
が、その関数は何でも受け取ります。つまり、次も有効です。
myproc(0.5);
myproc(intf);
myproc(-666);
オーバーロードを使用すると、コンパイル時の型の安全性を維持でき、オーバーロードを使用しても一般性が失われることはまったくありません。
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.
また、バリアントは遅く、必要な場合にのみ使用する必要があることも知っています。