2015-07-28 96 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

相關問題