2017-02-11 7 views
0

私は要素のコレクションを持っており、要素の追加と削除の機能を分離したいので、それらの能力を持つ2つのクラスを作成しました。次に、リムーバークラスが加算器クラスのインスタンスを取得し、そのすべての要素をリムーバー自身のコレクションに転送できるようにします。例を見てみると、より多くの簡単に説明する:Javaで変数のスーパークラスのメンバーにアクセスしますか?

public class Super { 
    private Queue<E> elements; 

    public class Thrower { 
     public void throw(E e) { 
      elements.add(e); 
     } 

    public class Catcher { 
     public E catch() { 
      return elements.poll(); 
     } 

     public void transfer(Thrower t) { 
      elements.drainTo(Super.t.elements); 
     } 
    } 
} 

しかし、Super.t.elementsは動作しません。私はあなたがSuper.this.elementsのようなものをすることができるので、それができると考えました。

transfer()メソッドを実装できるうちに、私は追加/削除の分離を保つことができますか?

+0

Bとは何ですか? EとBの間には関係がありますか? –

+0

Ahhhh申し訳ありません...私はそれらをより記述的に改名し、その1つを忘れていました...固定しました – tribe1279

+1

AdderとRemoverをインターフェースしてSuperを実装する方が良い設計になると思います。 – Eelke

答えて

0

問題はThrowerSuperを拡張する必要があり、かつelementsThrowerSuper.elementsにアクセスすることができますので、を保護すべきであるということです。

public class Super { 
    protected Queue<E> elements; 

    public class Thrower extends Super { 
     public void thrower(E e) {//throw is a keyword 
      elements.add(e); 
     } 

     public class Catcher { 
      public E catcher() {//catch is a keyword 
       return elements.poll(); 
      } 

      public void transfer(Thrower t) { 
       elements.remove(t.elements);//replaced the drainTo 
      } 
     } 
    } 
} 

Super.t.elementsSuperプロパティtを持っていない、それが働いた場合でも、あなたは、引数として渡されたtを使用していないので、私にこの場合は動作しません。

+0

これはThrower/Catcherに要素のインスタンスを渡しませんか?だからスーパークラス ' – tribe1279

+0

はい、代わりに自分のものにアクセスしています。それはThowerの場合に当てはまります。 –

0

これらのメソッドをスーパークラスにも作成する必要があります。 保護されたメソッドを使用すると、それらを拡張クラスに使用することを制限できます。

addクラスとremoveメソッドを別々のクラスに分けることは、実際には分かりませんが、AddメソッドまたはRemoveメソッドのみを持つ「クラス」が必要な場合は、2つのインターフェイスを作成して両方を実装できますあなたの現在のスーパークラスと一緒に。ここで

は簡単な例です:

public interface Adder<E> { 
    void add(E element); 
} 

public interface Remover<E> { 
    void remove(E element); 
} 

そして、あなたのスーパークラスは次のようになります。あなたはそれだけでできる "インスタンス" を提供したい

public class YourClass implements Adder, Remover { 

    private Queue<E> elements; 

    public void add(E element) { 
    elements.add(element); 
    } 

    public void remove(E element) { 
    elements.remove(element); 
    } 
} 

削除または追加するが、同じリストを使用する:

YourClass myInstance = new YourClass(); //Doesn't matter just retrieve your instance 
Adder adder = (Adder) myInstance; //Only has "#add" method 
Remover remover = (Remover) myInstance; //Only has "#remove" method 

あなたの転送方法については、あなたが何をしたいのか正確には分かりませんが、このアプローチを使用する場合は、自分で実装することができます。

関連する問題