2016-10-27 12 views
0

これはおそらくかなり基本的な質問ですが、私が入っているクラスの別の部分から変数にアクセスできないようです。私はthis.p1、this.TwoParamRF.p1などを試しました。私はp1の価値を手に入れることができません。ありがとう。ネストされたクラスの変数へのアクセス

public class SecondMDP { 

    public SecondMDP(double p1, double p2) { 

     this.rf = new TwoParamRF(p1,p2); 

    } 

    public static class TwoParamRF implements RewardFunction { 
     double p1; 
     double p2; 

     public TwoParamRF(double p1, double p2) { 
      this.p1 = p1; 
      this.p2 = p2; 
     } 
    } 


    public String bestActions(double gamma) { 

     ValueIteration vi=computeValue(gamma); 
     alert(p1); //Getting error 
     alert(p2); //here 

    } 
} 
+3

フィールド宣言は表示されませんが、 'this.rf.p1'と' this.rf.p2'だけが必要です。 – 4castle

答えて

1

私は、私は午前のクラスの別の部分からの変数にアクセスできないようです。私は、this.TwoParamRF.p1、this.p1をしようとしたなどなどが、私は、P1の値を取得することはできません

の値はp1?その名前のメンバ変数を持つ静的なネストされたクラスがありますが、そのクラスのどのインスタンスにアクセスするかは不明です。

外部クラスのコンストラクタは、宣言されていない変数​​にクラスTwoParamRFの値を割り当てます。そのオブジェクトには、外部クラスのbestActions()メソッドが原則としてアクセスできるメンバーp1p2があります。しかし、それは唯一のタイプTwoParamRFの参照を経由して行うことができます - 変数​​ではなくRewardFunctionとして宣言されている場合、あなたはTwoParamRFにキャストする必要があります:

((TwoParamRF) rf).p1 

しかし、安全で入力していない、もちろん。あなたがのためのフォールバックを必要とし、その場合には、(instanceof経由など)それはあなたが常にそれがそもそもそのように宣言する必要があり、その場合にはTwoParamRF、こと​​に頼ることができる場合にのみ実行可能なアプローチだか、キャスト前にテストする場合テストが失敗したとき。

全体として、あなたのコードはリファクタリングを望んでいるようです。​​が実際RewardFunctionとして宣言されていると仮定すると、あなたは、使用するすべてのRewardFunction実装するための、そのクライアントのために宣言する必要がありますすることができますどのような方法を検討してください。 bestActions()の動作の一部もTwoParamRFに固有であり、その部分をTwoParamRFに移動する方法についても考慮してください。

+0

rfは本当にRewardFunctionとして宣言されていますので、キャストする必要がありました。私はそれを逃して、エラーはその方向に私を指摘しなかった。ありがとう – Rik

0

外部クラスとネストされた静的クラスの唯一の違いは、クラスプライベート静的フィールドへのアクセスです。それ以外の場合、アクセスルールは変わりません。フィールドp1p2はネストされたクラスのオブジェクトに属し、 "親"クラスのインスタンスからはアクセスできません。親クラスからTwoParamRFオブジェクトを参照する必要があります。ネストしたクラスのパラメータにのみ依存する場合は、bestActions()をネストされたクラスに入れることを検討する必要があります。

関連する問題