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已经指出了这一点。只是想确定一下:)