Delphi 使用相同的名称对函数/过程和实例函数/过程进行分类

Delphi 使用相同的名称对函数/过程和实例函数/过程进行分类,delphi,delphi-xe,Delphi,Delphi Xe,以这一类为例: unit u_myclass; interface type TMyClass = class public class function Foo : Integer; function Foo : Integer; end; implementation { TMyClass } class function TMyClass.Foo: Integer; begin Result := 10; end; function TMyClass

以这一类为例:

unit u_myclass;

interface

type
  TMyClass = class
  public
    class function Foo : Integer;
    function Foo : Integer;
  end;

implementation

{ TMyClass }
class function TMyClass.Foo: Integer;
begin
 Result := 10;
end;

function TMyClass.Foo: Integer;
begin
 Result := 1;
end;

end.
我想使用一个具有相同名称的类函数和一个实例函数。 遗憾的是,Delphi不喜欢这样,编译器会吐出这些错误:

[DCC Error] u_myclass.pas(9): E2252 Method 'Foo' with identical parameters already exists
[DCC Error] u_myclass.pas(20): E2037 Declaration of 'Foo' differs from previous declaration
[DCC Error] u_myclass.pas(9): E2065 Unsatisfied forward or external declaration: 'TMyClass.Foo'

我的问题:这是可能的还是仅仅是语言限制(我需要重命名这两种方法中的一种)?

我找到的唯一解决方案是使用重载和不同的参数:

unit u_myclass;

interface

type
  TMyClass = class
  public
    class function Foo(A : Integer) : Integer; overload;
    function Foo : Integer; overload;
  end;

implementation

{ TMyClass }
class function TMyClass.Foo(A: Integer): Integer;
begin
 Result := A;
end;

function TMyClass.Foo: Integer;
begin
 Result := 1;
end;

end.

我找到的唯一解决方案是使用重载和不同的参数:

unit u_myclass;

interface

type
  TMyClass = class
  public
    class function Foo(A : Integer) : Integer; overload;
    function Foo : Integer; overload;
  end;

implementation

{ TMyClass }
class function TMyClass.Foo(A: Integer): Integer;
begin
 Result := A;
end;

function TMyClass.Foo: Integer;
begin
 Result := 1;
end;

end.

实例方法和类方法不能使用相同的名称。这是不允许的,因为编译器在某些场景中无法区分它们

例如,如果您编写:

procedure TMyClass.Bar;
begin
  Foo;
end;

然后,编译器无法确定是否要调用类方法或实例方法。

不可能为实例方法和类方法指定相同的名称。这是不允许的,因为编译器在某些场景中无法区分它们

例如,如果您编写:

procedure TMyClass.Bar;
begin
  Foo;
end;


然后编译器无法确定您是否希望调用类方法或实例方法。

AFAIK,这是不可能的。编译器如何知道要调用哪个函数?当你调用一个类函数时,这可能是显而易见的,但当你在一个实例上调用它时,情况就不是这样了。您试图实现的是IMO滥用函数重载;编译器不允许它才是好的。@whosrdaddy-只是出于好奇。。。为什么?你为什么要那样做?我的意思是,拥有一个同名的类和一个实例函数有什么好处?@mg30rg,因为我不得不这么做。现有的代码库有instance方法,而将其移动到class方法意味着我需要重写很多代码,这在目前是不可行的。编译器如何知道要调用哪个函数?当你调用一个类函数时,这可能是显而易见的,但当你在一个实例上调用它时,情况就不是这样了。您试图实现的是IMO滥用函数重载;编译器不允许它才是好的。@whosrdaddy-只是出于好奇。。。为什么?你为什么要那样做?我的意思是,拥有一个同名的类和一个实例函数有什么好处?@mg30rg,因为我不得不这么做。现有的代码库具有实例方法,而将其移动到类方法意味着我将需要重写大量目前不可行的代码。这几乎不是一个解决方案。您很难合理地期望调用者传递将被忽略的额外参数。@DavidHeffernan:在我的实际用例中,这将是我的解决方案:)真的。您将要求调用者传递一个值被忽略的参数?@DavidHeffernan:示例代码没有反映我的真实情况。在我的例子中,参数是必需的,所以它不会被忽略:)好吧,这会改变很多事情。我认为你的答案建议添加一个将被忽略的参数有点奇怪。我知道你的真实世界是不同的,但我们在这里不考虑这一点。就是你问的问题。不管怎样,我想一切都很清楚。这很难解决问题。您很难合理地期望调用者传递将被忽略的额外参数。@DavidHeffernan:在我的实际用例中,这将是我的解决方案:)真的。您将要求调用者传递一个值被忽略的参数?@DavidHeffernan:示例代码没有反映我的真实情况。在我的例子中,参数是必需的,所以它不会被忽略:)好吧,这会改变很多事情。我认为你的答案建议添加一个将被忽略的参数有点奇怪。我知道你的真实世界是不同的,但我们在这里不考虑这一点。就是你问的问题。不管怎样,我想一切都很清楚。是的,@Uwerabe已经指出了这一点。只是想确定:)是的,@Uwerabe已经指出了这一点。只是想确定一下:)