Part1很简单,就跟之前写DList1和2一样,按照要求,按部就班的写就行。
Part2看了眼就跳过了,比较懒。
原以为Homework_4就要这么水过,但突然发现,看不懂part3。
于是,认真的又看了一遍S&B的Chapter 8...
也真正理解,为何用newOne这个看似多余的Method来写DList。
LockDListNode是DListNode的subclass,所以,所有用来remote control DListNode的reference Variable都可以用来remote control LockDListNode,只不过这时会少了Lock这个功能特性。怎么把return得到的DListNode再转化为我们真正需要的LockDListNode呢?或者说,怎么让这些披着DListNode外衣的LockDListNode恢复它真正的功能特性呢?用class cast。
LockDListNode aNode = (LockDListNode) node;
DListNode和LockDListNode唯一的区别即是这个Lock这个特性。其他基本功能性质都一样。
其他insertFront,insertBack等method不用override的原因是,这些method都调用了newOne这个method来construct new list。所以在LockDList中,我们只需要先override newOne这个method,让它每次construct的不是DListNode而是LockDListNode。
protected DListNode newNode(Object item, DListNode prev, DListNode next) {
return new LockDListNode(item, prev, next);
}
在最后,在override remove这个method,只需要加一个限制条件,即isLocked() is false才可以remove。
if (!aNode.isLocked())
精髓就在我着重的那句话。