繁体   English   中英

如何在派生内部类中编写构造函数?

[英]How to write constructor in derived inner class?

以下是基类相关代码DblyLinkList此处DblyLinkList类的完整代码,

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引入的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);
    }

    ........
}

注意:这是继承和封装的练习

您没有给const访问者授予acces等级 ,那么默认情况下:

Modifier    Class   Package     Subclass    World
no modifier     Y         Y            N        N

这称为package-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的构造DblyLinkList public或protected,则可以从内部类访问它。

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

还请检查此问题以澄清有关Java访问级别的信息

尝试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM