260 likes | 362 Views
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
E N D
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
“a” “a” “a” “c” “b” Esempio h s g a t
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
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)
Costruttore • Notate che la precondizione garantisce le proprieta’ di figli • Richieste dall’invariante • Se fosse pubblico dovrei verificarle (meglio privato)
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