问题描述
我有两个类,分别为“ J48Tree”和“ RandomTree”。 它们都是“ AbstractTree”的子类。
“ J48Tree”和“ RandomTree”具有称为“ graph()”的方法,“ AbstractTree”的其他子类没有此方法。
以上这些类和graph()方法来自现有的API。 所以我不需要重写它们。
现在,我想创建一个名为“ Visualization”的新类。 此类可以接收“ J48Tree”和“ RandomTree”作为遗传输入数据。 然后运行他们的“ graph()”方法。
我试过了
public class Visualization <T super J48Tree>
和
public class Visualization <T extends AbstractTree>
但这是行不通的。
我该如何解决这个问题?
提前致谢。
1楼
您可以看一下策略设计模式: :
寻找适合您提到的场景,因为需要根据传递的输入对象在运行时确定行为(方法)。
2楼
正如Florian所说,您想创建一个Graphable
接口,并使J48Tree
和RandomTree
实现它。
public interface Graphable {
void graph();
}
public class J48Tree extends AbstractTree implements Graphable {
@Override
public void graph() {
// implementation
}
}
public class RandomTree extends AbstractTree implements Graphable {
@Override
public void graph() {
// implementation
}
}
public class Visualization {
private Graphable graphable;
public void setGraphable(Graphable graphable) {
this.graphable = graphable;
}
public void graph() {
this.graphable.graph();
}
}
然后,可以通过调用setGraphable
在Visualization
类上设置Graphable
实现。
编辑
根据您的评论,我知道您无法使J48Tree
和RandomTree
实现Graphable
接口(这是您必须对类进行的唯一更改)。
在这种情况下,您应该将每个类的实例“包装”到另一个实现Graphable
类(包装器)中。
public interface Graphable {
void graph();
}
public class J48TreeWrapper implements Graphable {
private final J48Tree j48Tree;
public J48TreeWrapper(J48Tree j48Tree) {
this.j48Tree = j48Tree;
}
@Override
public void graph() {
this.j48Tree.graph();
}
}
public class RandomTreeWrapper implements Graphable {
private final RandomTree randomTree;
public RandomTreeWrapper(RandomTree andomTree) {
this.randomTree = randomTree;
}
@Override
public void graph() {
this.randomTree.graph();
}
}
public class Visualization {
private Graphable graphable;
public void setGraphable(Graphable graphable) {
this.graphable = graphable;
}
public void graph() {
this.graphable.graph();
}
}
现在,你必须首先创建一个实例J48TreeWrapper
是“包装”一个J48Tree
,然后调用setGraphable
使用它(与相同RandomTreeWrapper
)。
public static void main(String[] args) {
J48TreeWrapper wrapper = new J48TreeWrapper(new J48Tree());
Visualization visualization = new Visualization();
visualization.setGraphable(wrapper);
visualization.graph();
}