2017-02-24 11 views
0

私は別のリンクリストを実装する問題に取り組んでいます。すべてのリストクラスには2つの内部クラスが含まれています。 Node-classとIterator-classである。異なるリストクラスで同じ内部クラスを使用する方法は?

これらの内部クラスは完全に同一です。イテレータークラスでは、メソッドのいくつかは外部クラスからの情報へのアクセスに依存しています。これはうまく動作します。 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; 
    } 
} 

編集:

これは私のノードクラスがどのように見えるかである私は、Nodeクラスは、自身に完全に依存して実現しています。 inner classは、それを含むクラスの本質的な部分である、定義により

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

"というように、すべての異なるリストクラスに同じコードを含める必要はありません。もちろん、最上位クラスにするか、そうでなければそれらのクラスの外側でアクセス可能にしてください。 'neste'ではなく' next'を意味すると仮定すると、ここでは囲み参照を使わないので、クラスを静的にすることができます。 –

答えて

1

は、ここに私の簡単なイテレータです。これは、親クラスの階層外のピアまたはクラスではなく、サブクラスとのみ共有できます。

Nodeクラスには内部クラスであることが必要なものは何もないので、スタンドアロンにすることはできます。しかし、がの場合は、内部クラスにする必要がありました。が含まれていないすべての部分をスタンドアロンクラスに入れてから、各親クラスにサブクラス化して、親の内部データ。

など。 (おおよそ)

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クラスがスタンドアロンクラスである可能性があることを私がどのように認識していなかったかはわかりません。ほとんどのメソッドやフィールドは外部クラスへのアクセスに依存しているので、スーパーイテレータクラスを作成することで得られる効果はあまりありません。 – user2005142

+1

@ user2005142:そうだとは思いません。 'AbstractList'のプライベート' ListIterator'のように、イテレータクラスを持つコンテナのスーパークラスを使う方が良いでしょう。 –

関連する問題