2015-08-28 87 views
1

下面是基類相關代碼DblyLinkList,用於DblyLinkListhere完整代碼,如何在派生的內部類中編寫構造函數?

package JavaCollections.list; 

public class DblyLinkList<T> implements Iterable<T>{ 

    protected DListNode<T> sentinel; 
    protected int size; 

    class DListNode<T> { 
     private T item; 
     private DListNode<T> prev; 
     private DListNode<T> next; 

     DListNode(T item, DListNode<T> p, DListNode<T> n) { 
      this.item = item; 
      this.prev = p; 
      this.next = n; 
     } 
    } 

    DListNode<T> newNode(T item, DListNode<T> prev, DListNode<T> next) { 
     return new DListNode(item, prev, next); 
    } 

    public DblyLinkList() { 
     this.sentinel = this.newNode(null, this.sentinel, this.sentinel); 
    } 

    ......... 
} 

下面是在同一個包中引入的類LockableList中,設定lock字段作爲false爲每個節點創建。要刪除LockableNode節點,將使用remove()方法檢查lock字段的值。

在調用super(item, p, n);錯誤The constructor DblyLinkList<T>.DListNode<T>(T, DblyLinkList<T>.DListNode<T>, DblyLinkList<T>.DListNode<T>) is undefined

我怎樣寫在下面派生LockableList.LockableNode類的構造函數可以被重寫的方法newNode被稱爲?

package JavaCollections.list; 

import JavaCollections.list.DblyLinkList.DListNode; 

public class LockableList<T> extends DblyLinkList<T> { 

    class LockableNode<T> extends DListNode<T>{ 
     /** 
     * Do not lock the node during creation of a node. 
     */ 
     private boolean lock; 

     LockableNode(T item, DblyLinkList<T>.DListNode<T> p, 
         DblyLinkList<T>.DListNode<T> n) { 
      super(item, p, n); //this does not work 
      this.lock = false; 
     } 
    } 

    @Override 
    LockableNode<T> newNode(T item, DListNode<T> prev, DListNode<T> next) { 
     //return new LockableNode(item, prev, next); //How do i call the constructor? 
    } 

    public LockableList(){ 
     this.sentinel = this.newNode(null, this.sentinel, this.sentinel); 
    } 

    ........ 
} 

注:這是一個繼承和封裝鍛鍊

+1

嘗試以下操作:'類LockableNode 擴展DblyLinkList .DListNode {...' – A4L

+0

如果您更具體地描述問題而不是'這不起作用',這將有所幫助。您的編譯器/ IDE報告是否提供錯誤消息?這是運行時行爲,不能像你期望的那樣工作? – dsh

+0

@ A4L正如你所說,我做了改變它正在工作。爲什麼它工作? – overexchange

回答

0

你沒有給contstructor一個acces level,則默認爲:

Modifier Class Package  Subclass World 
no modifier  Y   Y   N  N 

這被稱爲包-private,並且即使內部子類在同一個包中,該構造子也不可訪問。發生這種情況是因爲它是內部類,所以即使子類可以訪問super(),內部類也不會。

所以:

public class LockableList<T> extends DblyLinkList<T> { 

    LockableList() { 
     super(); //this work 
    } 

    class LockableNode<T> extends DListNode<T>{ 
     LockableNode(T item, DblyLinkList<T>.DListNode<T> p, DblyLinkList<T>.DListNode<T> n) { 
     super(item, p, n); //this does not work 
    } 
} 

如果聲明的DblyLinkList公共或受保護的將是從內部類訪問的構造函數。

protected DListNode<T> newNode(T item, DListNode<T> prev, DListNode<T> next) { 
    return new DListNode(item, prev, next); 
} 

Modifier Class Package  Subclass World 
public   Y   Y   Y  Y 
protected  Y   Y   Y  N 

檢查也this question澄清有關訪問級別在Java

+0

增加多少行代碼@RobbyCornelissen?因爲你的溶劑本身無法工作...... –

+2

問題與訪問修飾符無關。這是被陰影化的類型參數。 –

+1

@RobbyCornelissen首先確保'DblyLinkList'類的所有訪問級別和設計都很好。正在查詢中粘貼「DblyLinkList」類的鏈接。我已經檢查過codereview.SE上的'DblyLinkList'類 – overexchange

0

試試這個:

LockableNode(T item, DListNode<T> p, 
      DListNode<T> n) { 
     super(item, p, n); 
     this.lock = false; 
}