2017-02-24 43 views
0

我正在处理一个问题,我实现了不同的链接列表。所有的列表类都包含两个内部类;一个Node类和一个Iterator类。如何在不同的List类中使用相同的内部类?

这些内部类彼此完全相同。在Iterator类中,一些方法依赖于从外部类访问信息,这很好。有没有办法在java中这样做,所以我不需要在我所有不同的列表类中包含相同的代码?我感到无能为力 - 我只是不知道在哪里寻找。

这是我的节点类是什么样子:

class Node{ 
    Node next; 
    Node previous; 
    private T data; 

    Node(T inn){ 
     data = inn; 
    } 

    public Node getNesteNode(){ 
     return next; 
    } 
    public T getData(){ 
     return data; 
    } 
} 

编辑:我意识到节点类本身完全依赖。

这里是我的简单的迭代器:

class LenkeListeIterator implements Iterator<T>{ 
    private int field = 0; 
    Node denne = forste; 

    @Override 
    public boolean hasNext() { 

     return field!= storrelse(); 
    } 

    @Override 
    public T next() { 

     T data = denne.getData(); 
     denne = denne.getNesteNode(); 
     field++; 
     return data; 
    } 
} 
+0

你可以让它们不是内部类。 – khelwood

+1

“,这样我就不需要在我所有不同的列表类中包含非常相同的代码”当然,使它成为顶级类,或者在其他类之外访问。假设你的意思是'next'而不是'neste',那么你不用在这里使用封闭引用,所以你可以让这个类变为静态的。 –

回答

1

根据定义,inner class包含它的类的一个内在组成部分。它只能与子类共享,而不能完全与父类层次结构之外的对等体或类共享。

您的Node类中没有任何内容需要它是内部类,因此您可以将其设置为独立。但是,如果有因为它需要成为内部类,那么可以将所有不是的部分放入独立类中,然后在每个父类中对其进行子类化,以使其可以访问父母的内在数据。

E.g. (大致)

abstract class Example { 
    protected int something; 

    public void logic() { 
     SomeType data = this.getParentData(); 
     /* ...do something with `data`... */ 
    } 

    abstract protected SomeType getParentData(); 
} 

如果是,比方说,Container内部类将子类它和提供getParentData

class Container { 
    private SomeType data; 

    class ContainerExample extends Example { 
     protected SomeType getParentData() { 
      return data; 
     } 
    } 
} 
+0

是的,谢谢!我不知道我怎么没有意识到Node-class可能是一个独立的类。虽然大多数方法和字段都依赖于对外部类的访问,但看起来并没有太大的好处。 – user2005142

+1

@ user2005142:是的,可能不是。最好使用带有迭代器类的容器的超类(比如'AbstractList'的私有'ListIterator')。 –

相关问题