Gli obiettivi di questa esercitazione sono: capire e saper utilizzare interfacce e classi astratte (capitolo 10 fino a 10.3).
Raccomandazioni: Ove non altrimenti indicato, rispondete alle domande prima ragionando su carta e poi provando a editare, compilare ed eseguire. Gli esercizi etichettati con l'asterisco (*) sono più difficili: affrontateli dopo aver risolto gli altri.
Obiettivo: saper utilizzare classi astratte ed eredità.
Attività:
Esercizio1 stampi
77,33:
... class A ... {
... int m2() {return 3;}
... int m3() {return 1;}
}
... class B ... {
... int m3() {return 5;}
}
... class C ... {
... int m1() {return 11;}
}
... class D ... {
... int m2() {return 7;}
... int m3();
}
class Esercizio1 {
public static void main(String[] args) {
D pluto = new ...;
... pippo = new ...;
System.out.println((pippo.m2()*pippo.m1()) + ","
+ (pluto.m1()*pluto.m2()*pluto.m3()));
}
}
Esistono più soluzioni? Se sì, quale è la "migliore"?
Perché? SegmentoOrizzontale che estende la classe
DisegnabileConCarattere e che rappresenta un segmento di lunghezza
fissata.DisegnabileConCarattere vengono "disegnati"
su schermo usando caratteri, e il carattere usato viene memorizzato in un
attributo c.
abstract class DisegnabileConCarattere {
protected char c = '*';
public void impostaCarattere(char c) {
this.c = c;
}
protected char carattere() {
return this.c;
}
abstract String disegna();
}
Il metodo disegna() non deve disegnare a schermo, ma restituire
una rappresentazione sotto forma di stringa.SegmentoOrizzontale deve avere un costruttore in cui
si passa come parametro la lunghezza. Il metodo toString() deve
essere il seguente:
public String toString() {
return disegna();
}
UsaSegmentoOrizzontale che crea un segmento
lungo 6 e lo stampa a schermo 3 volte con 3 caratteri diversi ottenendo il
seguente output:
> java UsaSegmentoOrizzontale ****** ###### ------Dovete usare solo i metodi dell'oggetto segmento, ereditati e non.
SegmentoVerticale analoga a SegmentoOrizzontale.
Anche in questo caso il metodo toString() deve contenere la sola
istruzione return disegna();. Per evitare questa duplicazione
di codice, in quale classe sarebbe stato meglio definire il metodo toString()?
Verificate la vostra risposta modificando il codice, ricompilando ed eseguendo
di nuovo UsaSegmentoOrizzontale.Obiettivo: comprendere l'uso delle interfacce.
Attività:
Esercizio2 stampi
prima 15 e poi 7.
interface A {
public int m1();
}
... B {
public int m2();
}
interface C extends ... {
}
class D extends ... implements ... {
public int m1() {return 7;}
}
class E implements C {
public int m1() {return 3;}
public int m2() {return 5;}
}
class F {
public int m3() {return 1;}
}
class Esercizio2 {
public static void main(String[] args) {
C pippo = new ...;
... pluto = new D();
prova1(pippo);
prova2(pluto);
}
public static void prova1(... x) {
System.out.println(x.m1()*x.m2());
}
public static void prova2(... x) {
System.out.println(x.m1()*x.m3());
}
}
Esiste un'unica soluzione? Verificate tutte le soluzioni che vi sembrano corrette
ricompilando ed eseguendo nuovamente il programma. Ne esiste una "migliore"?
Se sì, perché la ritenete tale?Esercizio2 modificato qui di
seguito.
... G implements A, B {
public int m1() {return 11;}
}
class H ... {
public int m2() {return 13;}
}
class Esercizio2 {
public static void main(String[] args) {
... pippo = new ...;
System.out.println(pippo.m1()*pippo.m2());
}
}
Riproducibile che rappresenta le "cose"
che possono essere riprodotte sui registratori, lettori di dischi ottici e
simili. I metodi dell'interfaccia devo essere quelli che permettono di
Registrabile con i metodi per iniziare
e terminare la registrazione. Video e Audio che implementano
le interfacce Riproducibile e Registrabile con metodi
che consistono della sola istruzione
System.out.println("Sono nel metodo ... della classe ...");
(sostituite i puntini con il nome del metodo).Esercizio3 in modo che
Video,Audio e ripeta le stesse operazioni eseguite
prima.
class Esercizio3 {
public static void main(String[] args) {
... unVideo = ...;
prova(unVideo);
... unAudio = ...;
prova(unAudio);
}
...
}
Suggerimento: quanti metodi statici prova dovete
scrivere?
Paolo Coppola