2017-02-11 34 views
0

我有一個元素集合,並希望分開添加和刪除元素的能力,所以我用這些能力創建了兩個類。然後,我還希望卸妝類能夠獲取加法器類的實例並將其所有元素轉移到卸妝器自己的集合中。綜觀例子很多更容易解釋它:在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對不起......我將它們改名爲更具描述性,並且忘記了其中一個...修正了 – tribe1279

+1

對我來說,這似乎是一個更好的設計,必須接口Adder和Remover並讓Super實現這些。 – Eelke

回答

0

的問題是,Thrower必須擴展Superelements應當受到保護所以Thrower可以訪問Super.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.elements不工作,我這種情況是因爲Super沒有財產t,即使它不使用作爲參數傳遞的t工作。

+0

難道這不會給Thrower/Catcher他們自己的元素嗎?所以它會訪問他們的而不是超級' – tribe1279

+0

是的。 Thower就是這種情況。 –

0

您還需要在超類中創建這些方法。 受保護的方法將允許您限制使用這些方法來擴展類。

雖然我真的沒有看到在不同類中分離add和remove方法的重點 - 如果你想要只有Add或Remove方法的「Classes」,你可以爲它創建兩個接口並實現這兩個接口與你目前的超類。

這裏有一個簡單的例子:

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 

至於你的轉移方法,我不完全確定你想要做什麼,但我認爲你可以自己實現它,如果你決定使用這種方法。