2015-07-28 100 views
1

我有两个类叫做“J48Tree”和“RandomTree”。它们都是“AbstractTree”的子类。 “J48Tree”和“RandomTree”有一个叫做“graph()”的方法,“AbstractTree”的其他子类没有这个方法。如何创建一个新的类来处理Java中的两个其他类?

上面的这些类和graph()方法来自现有的API。所以我不需要重写它们。

现在我想创建一个名为“可视化”的新类。该类可以接收“J48Tree”和“RandomTree”作为遗传输入数据。然后运行他们的“图形()”方法。

我试图

public class Visualization <T super J48Tree> 

public class Visualization <T extends AbstractTree> 

但它不工作。

我该如何解决这个问题?

在此先感谢。

+5

为您的两个类添加'Graphable'接口,并在'Visualization'类中使用''graph()'方法。 –

回答

1

正如Florian所说,您希望创建一个接口Graphable并使J48TreeRandomTree都能实现它。

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设置VisualizationGraphable实现。

编辑

从您的评论我知道你是不是能够做出既不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(); 
    } 
} 

,你会先有“包”一个J48Tree创造J48TreeWrapper一个实例,然后你使用它(与相同RandomTreeWrapper)调用setGraphable

public static void main(String[] args) { 
    J48TreeWrapper wrapper = new J48TreeWrapper(new J48Tree()); 
    Visualization visualization = new Visualization(); 
    visualization.setGraphable(wrapper); 
    visualization.graph(); 
} 
+0

Thx。 “J48Tree”,“RandomTree”,“AbstractTree”类和graph()方法来自现有的API。 “J48Tree”,“RandomTree”在API中已经有了graph()方法。所以我不需要重写它们。那我该怎么办? – Bluesea

+0

我真的需要一段时间来理解这一点。谢谢!!! – Bluesea

相关问题