如何根据结果类型重载函数?

时间:2011-09-15 10:42:45

标签: delphi overloading delphi-xe2

只是一个问题,我有:

myclass = class
public
  function Funct1: String;
  function Funct2: Integer;
end;

它让我感到错误,所以我尝试过:

myclass = class
public
  function Funct1: String; overload;
  function Funct2: Integer; overload;
end;

但同样的问题; delphi告诉我有相同的参数。 现在,我问,是否可以在模式下执行具有相同名称但具有不同输出的更多功能,如示例中所示? 非常感谢您的帮助。

更新

对不起,我做错了,不是funct1和funct2,但两个都是funct1,所以:

myclass = class
public
  function Funct1: String; overload;
  function Funct1: Integer; overload;
end;

这样做,编译器会给我这个错误:

[DCC错误] Project1.dpr(15):E2252具有相同参数的方法'funct1'已存在 [DCC错误] Project1.dpr(22):E2037'funct1'的声明与之前的声明不同

当然,我知道因为错误并需要更改两个功能之一的名称(因为我之前感到困惑)但我想知道是否有一些技巧或其他解决方案,因为这样没有错误的情况。 再次感谢。

5 个答案:

答案 0 :(得分:10)

首先,对于要重载的函数,必须将它们命名为相同。

其次,这是不可能做到的。重载函数必须具有不同的参数。

在您的情况下,编译器无法确定要调用哪些函数(假设两者都重命名为Funct1):

var
  v: Variant;
  mc: myclass;
begin
  v := mc.Funct1;
end;

答案 1 :(得分:10)

您可以将该功能转换为采用var参数的程序:

myclass = class
public
  procedure Funct1(var AResult: String); overload;
  procedure Funct1(var AResult: Integer); overload;
end;

答案 2 :(得分:9)

你发布的内容没有意义。第一个示例应该编译没有任何问题,因为函数具有不同的名称 Funct1 Funct2

仅当方法(或函数)具有相同名称时才会出现问题。然后,通常情况下,overload指令会有序,但 overload无法区分返回值上的函数

因此,假设名称相同,您想要的是不可能的。如果这些函数没有不同的参数签名,则无法重载这些函数。你可以给他们不同的名字,这是最好的,因为他们显然做了不同的事情。


FWIW,你的问题是有缺陷的,因为你显然没有发布你实际遇到问题的确切代码。请始终发布导致问题的确切代码,如果有错误消息,请始终发布确切的错误消息(通常可以使用通常的复制按键复制它们,例如Ctrl + C,即使在IDE的大多数部分或Delphi中的消息对话框)。如果错误消息中有任何行号,请在您发布的源代码中注明,因为我们并不总是拥有与您相同的行号。

答案 3 :(得分:2)

如前所述,你不能像你想要的那样去做。但是,您可以使用不同的名称轻松实现每个函数,例如“AsInteger”或“AsString”。您的代码将更清晰,这通常是在VCL中完成的方式。

TmyClass = class (TObject)
public
  function AsString : string;
  function AsInteger : Integer;
end;

答案 4 :(得分:1)

如果你想重载具有不同返回类型的方法,只需添加一个带有默认值虚拟参数来允许重载执行,但不要忘记参数类型应该是不同的,所以过载逻辑的工作原理如下:

type    
    myclass = class
    public
      function Funct1(dummy: string = EmptyStr): String; overload;
      function Funct1(dummy: Integer = -1): Integer; overload;
    end;

像这样使用

procedure tester;
var yourobject : myclass;
  iValue: integer;
  sValue: string;
begin
  yourobject:= myclass.create;
  iValue:= yourobject.Funct1(); //this will call the func with integer result
  sValue:= yourobject.Funct1(); //this will call the func with string result
end;