在Java中访问变量的超类的成员?

时间:2017-02-11 09:31:07

标签: java inner-classes access super

我有一个元素集合,想要分开添加和删除元素的能力,所以我用这些能力制作了两个类。然后我还希望remover类能够获取adder类的实例并将其所有元素传递给remover自己的集合。看一下这个例子可以更容易地解释它:

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()方法吗?

2 个答案:

答案 0 :(得分: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在这种情况下不起作用,因为Super没有属性t,即使它有效,也没有使用t作为参数传递

答案 1 :(得分:0)

您还需要在超类中创建这些方法。 受保护的方法允许您限制使用这些方法来扩展类。

虽然我并没有真正看到在不同的类中分离add和remove方法的重点 - 如果你想要&#34; Classes&#34;只有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);
  }
}

当你想提供&#34;实例&#34;只能删除或添加但使用相同的列表使用此:

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

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