6

只是一个问题,我有:

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' 的声明与之前的声明不同

当然,我知道因为给出错误并且需要更改两个函数之一的名称(因为我之前很困惑)但我想知道是否有一些技巧或其他解决方案可以让这种情况没有错误。再次感谢。

4

5 回答 5

13

您可以将函数转换为带var参数的过程:

myclass = class
public
  procedure Funct1(var AResult: String); overload;
  procedure Funct1(var AResult: Integer); overload;
end;
于 2011-09-15T14:56:23.963 回答
12

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

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

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

var
  v: Variant;
  mc: myclass;
begin
  v := mc.Funct1;
end;
于 2011-09-15T10:53:45.927 回答
10

你发的东西没有意义。第一个示例应该可以毫无问题地编译,因为函数具有不同的名称Funct1Funct2

只有当方法(或函数)具有相同名称时才会出现问题。然后,通常情况下,overload指令会按顺序排列,但overload不能仅根据返回值区分函数

因此,假设名称相同,那么您想要的就是不可能的。如果它们没有不同的参数签名,则无法重载这些函数。你可以给他们起不同的名字,这无论如何都是可取的,因为他们显然做不同的事情。


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

于 2011-09-15T10:52:36.667 回答
5

如果要重载具有不同返回类型的方法,只需添加一个具有默认值的虚拟参数以允许重载执行,但不要忘记参数类型应该不同,以便重载逻辑起作用,例如:

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;

也不要忘记这样你会遇到这个例子中的变体问题:

procedure tester;
var yourobject : myclass;
  vValue: variant;
begin
  yourobject:= myclass.create;
  vValue:= yourobject.Funct1(); 
end;

直到您也实现了变体功能:

      function Funct1(dummy: Variant = Unassigned): Variant; overload;
于 2018-05-30T10:02:29.083 回答
3

如前所述,您不能按照自己的意愿去做。但是,您可以使用不同的名称(例如“AsInteger”或“AsString”)轻松实现每个函数。您的代码会更清晰,这通常是在 VCL 中完成的方式。

TmyClass = class (TObject)
public
  function AsString : string;
  function AsInteger : Integer;
end;
于 2011-09-15T14:51:04.447 回答