Sei sulla pagina 1di 26

Programmazione 2

Esercitazione 2

Livio Pompianu - Simone Porcu


Contatti e consegna esercizi

● Consegna su Moodle

Oppure, SOLO se Moodle non è disponibile, indirizzate le mail ad entrambi


indicando, all’inizio dell’oggetto: [PR2]

● Livio Pompianu: pompianu.livio@gmail.com

● Simone Porcu: simone.porcu@diee.unica.it

Inviare i testi degli esercizi in un archivio con nome

● matricola_cognome_nome.zip
Ereditarietà
Cosa è l'ereditarietà?

Oggetti differenti hanno spesso caratteristiche comuni.

È possibile far ereditare alle classi sia variabili di stato che metodi.

Nomenclatura

● la classe da cui si eredita è detta superclasse


● le classi che ereditano sono dette sottoclassi
● una sottoclasse estende una superclasse

Regola

● si può estendere una sola classe


Esempio

// Bicicletta.java
public class Bicicletta {
...
}

// MountainBike.java
public class MountainBike extends Bicicletta {
...
}

// BiciDaCorsa.java
public class BiciDaCorsa extends Bicicletta {
...
}
Sottoclasse

La sottoclasse può

● utilizzare gli attributi ereditati come fossero suoi (ma attenzione ai modificatori)
● definire nuovi attributi
● utilizzare i metodi ereditati come se fossero suoi (ma attenzione ai modificatori)
● definire nuovi metodi
● sovrascrivere metodi della superclasse (overriding)
this vs super

Mentre this viene utilizzato per riferirci all'oggetto corrente, per riferirci alla
superclasse si utilizza super.

public class Bicicletta {


public int velocita() { ... }
}

public class BiciDaCorsa extends Bicicletta {


public void printNomeModello() { ... }

public int velocita() {


...
this.printNomeModello();
int v = super.velocita();
...
}
}
super costruttore

public class Bicicletta {


private int velocita;

public Bicicletta(int velocita) {


this.velocita = velocita;
}
}

public class MountainBike extends Bicicletta {


private String nome;

public MountainBike(String nome) {


this.nome = nome;
}
}
super costruttore

public class Bicicletta {


private int velocita;

public Bicicletta(int velocita) {


this.velocita = velocita;
}
}

public class MountainBike extends Bicicletta {


private String nome;

public MountainBike(String nome) {


this.nome = nome;
super(1234);
}
}
super costruttore

public class Bicicletta {


private int velocita;

public Bicicletta(int velocita) {


this.velocita = velocita;
}
}

public class MountainBike extends Bicicletta {


private String nome;

public MountainBike(String nome) {


super(1234);
this.nome = nome;
}
}
super costruttore

public class Bicicletta {


private int velocita;

public Bicicletta() {}

public Bicicletta(int velocita) {


this.velocita = velocita;
}
}

public class MountainBike extends Bicicletta {


private String nome;

public MountainBike(String nome) {


this.nome = nome;
}
}
Incapsulamento e information hiding

Incapsulare significa nascondere i dettagli di una classe (attributi, metodi “interni”)

Per fornire accesso in lettura e scrittura ai dati, bisogna implementare la sua


interfaccia pubblica (con dei metodi appropriati, detti getter e setter)

L’incapsulamento ha molti benefici:

● nasconde i dettagli dell’implementazione


● aiuta a garantire la coerenza dello stato di un oggetto (es: potete eseguire dei
controlli all’interno dei metodi setter prima di modificare un attributo)
● aiuta l’individuazione degli errori e la loro risoluzione
Modificatori di accesso

Definiscono la visibilità di un metodo o un attributo

● public accesso non ristretto

● protected accessibile dalle sottoclassi

● default accessibili da chiunque nello stesso package

● private accessibile solo all’interno della stessa classe

Come regola generale:

● attributi → private/protected
● funzioni di lavoro → private/protected
● interfaccia pubblica → public
Overloading

È possibile dichiarare metodi con lo stesso nome, ma con parametri differenti

Il tipo di ritorno può essere identico o differente, ma i parametri devono essere


diversi

È usato per incrementare la flessibilità di utilizzo e il riuso del codice

Si può fare l’overloading del costruttore


Esempio di costruttore overloaded

public class Rectangle {

private int x, y;
private int width, height;

public Rectangle() {
this(0, 0, 1, 1);
}

public Rectangle(int width, int height) {


this(0, 0, width, height);
}

public Rectangle(int x, int y, int width, int height) {


this.x = x;
this.y = y;
this.width = width;
this.height = height;
}

}
Javadoc

Javadoc è lo standard per la documentazione del codice Java.

Produce una pagina html con interfaccia identica alle API Java.

Si utilizza per descrivere:

● classi: per spiegarne lo scopo


● costruttori e metodi pubblici: per descriverne scopo, parametri e valori restituiti

Da terminale, per produrre la documentazione javadoc usare il comando:

$ javadoc Classe.java
Javadoc - tags by example

Le classi si commentano con:


/**
* Questa classe fa cose.
*/
public class Cose{ … }

I metodi si commentano con:


/**
* Questa metodo fa la cosa.
* @param valore numero in ingresso
* @return valore della cosa fatta
*/
public int faiCosa(int valore){ … }
Testing

Il testing ricopre una parte essenziale nello sviluppo delle applicazioni. Un buon
test ricopre il maggior numero di casi limite.

Si possono adottare due approcci:

● custom
○ creare una classe di test
○ utilizzare le asserzioni (assert)

● libreria
○ JUnit: semplifica la creazione di classi di test (la vedremo più avanti)

Per utilizzare gli assert bisogna abilitarli esplicitamente:

$ java -ea Test


Testing - assertion

Le asserzioni sono nella forma assert (condizione booleana)

assert 2+2 == 4;

Se durante l’esecuzione un’asserzione è valutata falsa il programma termina,


segnalando la riga contenente l’asserzione falsa

Per utilizzare gli assert bisogna abilitarli esplicitamente:

$ java -ea Test


Esercizi
QuadraticEquation

Realizzare e commentare (con Javadoc) la classe QuadraticEquation, che


modella l’equazione ax2+bx+c = 0

Il costruttore riceve i coefficienti a, b, c per l'equazione.

I metodi che rendono le soluzioni:

● public double getSolution1() (+delta)

● public double getSolution2() (-delta)

Hint: per la radice quadrata usare Math.sqrt() (non è necessario fare import)

Si utilizzi la classe TestQuadraticEquation disponibile su moodle per testare


l'applicazione. Ricordate di eseguire utilizzando gli assert:

$ java -ea TestQuadraticEquation


Esercizio Geometry 1/2

Creare la classe Point2D, che modella un punto nel piano.

Creare un costruttore che prende le coordinate (x,y) (di tipo double) e uno senza
parametri che inizializza le coordinate a 0.

Create i metodi:

● getter per gli attributi x e y

● getDistanceTo, per calcolare la distanza da un altro punto

● getDistanceTo, per calcolare la distanza da un’altra coppia di coordinate


(x,y) (implementare quindi due metodi usando l’overloading)
Esercizio Geometry 2/2

Creare la classe Line2D, che modella un segmento nel piano.

Creare un costruttore che prende il punto di inizio e il punto di fine (come Point2D)

Create i metodi:

● getter per il punto di inizio e il punto di fine


● getLength che restituisce la lunghezza del segmento
● isContiguousWith, che prende un’altra Line2D e restituisce true se il punto
iniziale di un segmento coincide con quello finale dell’altro o viceversa

Hint: riutilizzare il più possibile i metodi di Point2D

Per testare l'esercizio si utilizza una classe TestGeometry disponibile su moodle.


Ricordate di eseguire utilizzando gli assert:

$ java -ea TestGeometry


Esercizio Persona 1/3

Progettare e commentare (con Javadoc) la classe Persona

Ciascuna persona possiede:

● nome
● cognome
● eta

Costruttore:

● prende nome, cognome, eta


Esercizio Persona 2/3

Progettare e commentare (con Javadoc) la classe Lavoratore

Ciascun dipendente possiede:

● nome
● cognome
● eta
● stipendio

Costruttore (usare l'overloading);

● un costruttore che prende nome, cognome, eta


● un costruttore che prende nome, cognome, eta, stipendio

Il codice deve garantire in ogni caso uno stipendio almeno pari a 100.
Esercizio Persona 3/3

Implementare inoltre il seguente metodo nella classe Lavoratore:

● public void incrementaStipendio(int perc)


○ riceve un int che rappresenta una percentuale di aumento dello stipendio ed aumenta lo
stipendio
○ verificare che perc sia compreso tra 0 e 100

Per testare l'esercizio si utilizza una classe TestPersona disponibile su moodle.


Ricordate di eseguire utilizzando gli assert:

$ java -ea TestPersona