programmazione a oggetti tramite la macchina del caffé (pt. 2)
DESCRIPTION
Una introduzione semplice e (spero) intuitiva al mondo della programmazione a oggetti usando come riferimento una macchina del caffé (tipo Nespresso) Slides 2 di 3TRANSCRIPT
La programmazione a oggetti e le macchine del caffé
(PARTE 2)
Prof. Marcello Missiroli
Di cosa parliamo
Ulteriori vantaggi della programmazione a oggetti
Ereditarietà (in generale e in Java)
Metodi e attributi statici
Miglioriamo il programma
• Il nostro oggetto funziona bene, ma si potrebbe decidere di aggiungere la funzionalità di sbattitore per il cappuccino
• Tutto il resto resta invariato, ma vogliamo qualcosa in più
Ampliamo
In modo tradizionale..
• Bisogna, in pratica, riprogettare tutto daccapo.
• L'aggiunta di un nuovo campo allo struct lo rende in tutto o in parte incompatibile con le funzioni esistenti
...ma con gli oggetti
Possiamo costruire un oggetto più “preciso”, più “raffinato” partendo da uno grezzo, ereditando tutto l'esistente e cambiando solo quello che serve
In gergo tale caratteristica si chiama “Ereditarietà”
La classe 'figlia'
public class MacchinaCaffeCappuccio extends MacchinaCaffe {
private float milk; boolean makeCappuccio(int seconds) { return true;};
public float getMilk() { return milk; }
public void setMilk(float milk) { this.milk = caffe; }
}}
Cosa abbiamo ottenuto?
La nuova classe possiede TRE attributi, coffee e water ereditati dalla classe padre, e milk, appena creata.
Possiede tutti metodi della classe padre, più setMilk(), getMilk() e makeCappuccio()
Il main
public static void main(String args[]) {
MacchinaCaffeCappuccio mcc = new MacchinaCaffeCappuccio();
mcc.setCaffe(34); mcc.setMilk(22); }
Metodo Metodo delladella classeclasse padrepadre
Metodo Metodo delladellaclasseclassefigliafiglia
Ancora la visibilità
Molto spesso le classi derivate devono operare sulle variabili private della classe padre.
Si può fare tramite getter e setter, ma spesso il codice risulta inutilmente prolisso
Per questo motivo si usa spesso il livello di protezione “protected”, che permette libero accesso alla classi figlie.
Nuova versione protected float water; protected float caffe;
public float getCaffe() { return caffe; }
public void setCaffe(float caffe) { this.caffe = caffe; }
public float getWater() {return water;}
public void setWater(float water) { this.water = water; }
Ancora i costruttori
Ovviamente, è opportuno creare dei costruttori “speciali” per gli oggetti derivati
In questo caso, il costruttore 'figlio' deve chiamare il costruttore dell'oggetto 'padre' in modo esplicito, tramite la chiamata “super”.
Il codice
public MacchinaCaffeCappuccio(float water, float caffe, float milk) {
super(water, caffe); this.milk = milk; }
Overriding
Nella classe derivata, è possibile redfinire metodi già presenti nella classe base (magari per adattarla alle nuove caratteristiche)
Attributi statici
Gli attributi statici sono attributi che non fanno parte di un particolare oggetto, ma piuttosto sono legati alla classe.
Sono pertanto accessibili liberamente, senza istanzanziare nulla, facendo riferimento al nome della classe.
Ricordano in parte le variabili globali, in parte le variabili statiche del C/C++
Esempio
//all'interno della classe public static int anno;//anno di produzione della macchina
//Si richiamano così:MacchinaCaffeCappuccio.anno=1;
Idiosincrasie statiche
Risulta piuttosto difficile e poco elegante inizializzare variabili statiche
Per questo motivo java dispone di un costrutto che esegue codice la prima volta in cui una classe è caricata in memoria.
Potete vederlo come un “inizializzatore statico”
Esempio
static {
anno=2010;}
Metodi statici
Allo stesso modo possiamo avere metodi che non sono legati a una oggetto, ma fanno parte della classe.
Ricordano le funzioni di tipo classico
Permettono di offrire servizi anche ad altri oggetti. Molto utilizzati negli oggetti predefiniti (es: Math)
Esempio
//Oltre al ben noto “public static void main”, possiamo definire una funzione come questa
public static stampaCopy() {System.out.println(“Copyright 2010 by me”);
}//e si richiama come
MacchinaCaffeCappuccio.stampaCopy();
Riassumendo
Abbiamo visto un altro grande concetto base dell'OOP, l'ereditarietà, ed abbiamo introdotto variabili e metodi statici
Nelle prossime lezioni parleremo di ereditarietà multipla e interfacce.
Licenza
Questo documento è soggetto alla licenza Creative Common BY-SA (Attribution – Share Alike)