Quote Originariamente inviata da Bombonera Visualizza il messaggio
Perché utilizzare una interfaccia quando posso passare per parametro un riferimento ad un elemento di tipo DNode ?
Se noti, i metodi che ricevono e/o restituiscono un nodo (first, last, prev, addAfter ecc...) hanno come ritorno/parametro un Position<E> (l'astrazione) e non DNode<E> (la implementazione concreta).
Questo perché così, "vedendo" un nodo solo come Position, non puoi accedere/toccare i prev/next del nodo. Insomma, la astrazione ti nasconde il modo in cui i nodi vengono incatenati. E questo di per sé è un bene, perché non puoi sballare la lista.

Poi è chiaro che l'esempio è basilare e solo "didattico". La classe DNode infatti è pubblica e tu "sai" che tutti i nodi sono realmente dei DNode, quindi nessuno ti impedisce di fare es. first() poi fare un cast a DNode<TipoSpecifico> (se hai fatto un NodePositionList<String>, avrai DNode<String>) e poi andare a danneggiare i next/prev nella lista come ti pare.

La classe NodePositionList infatti si aspetta solo dei DNode, infatti c'è un cast in checkPosition:

DNode<E> temp = (DNode<E>) p;

Quindi il senso della astrazione è proprio solo quello "didattico" di mostrare che Position offre solo il valore nascondendo il modo di incatenamento dei nodi. La interfaccia non è quindi intesa per poter avere N altre implementazioni (perlomeno rispetto a NodePositionList).

Quote Originariamente inviata da Bombonera Visualizza il messaggio
Poi non ho capito qual è il meccanismo che mi fa accedere ad un nodo della lista ? Con Position<E> io non passo l'elemento di un nodo ?
Se fai un first() ottieni un nodo, il primo. Materialmente sarà un DNode ma tu lo "vedi" solo come Position. Se vuoi il successivo devi invocare next della lista che ti fornisce il successivo. Proprio perché Position non ti fornisce appigli in tal senso.