64
Gerarchie di Tipi

Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Embed Size (px)

Citation preview

Page 1: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Gerarchie di Tipi

Page 2: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Metodologie di progetto

• Estensione di classi

• Implementazione di interfacce

• Composizione

Page 3: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Notazione UML

Relazione Simbolo Significato

Ereditarietà is-a

Implementazione is-a

Aggregazione has a

Dipendenza usa

Page 4: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Una struttura universitaria• Il personale è strutturato in

Personale Docente: Faculty Personale Tecnico Amministrativo: Staff

Page 5: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Una struttura universitaria• Introduciamo una terza categoria che

descrive le due tipologie di personale

• UnivEmployee Definisce le caratteristiche di struttura e

comportamento comuni a tutto il personale Intesa non per creare istanze proprie definiamo abstract per realizzare queste

scelte di progetto

Page 6: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Una struttura universitaria

UnivEmployee<abstract>

Faculty Staff

Page 7: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

University Employees

• A tutto il personale viene garantito l’uso di posta elettronica

• Rappresentiamo mediante un metodo

• Includiamo il metodo in UnivEmployee così che venga ereditato dalle due classi derivate

/** * manda un messaggio all’oggetto su cui è invocato */ public void mailTo(String msg);

Page 8: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

public abstract class UnivEmployee{ private List<String> mailbox = new ArrayList<String>(); public void mailTo(String msg) { mailbox.add(msg); } . . . }

public class Faculty extends UnivEmployee { . . . }

public class Staff extends UnivEmployee { . . . }

University Employees

Page 9: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

• L’accesso alla posta elettronica è una proprietà generale

• Possiamo concettualizzare questa proprietà una interfaccia

University Employees

interface EmailInt{ public void mailTo(String msg);}

Page 10: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

University Employees con email

UnivEmployee<abstract>

Faculty Staff

EmailInt<interface>

Page 11: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

abstract class UnivEmployee implements EmailInt{ . . . public void mailTo(String msg) { . . . } }

class Faculty extends UnivEmployee { . . . }

class Staff extends UnivEmployee { . . . }

University Employees con email

Page 12: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

University Employees

• Al personale docente viene inoltre garantita la possibilità di gestire una propria pagina web

• Definito solo per la classe Faculty

/** * restituisce la URL associata all’oggetto */ public Url browse();

Page 13: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

University Employees … on the web

• Anche qui, possiamo generalizzare introducendo una nuova interfaccia

interface WebInt { public Url browse();}

Page 14: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

UnivEmployee<abstract>

Faculty Staff

EmailInt<interface>

WebInt<interface>

University Employees … on the web

Page 15: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

public abstract class UnivEmployee implements EmailInt{ . . . public void mailTo(String msg) { . . . } }

public class Faculty extends UnivEmployee implements WebInt{ public Url browse() { . . . } . . . }

public class Staff extends UnivEmployee { . . . }

University Employees … on the web

Page 16: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Gerarchie di tipi

• Ogni classe può implementare più interfacce estendere al più una classe

• I due meccanismi si possono combinare

Page 17: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Gerarchie di tipi

• Uno schema ricorrente

SuperClasse

Classe

Interfaccia

• Permette di utilizzare Classe come SuperClasse e Interfaccia

Page 18: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

University Employees … on the web

• Possiamo dare struttura alla composizione di interfacce

• Estensione di interfacce no vincoli: possiamo estendere più di una interfaccia interfaccia che estende è sottotipo di tutte le

interfacce che vengono estese

interface Online extends EmailInt,WebInt { }

Page 19: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

UnivEmployee<abstract>

Faculty Staff

EmailInt<interface>

WebInt<interface>

University Employees … on-line

OnLine<interface>

Page 20: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

public abstract class UnivEmployee implements EmailInt { . . . public void mailTo(String msg) { . . . } }

public class Faculty extends UnivEmployee implements OnLine{ public Url browse() { . . . } . . . }

public class Staff extends UnivEmployee { . . . }

University Employees … on line

Page 21: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Corsi

• Il personale docente insegna uno o più corsi all’interno dei corsi di laurea

• Rappresentiamo nei diagrammi con una nuova relazione tra classi associazione

Page 22: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

University Employees

UnivEmployee<abstract>

Faculty Staff

EmailInt<interface>

WebInt<interface>

Course

1..*

OnLine<interface>

Page 23: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

public abstract class UnivEmployee implements EmailInt { . . . public void mailTo(String msg) { . . . } }

public class Faculty extends UnivEmployee implements OnLine{ public Url browse() { . . . } . . . private ArrayList<Course> courses; . . . }

public class Staff extends UnivEmployee { . . . }

University Employees

Page 24: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

University Employees

• I corsi vengono gestiti dal personale tecnico amministrativo per gli aspetti relativi a iscrizione, liste di esami …

• La classe Staff dipende quindi dalla classe Course

Page 25: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

University Employees

UnivEmployee<abstract>

Faculty Staff

EmailInt<interface>

WebInt<interface>

Course

1..*

OnLine<interface>

Page 26: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

public abstract class UnivEmployee implements EmailInt { . . . public void mailTo(String msg) { . . . } }

public class Faculty extends UnivEmployee implements Online{ public Url browse() { . . . } . . . private ArrayList<Course> courses; . . . }

public class Staff extends UnivEmployee { public void admin(Course c) { . . . } . . . }

University Employees

Page 27: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Corsi … on-line

• Possiamo sfruttare la struttura in più che abbiamo ottenuto dall’introduzione delle interfacce per rappresentare ulteriori funzionalità Ad esempio, i corsi possono essere dotati di un sito

web e di un indirizzo di posta elettronica

Page 28: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Corsi … on-line

UnivEmployee<abstract>

Faculty Staff

EmailInt<interface>

WebInt<interface>

Course

1..*

OnLine<interface>

Page 29: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione
Page 30: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

• Metodologie di progetto basate su estensione e composizione di classi e interfacce

• Progetto di interfacce grafiche

Page 31: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Eventi e Listeners

• La sorgente di un evento ispeziona la lista dei suoi listeners (registrati) seleziona tutti i listeners il cui tipo corrisponde al tipo

dell’evento. su ciascuno dei listeners selezionati, invoca il metodo

associato all’evento passandogli l’event object associato all’evento

Page 32: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Listeners – (alcuni) metodi

ActionListener void actionPerformed(ActionEvent)

WindowListenervoid windowActivated(WindowEvent)

void windowClosed(WindowEvent)

ListSelectionListenervoid valueChanged(ListSelectionEvent)

KeyListener void keyPressed(KeyEvent)

void keyReleased(KeyEvent)

void keyTyped(KeyEvent)

MouseMotionListenervoid mouseMoved(MouseMotionEvent)

void mouseDrag(MouseMotionEvent

MouseListener void MouseClicked(MouseEvent)

void mouseEntered(MouseEvent)

Page 33: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Listeners e Adapters

• Listeners : interfacce

• Adapters: classi (astratte) che implementano i listeners fornendo

implementazioni default per i metodi dichiarati dai listeners

• La nomenclatura aiuta: XEvent:

la classe associata all’evento X XListener :

l’interfaccia che i listenerers dell’evento X devono implementare XAdapter:

la classe astratta che implementa XListener con metodi default:

Page 34: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

:

EventListener

MouseMotionListener

WindowListenerKeyListener

ListSelectionListener

MouseListener ActionListener

Listeners

Page 35: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

:

EventListener

MouseMotionListener

WindowListenerKeyListener

ListSelectionListener

MouseListener ActionListener

KeyAdapterMouseAdapter WindowAdapter

Listeners e Adapters

Page 36: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Definizione di Listeners

• Implementiamo il Listener

• Estendiamo l’Adapter

class MyXAdapter extends XAdapter { // sovrascrive (alcuni de) i metodi definiti da XAdapter }

class MyXListener implements XListener { // metodi definiti da XListener }

Page 37: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Registrazione di Listeners

• Ogni event source ha un metodo per registrare un corrispondente listener

public void addXListener(XListener listener)

Page 38: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Esempio: ClickCounter

4 click Reset

Page 39: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Esempio: ClickCounter

• Gestione eventi: prima alternativa Il frame gestisce entrambi i pulsanti

JFrame

ClickCounter

ActionListener

Page 40: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Esempio: ClickCounter

JFrame

ClickCounter

ActionListener

public class ClickCount extends JFrame implements ActionListener {

int count = 0; JLabel clicks = new JLabel ("Total clicks = 0"); JButton b = new JButton ("click"); JButton r = new JButton ("reset"); . . . public ClickCount() { . . . b.addActionListener(this); r.addActionListener(this); } . . . public void actionPerformed( ActionEvent e ) { if (e.getSource() == b) count++; else if (e.getSource() == r) count = 0; clicks.setText("Total clicks = " + count); }}

Page 41: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Esempio: ClickCounter

• Gestione eventi: seconda alternativa I pulsanti gestiscono gli eventi autonomamente

JFrame

ClickCounter

ActionListener

ActionListener2

Page 42: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Esempio: ClickCounter

public class ClickCount extends JFrame { . . . public ClickCount() { . . . b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { count++; clicks.setText("Total clicks = " + count);

}}); r.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { count = 0; clicks.setText("Total clicks = " + count);

}}); } . . . }

Page 43: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Domande

• Come disponiamo due pulsanti allineati sul lato inferiore di un frame?

• Come disponiamo tre pulsanti uno sopra l’altro?

Page 44: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Risposte

• Prima le aggiungiamo ad un pannello (con FlowLayout) e poi aggiungiamo il pannello all’are sud del frame.

• Li disponiamo dentro un panello con GridLayout contenente tre righe ed una colonna

Page 45: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Esempio – EventFrame

• Una finestra che cattura e traccia un insieme di eventi del mouse

Page 46: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

EventFrame – costruttore

import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;

/** EventFrame: traccia eventi di vario genere **/

class EventFrame extends JFrame { /** * Costruisce il Frame principale con le varie componenti */

public EventFrame() {

Page 47: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

EventFrame – costruttore

// Labels e TextFields per tracciare gli eventi JPanel eventFields = new JPanel(new BorderLayout()); Panel labels = new JPanel(new GridLayout(events.length,1)); JPanel traces = new JPanel(new GridLayout(events.length,1)); for (int i = 0; i < events.length; i++) {

labels.add(events[i].label); traces.add(events[i].trace);

} eventFields.add(labels,BorderLayout.WEST); eventFields.add(traces,BorderLayout.CENTER);

Page 48: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

EventFrame – costruttore

// Pulsanti JPanel buttons = new JPanel(new GridLayout(2,1)); buttons.add(new EventButton(Color.blue)); buttons.add(new EventButton(Color.red));

// Completa il layout setLayout(new GridLayout(1,2)); add(eventFields); add(buttons); }

Page 49: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Progetto dei Listeners

:

EventTracer

MouseMotionListenerMouseListener

Actiontracer

ActionListener

MouseTracer MouseMotionTracer

Page 50: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Classi interne – EventTracer

private class EventTracer { /** * Costruisce il messaggio da visualizzare in risposta a * ciascun evento (sul campo testo corrispondente) * Overloade sul tipo dell'evento */ public void trace(int field, ActionEvent e) { // messaggio = numero di action events fino ad ora actionEvents++; displayMessage(field, "Event n. " + actionEvents);}

Page 51: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Classi interne – EventTracer

public void trace(int field, MouseEvent e ) { // messaggio = pulsante@(x,y), numero di click consecutivi int mod = e.getModifiers(); String btn = "none"; if ( mod == 16 ) btn = "left"; else if (mod == 8 ) btn = "center"; else if (mod == 4 ) btn = "right"; displayMessage(field, btn + //

"@(" + e.getX() + "," + e.getY() +")" + ", Clicks = " + e.getClickCount()); }

Page 52: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Classi interne – Listeners

class ActionTracer extends EventTracer implements ActionListener { public void actionPerformed(ActionEvent e) {

trace(ACTION, e); }ActionTracer(Color col) { super(col); }

}

Page 53: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Classi interne – Listeners

class MouseTracer extends EventTracer implements MouseListener {

public void mouseClicked(MouseEvent e) { trace(MOUSE_CLICKED, e);}public void mouseEntered(MouseEvent e) { trace(MOUSE_ENTERED, e);}public void mouseExited(MouseEvent e) { trace(MOUSE_EXITED, e);}public void mousePressed(MouseEvent e) { trace(MOUSE_PRESSED, e); }public void mouseReleased(MouseEvent e) { trace(MOUSE_RELEASED, e);}MouseTracer(Color col) { super(col); }

}

Page 54: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Classi interne – Listeners

class MouseMotionTracer extends EventTracer implements MouseMotionListener {

public void mouseDragged(MouseEvent e) { trace(MOUSE_DRAGGED, e); }public void mouseMoved(MouseEvent e) { trace(MOUSE_MOVED, e);}MouseMotionTracer(Color col) { super(col); }

}

Page 55: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Classi interne – Pulsanti

/** * Aree di tracciamento, definite come pulsanti * Registrano listeners per tutti gli eventi da tracciare */ class EventButton extends JButton {

EventButton(Color c) { setBackground(c); addActionListener( new ActionTracer(c) ); addMouseListener( new MouseTracer(c) ); addMouseMotionListener( new MouseMotionTracer(c) );}

}} // Conclude EventFrame

Page 56: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Esempio – Puzzle

• Forniamo una interfaccia grafica per il Puzzle che realizza il “gioco del 15”

Page 57: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Ricordiamo – PuzzleBoard

• Nella costruzione dell’applicazione, la classe PuzzleBoard funge da back-end

• L’interfaccia grafica si limita in sostanza a fornire metodi di interazioni con il back-end

Page 58: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

PuzzleBoard

public class PuzzleBoard { /** costruisce una tabella con dimensione size */ public PuzzleBoard(int size) { . . . }

/** il valore contenuto nella posizione (x,y) * -1 se la posizione è vuota */ public int val(int x, int y) { . . . }

/** muove il pezzo che porta il numero w se questo * è in posizione adiacente alla posizione vuota */ public boolean move(int w) { . . . }

/** true se la configurazione corrente è di successo */ public boolean win() { . . . }}

Page 59: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

PuzzleFrame – struttura

import java.awt.*; import java.awt.event.*; import javax.swing.*;

class PuzzleFrame extends JFrame {

// back-end private PuzzleBoard board;

// dimensione del puzzle private int size;

// i pezzi sull'interfaccia. Ciascun PuzzleButton è // associato alla corrispondente posizione sul backend private PuzzleButton[][] button;

Page 60: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

PuzzleFrame – costruttore

/** costruisce la tabella grafica a partire dalla * tabella b che costituisce il back-end */ public PuzzleFrame(int board_size, PuzzleBoard b) {

size = board_size; board = b;button = new PuzzleButton[size][size];setLayout(new GridLayout(size, size));// crea i pulsanti associati ai pezzi e disponifor ( int i = 0; i != size; i = i+1 ) { for ( int j = 0; j != size; j = j+1 )

{ button[i][j] = new PuzzleButton(); add(button[i][j]);

} }// inizializza pulsanti con i loro numeri display();

}

Page 61: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

PuzzleFrame – refresh

/** ridisegna la tabella dopo una mossa **/ private void display() {

// ridisegna i numeri sui pulsantifor ( int i = 0; i != size; i = i+1 ) { for ( int j = 0; j != size; j = j+1 ) {

if ( board.val(i,j) >= 0 ) { button[i][j].setBackground(Color.white); button[i][j].setText("" + board.val(i,j)); }

else { button[i][j].setBackground(Color.black); button[i][j].setText( "" );}

} }

Page 62: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

PuzzleFrame – refresh

if (board.win()) { int response =

JOptionPane.showConfirmDialog(this, "Done! Play again?"); switch (response) { case JOptionPane.YES_OPTION : board = new PuzzleBoard(size);

display(); break; case JOptionPane.CANCEL_OPTION : break; default: System.exit(0); }

} } // chiude il metodo display()

Page 63: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

PuzzleFrame – gestione pulsanti

/** classe interna: controllore dei pulsanti */ class PuzzleButton extends JButton implements ActionListener {

public PuzzleButton( ){ // numero del pulsante deciso da display()

super(""); addActionListener(this);}

public void actionPerformed(ActionEvent evt) { // prendi il numero di questo pulsante String s = getText(); if ( !s.equals("") ) {

// non è il pulsante vuotoboolean ok = board.move(Integer.parseInt(s)); if ( ok ) { display(); }

}}

}

Page 64: Gerarchie di Tipi. Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Componenti Swing

• Molte

• … sicuramente troppe per questo corso

• Consultate le API