2015-08-28 86 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; 
}