2017-02-11 33 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 

至于你的转移方法,我不完全确定你想要做什么,但我认为你可以自己实现它,如果你决定使用这种方法。