2015-09-21 173 views
1

我想在所述類的方法內調用通用抽象類的構造函數。下面的代碼顯示了這一點:通用抽象類構造函數

public abstract class Node<T> { 
    public Collection <Node<T>> pars; 
    public Collection<Node<T>> interactors; 
    private boolean target = false; 
    private boolean multiple = false; 
    private T value; 

    //constructor for a simple node 
    public Node(T val){ 
     this.value = val; 
    } 

    //constructor for a multiple interaction node 
    public Node(Collection<Node<T>> inter, T val){ 
     this.interactors = inter; 
     this.value = val; 
     if (inter.size()>0){ 
      this.multiple = true; 
     } 
    } 

    public void find_inters(){ 
     ArrayList<Collection<T>> multi_interactions = search(); 
     for (int i = 0; i < multi_interactions.size(); i++){ 
      Node<T> a = new Node<T>(multi_interactions.get(i), this.value); <----i get compile error here 
     } 
    } 
} 

但我不斷收到一個錯誤,我不能實例化類型節點。我想在函數find_inters()中創建一個新的Node對象,但我不能。任何人都知道爲什麼/可能的解

+0

如果您需要實例化類型,爲什麼要使它成爲'abstract'? –

+0

簡單,因爲還有其他方法我不能實現,所以我必須使它們抽象。將刪除抽象允許我實例化一個節點? (因爲我總是可以找到抽象方法的解決方法) –

+0

是的,但是你不能有未實現的方法。 – zapl

回答

0

你說Node是抽象的,因爲你還沒有實現的一些方法,但問題是,你想Node<T> a成爲Node對象,但你必須決定什麼a實際上做當你調用這些方法時。

你可以沒有實現其所有方法的類 - 這是abstract類如何工作 - 但你不能有對象沒有所有的方法來實現,因爲對象可以有該方法稱爲,並且您的程序需要知道該怎麼做。

你可以做的是寫Node<T> a = new MySubNode<T>(...),其中MySubNodeNode所有填寫方法的子類。或者你可以寫Node<T> a = new Node<T>(...) { implementations of methods go here },這在本質上是一樣的東西,除了實現在一個匿名類。但是你不能實例化一個抽象類。

+0

我明白了,這很有道理。但是,我認爲抽象類的優點主要是寫抽象方法(或者不寫),我是否正確? –

+0

抽象類的要點是要有非抽象的子類實際填充這些方法,並且在大多數情況下,會有多個以不同方式填充這些方法的子類。抽象類中可能會實現一些常用的功能,或者只需要填充少量部分的骨架實現,但是抽象類沒有非抽象實現是相當無用的。 –

0

只是添加到路易的答案。如果search()是抽象的,則可以將其更改爲返回ArrayList<Node<T>>,因此實施類可以執行類似Node<T> a = new MySubNode<T>(...)(除非在其他位置需要使用search(),這需要ArrayList<Collection<T>>)。

+0

_「只是爲了增加路易斯的回答」_表示這應該是對路易斯答案的評論,而不是它自己的答案。 –

+0

是的,它應該是,但我沒有足夠的評論聲望(除了我自己的答案),而路易斯的回答是在我寫我自己的時候寫的。 –