2015-09-21 4 views
1

Я пытаюсь вызвать конструктор для общего абстрактного класса в рамках метода указанного класса. Нижеприведенный код показывает следующее:Generic abstract class constructor

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 
     } 
    } 
} 

, но я продолжаю получать сообщение об ошибке, что я не могу создать экземпляр типа Node. Я хочу создать новый объект Node внутри функции find_inters(), но я не могу. Кто-нибудь знает, почему/возможные решения?

+0

Если вам нужно создать экземпляр типа, зачем делать его «абстрактным»? –

+0

простой, потому что есть другие методы, которые я не могу реализовать, поэтому я должен сделать их абстрактными. Удалит ли абстракцию, позвольте мне создать экземпляр узла? (потому что я всегда могу найти обходное решение для абстрактных методов) –

+0

да, но тогда у вас не может быть невыполненных методов. – zapl

ответ

0

Вы сказали, что Node является абстрактным, потому что вы пока не можете выполнить некоторые из методов, но проблема заключается в том, что вы хотите Node<T> a быть Node объект, но вы должны решить, что a будет на самом деле когда вы вызываете эти методы.

Вы можете иметь классы, которые не имеют все свои методы, реализованные - вот как работают abstract классов - но вы не можете иметь объектов, которые не выполнены все их методы, потому что объект может иметь этот метод называется, и ваша программа должна знать, что делать.

Что вы можете сделать, это написать Node<T> a = new MySubNode<T>(...), где MySubNode подкласс Node со всеми методами заполненными. Или вы можете написать Node<T> a = new Node<T>(...) { implementations of methods go here }, которая, по существу, то же самое, за исключением того, реализация в анонимном классе. Но вы не можете создать абстрактный класс.

+0

Я вижу, это имеет большой смысл.Но могу ли я сказать, что преимущество абстрактного класса в основном заключается в том, чтобы писать абстрактные методы (или не писать)? –

+0

Точка абстрактного класса состоит в том, чтобы иметь не абстрактные подклассы, которые фактически заполняют эти методы, и в большинстве случаев будет множество подклассов, которые будут различать эти методы по-разному. В абстрактном классе могут быть некоторые общие функции, или реализация скелета, которая требует только нескольких частей, но абстрактный класс без не абстрактных реализаций довольно бесполезен. –

0

Просто добавьте ответ Луи. Если search() является абстрактным, вы можете изменить его, чтобы вернуть ArrayList<Node<T>>, поэтому классы-реализации могут делать что-то вроде Node<T> a = new MySubNode<T>(...) (если поиск() не используется в другом месте, где требуется ArrayList<Collection<T>>).

+0

_ «Просто чтобы добавить к ответу Луи» _ указывает, что это должен быть комментарий к ответу Луи, а не его собственный ответ. –

+0

Да, это должно было быть, но у меня пока нет достаточной репутации, чтобы прокомментировать (помимо моих собственных ответов), и ответ Луи пришел, когда я писал свои собственные. –