Delphi 2006-例程参数非类型化
在一个例程中可以有一个参数,它可以同时是一个类型,也可以是一个字符串?我知道我可以通过重载一个例程来实现这一点,我问是否可以用另一种方式来实现Delphi 2006-例程参数非类型化,delphi,delphi-2006,Delphi,Delphi 2006,在一个例程中可以有一个参数,它可以同时是一个类型,也可以是一个字符串?我知道我可以通过重载一个例程来实现这一点,我问是否可以用另一种方式来实现 假设我有这个类型-TTest=(t1,t2,t3)。我希望有一个例程,它接受类型为TTest的参数,但同时又是一个字符串,因此我可以将其称为myproc(t1)或myproc('blablabla')您应该使用重载函数 你已经有了这个问题的完美解决方案,没有必要寻找其他方法来解决这个问题。您可以尝试使用一个函数来接收变体,但该函数也会接收任何表示以下内容
假设我有这个类型-TTest=(t1,t2,t3)。我希望有一个例程,它接受类型为TTest的参数,但同时又是一个字符串,因此我可以将其称为myproc(t1)或myproc('blablabla')您应该使用重载函数 你已经有了这个问题的完美解决方案,没有必要寻找其他方法来解决这个问题。您可以尝试使用一个函数来接收
变体
,但该函数也会接收任何表示以下内容也合法的内容:
myproc(0.5);
myproc(intf);
myproc(-666);
使用重载可以保持编译时类型的安全性,并且使用重载绝对不会失去通用性。您应该使用重载函数 你已经有了这个问题的完美解决方案,没有必要寻找其他方法来解决这个问题。您可以尝试使用一个函数来接收
变体
,但该函数也会接收任何表示以下内容也合法的内容:
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.
另外,我知道变体速度很慢,必须只在需要时使用。考虑到这是一个很好的练习,基于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.
另外,我知道变量的速度很慢,只能在需要时使用。请参阅文档中的。@sertac如果使用了非类型化参数,函数如何确定实际传递的类型?@David-我不在乎,这不是问题所在。他可以传递另一个参数(ThatsAString:Boolean)@Sertac,这与问题无关。所需的调用签名只有一个参数。@SertacAkyuz-请发布它,以便我可以对您的答案进行投票。请参阅文档中的内容。@sertac如果使用了非类型化的参数,函数将如何确定实际传递的类型?@David-我不在乎,这不是问题。他可以传递另一个参数(ThatsAString:Boolean)@Sertac,这与问题无关。所需的呼叫签名只有一个参数。@SertacAkyuz-请发布它,以便我可以投票表决您的答案。+1您是对的。我只是想做一个小练习,想找到另一种方法来做。我只想做一个小练习,找到另一种方法来做。@DavidHeffernan-它不是100%完美的。这只是一个简单的例子,Sertac的建议是,如果使用非类型化的参数,还可以传递一个参数来标识类型。另外,在我看来,变体的问题不是速度,而是缺少编译时类型检查。有时您需要运行时检查,但在本例中,我认为您需要编译时检查。另外,编写一些代码也做得很好。这提供了一个很好的环境来探索这些选项,并理解其利弊。此时,我需要一个小例子来向同事解释这一点。所以,这是一个又快又脏的:)。我同意你关于编译时类型检查的看法。@DavidHeffernan-它不是100%完美的。这只是一个简单的例子,Sertac的建议是,如果使用非类型化的参数,还可以传递一个参数来标识类型。另外,在我看来,变体的问题不是速度,而是缺少编译时类型检查。有时您需要运行时检查,但在本例中,我认为您需要编译时检查。另外,编写一些代码也做得很好。这提供了一个很好的环境来探索这些选项,并理解其利弊。此时,我需要一个小例子来向同事解释这一点。所以,这是一个又快又脏的:)。我同意你关于编译时类型检查的观点。