在接口部分声明的参数化类型的方法不能使用局部符号



有人可以向我解释是什么原因,当创建一个泛型类,我必须移动我的私有常量到接口部分?这破坏了我的设计,我不想让别人看到应该是隐私的东西。

unit Unit38;
interface
uses
  Generics.Collections;
type
  TSimpleClass<T> = class(TObject)
  private
    procedure DoSomethingInternal(const SomeString: string);
  public
    procedure DoSomething;
  end;
implementation
const
  MyString = 'some string'; //Why this must be public?
{ TSimpleClass<T> }
procedure TSimpleClass<T>.DoSomething;
begin
  DoSomethingInternal(MyString); //Compiler error
end;
procedure TSimpleClass<T>.DoSomethingInternal(const SomeString: string);
begin
  //-------
end;
end.

谢谢。

同样的错误在D2010中,所以D2010的泛型修复没有解决这个问题。这是一个bug: http://qc.embarcadero.com/wc/qcmain.aspx?d=79747

修复于build 15.0.3863.33207。我想是XE

关于此的另一个QC是:http://qc.embarcadero.com/wc/qcmain.aspx?d=78022,它涉及一个enum,并且仍然打开。

顺便说一下,关于这个错误的文档不是很清楚。看到:

E2506在接口部分声明的参数化类型的方法不能使用局部符号'%s'

它涉及到一个泛型类中的类var,它不能在类的构造函数中被赋一个文字(!)值,修复方法是将构造函数参数化…不知道为什么,但我猜这与编译器的限制有关。

这是Delphi中泛型实现的结果。当您通过在另一个单元中提供具体的T来实例化一个类时,具体类的代码将被写入到另一个单元中。但是其他单元不能再看到您的私有字符串常量。这真是令人沮丧。

我对泛型实现的理解表明,Mikael的解决方案将解决这个问题,因为当您在另一个单元中实例化您的具体类型时,类const将是可见的。

不是答案,但可能的解决方法是在类声明中使用private const。

TSimpleClass<T> = class(TObject)
private
    procedure DoSomethingInternal(const SomeString: string);
    const MyString = 'some string'; //Why this must be public?
public
    procedure DoSomething;
end;

最新更新