2015-09-21 152 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

是的,它应该是,但我没有足够的评论声望(除了我自己的答案),而路易斯的回答是在我写我自己的时候写的。 –