2017-02-11 6 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должны расширитьSuper и elementsдолжны быть защищены так 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 не работает I этот случай, потому что Super не обладает свойством t, и даже если он работал вы не используете t передается в качестве аргумента.

+0

Разве это не даст Thrower/Catcher свои собственные экземпляры элементов? Таким образом, он будет обращаться к своим, а не к суперклассу ' – tribe1279

+0

Да. Это будет иметь место для Thower. –

0

Вам также необходимо создать эти методы в суперклассе. Защищенные методы позволят вам ограничить использование этих классов.

Хотя я действительно не вижу смысла в разделении метода add и remove в разных классах. Если вы хотите «Классы», которые имеют только методы «Добавить или Удалить», вы могли бы просто создать для него два Интерфейса и реализовать оба с вашим текущим суперклассом.

Вот краткий пример:

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 

Что касается вашего метода передачи, я не совсем уверен, что вы хотите сделать, но я думаю, что вы можете реализовать его самостоятельно, если вы решите использовать этот подход.

Смежные вопросы