Paola Magillo, Univestita' di Genova, Corso di Programmazione II per SMID, a.a. 2007-2008.

Laboratorio 01:

RETTANGOLO E CUBOIDE - SECONDA PUNTATA

Vedere dispense per come usare Java in laboratorio.

Esercizio 1 - Rettangolo con incapsulazione

(Teoria sulle dispense).

Partire dalla versione del rettangolo con funzioni setLength e setWidth (ved. esercizio 2 del laboratorio 0).

Incapsulare la classe Rectangle, cioe'

L'incapsulazione fa si' che nessuno dall'esterno possa accedere alle variabili length e width se non attraverso le funzioni set e get fornite. In particolare, nessuno puo' assegnare a queste variabili valori arbitrari senza passare attraverso i controlli fatti nelle funzioni setLength e setWidth.

Verificare se la classe Cuboid scritta la volta scorsa (ved. esercizio 3 del laboratorio 0). si compila senza dare errori.
Potrebbe dare errore per accesso alle variabili private di Rectangle. Questo si evita mettendo le due variabili come protected invece che private (in questo modo possono accederle anche le sottoclassi).

Incapsulare anche la classe del cuboide mettendo height privata e scrivendo le due funzioni getHeight e setHeight.

Esercizio 2 - Rettangolo con costruttori

(Teoria sulle dispense).

Aggiungere alla classe Rectangle altri costruttori (ved. dispense).
Aggiungere anche un costruttore con un solo parametro che costruisca un quadrato (rettangolo con length == width).
In tutti i costruttori, se i valori degli argomenti sono inferiori a MINIMUM_SIZE, allora sostituire il valore troppo piccolo con quello di MINIMUM_SIZE.

Esercizio 3 - Uguaglianza (rettangoli)

(Teoria sulle dispense).

Tra due oggetti, per esempio tra due rettangoli, e' possibile avere:

  1. uguaglianza come identita' (deve essere lo stesso oggetto), si controlla con l'operatore java ==
  2. uguaglianza come uguale stato (uguale valore degli attributi), per controllarla dobbiamo scrivere noi una funzione

Aggiungere nella classe Rectangle una funzione che controlla l'uguaglianza come uguale stato fra rettangoli (ved. funzione isEqual nelle dispense).

Aggiungere nel "main" una sezione che prova come funzionano questi due tipi di uguaglianza

Aggiungere la funzione di copia e il costruttore di copia per i rettangoli (ved. "Copia di oggetti" nelle dispense).

Esercizio 4 - Uguaglianza (coppie di rettangoli)

Prendere la classe RectanglePair che rappresenta coppie di rettangoli (ved. dispense).

Poiche' la classe ha attributi che appartengono a loro volta a classi (non sono tipi base come in Rectangle) allora l'uguaglianza come uguale stato si puo' distinguere ancora in:

  1. shallow equality (uguaglianza esterna): tra gli attributi-oggetti deve valere l'uguaglianza come identita' di oggetti
  2. deep equality (uguaglianza in profondita'): gli attributi-oggetti devono essere uguali come stato

Scrivere un "main" per la classe RectanglePair nel quale:

Per comodita' si puo' definire nella classe RectanglePair un costruttore che prende come argomenti due rettangoli.

Nota: per compilare e per eseguire la classe RectanglePair abbiamo bisogno anche della classe Rectangle.
Se i due file Rectangle.java e RectanglePair.java stanno nella directory corrente, il sistema "si accorge" che il secondo "usa" il primo: compilare il secondo provoca compilazione del primo (se non esiste gia' il .class).
Analogamente, se Rectangle.class e RectanglePair.class stanno nella directory corrente, il sistema "si accorge" che il secondo "usa" il primo: eseguire il secondo linka automaticamente il primo.

Aggiungere nella classe RectanglePair le funzioni che controllano la shallow equality e la deep equality fra due coppie di rettangoli.

Scrivere un main che testi le due funzioni di shallow e deep equality per coppie di rettangoli.

Esercizio 5 (se vi avanza tempo) - Il treno

Prendere la classe Vagone e la classe Treno dalle dispense, nella versione in cui Treno e' sotto-classe di Vagone.

Aggiungere la funzione di stampa, e il main nella classe Treno (sempre dalle dispense).

Aggiungere nel main la stampa del treno costruito. Provare a costruire treni piu' lunghi.