我需要设计一个数据结构,它将被多次实现,但我遇到了问题。
由于我的数据结构需要有多个版本,因此我创建了一个抽象类,为所有实现奠定了基础。但是,数据结构也需要一些部分的集合视图。
问题变成如下:根据我的数据结构的不同实现,集合需要有不同的实现方法: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实现,作为内部类,这非常丑陋。