【发布时间】:2013-09-02 13:58:20
【问题描述】:
我必须设计一个可以多次实现的数据结构,但我遇到了一个问题。
由于我的数据结构需要有多个版本,因此我创建了一个抽象类,为所有实现奠定了基础。但是,数据结构也需要某些部分的集合视图。
问题变成如下:集合需要有不同的实现,具体取决于我的数据结构的实现:HashSet 或 Collections.SingletonSet。然后,当从集合中添加或删除项目时,这两个实现数据结构将扩展其中的位以执行其他任务。但是,抽象数据结构还需要一种从内部删除该集合中的元素的方法,这样就不会完成这些额外的工作。为此,我想在集合中添加一个受保护的方法,但我不能!
为了说明,这里有一些与我正在创建的数据结构类型相关的示例代码:
public abstract class AbstractEdge {
public abstract AbstractSetView destination(); //Gives a subclass of AbstractSetView in implementations.
public void doStuff() {
destination().removeInternal(foo);
}
public abstract class AbstractSetView implements Set<Vertex> {
protected abstract void removeInternal(Vertex vert);
}
}
public class Edge extends AbstractEdge {
public SetView destination() {
return new SetView();
}
public class SetView extends AbstractSetView,Collections.SingletonSet<Vertex> { //Doesn't work this way.
protected void removeInternal(Vertex vert) {
//Do stuff.
}
}
}
public class HyperEdge extends AbstractEdge {
public SetView destination() {
return new SetView();
}
public class SetView extends AbstractSetView,HashSet<Vertex> { //Doesn't work this way.
protected void removeInternal(Vertex vert) {
//Do stuff.
}
}
}
这些是我考虑过的选项:
- 如上所述,不允许从多个类进行扩展。
- 将 AbstractSetView 设为接口会导致 removeInternal() 方法公开,这是不可取的。
- 使 SetView 仅扩展 AbstractSetView 并自己实现所有内容...两次。但这需要我基本上包含 HashSet 和 SingletonSet 实现,作为一个内部类,这非常难看。
Java 的设计者肯定已经解决了这个问题,让我能够使用他们内置的 Set 实现?我忽略了什么?
【问题讨论】:
标签: java inheritance interface abstract protected