2011-10-26 23 views
9

汎用クラスを作成するときにプライベートconstansをインタフェースセクションに移動する必要がある理由は何ですか?これは私のデザインを殺している、私は他人が私的でなければならない何かを見ることを望んでいない。E2506インタフェースセクションで宣言されたパラメータ化された型のメソッドはローカルシンボルを使用してはならない

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. 

ありがとうございます。

答えて

5

D2010で同じエラーが発生したため、D2010のジェネリックの修正ではこれに対処できませんでした。バグです:http://qc.embarcadero.com/wc/qcmain.aspx?d=79747

ビルド15.0.3863.33207で修正されました。私が思うのはXE

もう1つの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が含まれ、コンストラクタをparameretrizeするという修正...なぜノーアイデア、コンパイラの制限と関係していると思います。

+0

デルファイ2009年にあなたのマージャンありがとうございません。 – Wodzu

+0

[QualityCentralは現在シャットダウンされました](https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward)、これ以上 'qc.embarcadero.com'リンクにアクセスすることはできません。古いQCデータにアクセスする必要がある場合は、[QCScraper](http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/)を参照してください。 –

3

これはDelphiのジェネリックス実装の結果です。コンクリートTを別のユニットに供給してクラスをインスタンス化すると、そのコンクリートクラスのコードがその別のユニットに書き込まれます。しかし、他のユニットはプライベート文字列定数を見ることができません。むしろイライラします。

ジェネリックの実装を理解すると、別のユニットで具体的な型をインスタンス化するときにクラスconstが表示されるため、Mikaelの回避策が問題を解決することを示唆しています。

2

答えはありませんが、考えられる回避策は、クラス宣言でprivate constを使用することです。これは、Delphi 2010、XEとXE2で動作

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

は、

+0

ありがとうございました。回避策は+1です。 – Wodzu

関連する問題