Compitino del 2004 Alberi Generici
Idea Si vuole un tipo di dato astratto che definisca una struttura ad albero in cui nodi e foglie hanno associato (sono etichettati) un valore di tipo qualsiasi ma tra loro omogenei I nodi non sono binari ma ogni nodo puo’ avere n figli dove n>0 Le foglie non hanno figli
h g s at “a” “c” “b” Esempio
Progettazione Gerarchica Supertipo definisce il tipo Albero Due sottotipi che definiscono i due casi Foglia e Nodo Vantaggio: le due implementazioni sono specializzate, sono piu’ facili da implementare Il supertipo Albero e’ definito da una classe astratta (e non da una interfaccia), alcune cose si possono implementare in modo comune
Prima Parte Si forniscano le specifiche delle due sottoclassi concrete Foglia e Nodo che realizzano foglie e nodi con figli, rispettivamente. Si diano solo (ove necessario) i costruttori e quei metodi per cui e’ diversa la specifica. Facile: basta specializzare i metodi astratti al caso del sottotipo
Foglia
Nota Il costruttore di Foglia deve necessariamente essere pubblico (altrimenti da dove si comincia a costruire un albero?). Il costruttore di Nodo non serve invece a chi utilizza il tipo di dato astratto, perche’ c’e’ il metodo costruisci; serve solo all’interno delle classi Foglia e Nodo per implementare il metodo costruisci. Assumendo che Foglia e Nodo facciano parte dello stesso package lo mettiamo privato e mettiamo delle pre- condizioni per garantire che il Nodo sia “ben- formato” (vedi invariante dopo).
Domanda Successiva 1.Si dimostri che la specifica del metodo seleziona di Nodo soddisfa la regola dei metodi Le specifiche non sono uguali: ma la soddisfa perche’, se this e’ di tipo Nodo, non e’ una foglia. Non deve sollevare l’eccezione NotANodeException in accordo alla specifica del metodo del supertipo.
Domanda Successiva Si definisca la rappresentazione della classe Nodo, con funzione di astrazione e invariante di rappresentazione 1.Si fornisca l’implementazione del metodo costruisci e del costruttore di Nodo
Rappresentazione Ricorsiva Simile a quella della lista concatenata e dell’albero binario Non serve la variabile booleana vuota (siamo nel acso del nodo) Per memorizzare gli Alberi figli usiamo un array di Alberi (prendendo spunto dal metodo costruisci)
Rappresentazione Privata
Invariante
F di Astrazione
Costruttore Notate che la precondizione garantisce le proprieta’ di figli Richieste dall’invariante Se fosse pubblico dovrei verificarle (meglio privato)
Costruisci
Nota che
Ultima domanda Si fornisca l’implementazione del metodo concreto etichette (iteratore della classe astratta) assumendo che l’implementazione di Albero contenga anche il seguente metodo concreto private int count() { // EFFECTS: restituisce il numero di foglie e nodi di this}
Iteratore Visita in ordine posticipato dell’esempio: a a a c a g b t s h
Problema Il generatore deve essere realizzato nella classe astratta (indipendentemente dalle sottoclasse) Deve iterare usando i metodi astratti per leggere i valori Non e’ un problema se uno usa i metodi seleziona, etichetta, figli (sono come first e rest della lista) Bisogna usare un generatore ricorsivo che generalizza quello della lista Si mantiene un sottogeneratore che inizilamente e’ quello del figlio di destra, poi si sposta fino all’ultimo figlio Quando sono finiti i figli produce la radice
Inner Class Per il Generatore
Costruttore ed hasNext
Metodo next