在例程中可以有一个参数,它可以同时是一个类型,也可以是一个字符串?我知道我可以通过重载例程来实现这一点,我想是否有可能以另一种方式完成它。
假设我有这种类型 - TTest =(t1,t2,t3)。我希望有一个例程接受TTest类型的参数,但同时也是一个String,所以我可以称之为myproc(t1)或myproc('blabla')
答案 0 :(得分:5)
您应该使用重载功能。
您已经拥有完美的问题解决方案,无需寻找其他方法。您可以尝试使用接收Variant
的单个函数,但该函数也会收到任何意味着以下内容也是合法的:
myproc(0.5);
myproc(intf);
myproc(-666);
使用重载可以保持编译时类型的安全性,并且在使用过载时绝对不会失去一般性。
答案 1 :(得分: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.
我也知道Variants很慢,必须只使用它。