0

在例程中可以有一个参数,它可以同时是一个类型,或者一个字符串?我知道我可以通过重载一个例程来实现这一点,我问是否可以用另一种方式来做到这一点。

假设我有这种类型 - TTest = (t1,t2,t3)。我想要一个接受 TTest 类型参数的例程,但同时是一个字符串,所以我可以称它为 myproc(t1) 或 myproc('blabla')

4

2 回答 2

5

您应该使用重载函数。

您已经有了问题的完美解决方案,无需寻找其他方法来解决此问题。您可以尝试使用接收 a 的单个函数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 回答