programmazione a oggetti tramite la macchina del caffé (pt. 2)

Post on 13-Jun-2015

1.297 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

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 3

TRANSCRIPT

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)

top related