我有一个元素集合,想要分开添加和删除元素的能力,所以我用这些能力制作了两个类。然后我还希望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()
方法吗?
答案 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
至于你的转学方法,我不确定你想做什么,但我认为如果你决定使用这种方法,你可以自己实施。