在例程中可以有一个参数,它可以同时是一个类型,或者一个字符串?我知道我可以通过重载一个例程来实现这一点,我问是否可以用另一种方式来做到这一点。
假设我有这种类型 - TTest = (t1,t2,t3)。我想要一个接受 TTest 类型参数的例程,但同时是一个字符串,所以我可以称它为 myproc(t1) 或 myproc('blabla')
在例程中可以有一个参数,它可以同时是一个类型,或者一个字符串?我知道我可以通过重载一个例程来实现这一点,我问是否可以用另一种方式来做到这一点。
假设我有这种类型 - TTest = (t1,t2,t3)。我想要一个接受 TTest 类型参数的例程,但同时是一个字符串,所以我可以称它为 myproc(t1) 或 myproc('blabla')
您应该使用重载函数。
您已经有了问题的完美解决方案,无需寻找其他方法来解决此问题。您可以尝试使用接收 a 的单个函数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.
我也知道变体很慢,只能在需要时使用。