有人可以向我解释原因在创建泛型类时我必须将我的私有constans移动到接口部分吗?这是在扼杀我的设计,我不希望别人看到应该是私密的东西。
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.
感谢。
答案 0 :(得分:5)
D2010中的错误相同,因此D2010的泛型修复程序没有解决这个问题。这是一个错误:http://qc.embarcadero.com/wc/qcmain.aspx?d=79747
已在构建15.0.3863.33207中修复。我认为是XE
另一个QC是:http://qc.embarcadero.com/wc/qcmain.aspx?d=78022涉及枚举但仍处于打开状态。
顺便提一下,关于错误的文档并不是很清楚。参见:
E2506 Method of parameterized type declared in interface section must not use local symbol '%s'
它涉及泛型类中的类var,不能在类的构造函数中赋予文字(!)值,修复是参数化构造函数...不知道为什么,但我猜它与编译器限制。
答案 1 :(得分:3)
这是Delphi中泛型实现的结果。当您通过在另一个单元中提供具体T来实例化类时,具体类的代码将写入该另一个单元。但是其他单位再也看不到你的私有字符串不变了。这令人沮丧。
我对泛型实现的理解表明,Mikael的解决方法将解决问题,因为当您在另一个单元中实例化具体类型时,类const将是可见的。
答案 2 :(得分:3)
不是答案,但可能的解决方法可能是在类声明中使用私有const。
TSimpleClass<T> = class(TObject)
private
procedure DoSomethingInternal(const SomeString: string);
const MyString = 'some string'; //Why this must be public?
public
procedure DoSomething;
end;
这适用于Delphi 2010,XE和XE2,而不适用于Delphi 2009。