PowerPoint Presentation - III parte Introduzione ai Design Patterns

March 28, 2018 | Author: Anonymous | Category: N/A
Share Embed


Short Description

Download PowerPoint Presentation - III parte Introduzione ai Design Patterns...

Description

Approfondimento Interfacce e polimorfismo

Sandro Pedrazzini

Interfacce e polimorfismo

1

Motivazione Importanza del polimorfismo nell’utilizzo dei pattern e, più In generale, nella programmazione OO Ruolo degli elementi “interface”

Disaccoppiamento degli elementi Programmazione generica Estensione di funzionalità esistente

Sandro Pedrazzini

Interfacce e polimorfismo

2

Interface

• Separazione del concetto di interfaccia da quello di classe • Più classi possono realizzare la stessa interfaccia Sci calcolaImporto(…)

Normale calcolaImporto(…)

Sandro Pedrazzini

Carving calcolaImporto(…)

Bambini calcolaImporto(…)

Interfacce e polimorfismo

3

Esempio 1: genericità con l’interfaccia Icon • Java mette a disposizione il metodo showMessageDialog(...) per mostrare un dialogo in interfaccia

JOptionPane.showMessageDialog(null,"Hello World");

Sandro Pedrazzini

Interfacce e polimorfismo

4

Scelta dell’icona (1) • Esistono altri overloading del metodo showMessageDialog(...). Ne scegliamo uno che ci permetta di specificare cosa mostrare come immagine nel messaggio. class JOptionPane extends JComponent implements Accessible { ... public static void showMessageDialog( Component parentComponent, Object message, String title, int messageType, Icon icon) {...} }

Sandro Pedrazzini

Interfacce e polimorfismo

5

Scelta dell’icona (2) JOptionPane.showMessageDialog( null, "Hello World”, “message dialog”, JOptionPane.INFORMATION_MESSAGE, new ImageIcon(“lampadina.gif”));

Sandro Pedrazzini

Interfacce e polimorfismo

6

Nuova scelta

• Supponiamo ora di voler visualizzare nel messaggio una forma grafica senza dover generare precedentemente un file contenente l’immagine. • Visto che showMessageDialog(...) accetta un elemento di tipo Icon, non siamo obbligati a passare ImageIcon, ma possiamo fornire un oggetto di qualsiasi classe che realizzi l’interfaccia Icon.

Sandro Pedrazzini

Interfacce e polimorfismo

7

Interfaccia Icon (1)

public interface Icon { int getIconWidth(); int getIconHeight(); void paintIcon( Component c, Graphics g, int x, int y); }

Sandro Pedrazzini

Interfacce e polimorfismo

8

Interfaccia Icon (2)

• Un’interfaccia non contiene una realizzazione di funzionalità. Specifica semplicemente un insieme di metodi. • Qualsiasi classe che implementi l’interfaccia Icon ha due responsabilità: – Fornire la dimensione dell’icona – Disegnare l’icona.

Sandro Pedrazzini

Interfacce e polimorfismo

9

Interfaccia Icon (3)

• Il parametro Component di paintIcon() rappresenta il componente grafico che deve contenere l’immagine. Da questo è possibile ottenere alcune proprietà, come il colore dello sfondo, il font, ecc. • È quindi possibile disegnare l’immagine nell’area grafica (Graphics) in modo che si adatti al contesto in cui viene disegnata.

Sandro Pedrazzini

Interfacce e polimorfismo

10

Implementazione (1)

• Realizziamo una classe WorldIcon che implementa Icon. • La classe disegna un cerchio rappresentante il mondo. • Un oggetto di questa classe potrà essere passato al metodo showMessageDialog(), che non ha bisogno di conoscere la classe WorldIcon. Gli basta sapere che si comporta come (implementa) Icon.

Sandro Pedrazzini

Interfacce e polimorfismo

11

Implementazione (2)

Icon paintIcon(…)

ImageIcon paintIcon(…)

Sandro Pedrazzini

WorldIcon paintIcon(…)

Interfacce e polimorfismo

12

Implementazione (2) public class WorldIcon implements Icon{ private int fSize; public WorldIcon(int size){ fSize = size; } public void paintIcon(Component c, Graphics g, int x, int y) { Graphics2D g2 = (Graphics2D)g; Ellipse2D.Double world = new Ellipse2D.Double(x,y,fSize, fSize); g2.setColor(Color.BLUE); g2.fill(world); } public int getIconWidth() { return fSize; } public int getIconHeight() { return fSize; } } Sandro Pedrazzini

Interfacce e polimorfismo

13

Utilizzo JOptionPane.showMessageDialog( null,"Hello World", "message dialog", JOptionPane.INFORMATION_MESSAGE, new WorldIcon(60));

Sandro Pedrazzini

Interfacce e polimorfismo

14

Considerazioni (1)

• Chi realizza il metodo showMessageDialog() non ha nessuna idea di quale tipo di icona verrà passata. • Le classi utilizzate per realizzare l’icona possono essere completamente diverse. L’unica cosa in comune consiste nell’implementare l’interfaccia Icon. • Solo quando viene chiamato in showMessageDialog() un metodo di Icon, l’interprete Java cerca di identificare il vero tipo dell’oggetto.

Sandro Pedrazzini

Interfacce e polimorfismo

15

Considerazioni (2)

• Il polimorfismo è caratterizzato proprio da questa capacità di selezionare il metodo appropriato per un certo oggetto. • Un utilizzo importante del polimorfismo consiste nel fornire meccanismi che si comportino come accoppiamento rilassato. • Nel nostro caso: il metodo showMessageDialog() non ha bisogno di nessuna informazione di come WorldIcon elabori l’immagine. È solamente interessato alle chiamate all’interfaccia Icon. Non esiste nessun accoppiamento tra JOptionPane e WorldIcon.

Sandro Pedrazzini

Interfacce e polimorfismo

16

Considerazioni (3)

• Quando utilizziamo la classe di una libreria di terzi, prima viene implementata la libreria, poi il nostro programma principale che la utilizza. • Quando creiamo una nostra sottoclasse da usare in modo polimorfico, il programma principale che la utilizza può essere stato implementato da terzi ben prima che noi mettiamo a disposizione la nostra funzionalità specifica => Principio del “framework”

Sandro Pedrazzini

Interfacce e polimorfismo

17

Esempio 2: Comparable

• Altro esempio di codice generico con l’utilizzo del polimorfismo • Metodo statico sort() della classe Collections, in grado di ordinare una lista qualsiasi.

List list = ...; Collections.sort(list);

Sandro Pedrazzini

Interfacce e polimorfismo

18

Comparable (1) • I singoli oggetti della lista possono appartenere a una classe qualsiasi, a patto che implementi l’interfaccia Comparable. public interface Comparable { int compareTo(T other); }

• La chiamata a compareTo() restituisce un valore negativo se l’oggetto invocante precede l’oggetto parametro, zero se i due oggetti sono uguali e un valore positivo

Sandro Pedrazzini

Interfacce e polimorfismo

19

Comparable (2) • Come mai tutti gli oggetti devono essere di tipo Comparable? • Perché l’algoritmo di sort, chiamando compareTo() riesce a decidere gli spostamenti degli oggetti, senza dover conoscere il loro vero tipo.

Comparable object1 = ...; if (object1.compareTo(object2) > 0){ sposta object1 rispetto a object2 }

Sandro Pedrazzini

Interfacce e polimorfismo

20

Comparable (3) Esempio 1: String realizza Comparable

List countries = new ArrayList(); countries.add(“Switzerland); countries.add(“Belgium”); countries.add(“Germany”); Collections.sort(countries); ...

Sandro Pedrazzini

Interfacce e polimorfismo

21

Comparable (4) Esempio 2: Realizzazione di una nuova classe • Criterio di ordinamento: dimensione della superficie del territorio public class Country implements Comparable { private String fName; private double fArea; public Country(String name, double area){ fName = name; fArea = area; } public String getName() { return fName; }

public int compareTo(Country other) { if (fArea < other.getArea()){ return -1; } if (fArea > other.getArea()){ return 1; } return 0; }

public double getArea() { return fArea; }

}

Sandro Pedrazzini

Interfacce e polimorfismo

22

Comparable (5) • Utilizzo della classe Country, con ordinamento secondo la grandezza in km2

public class CountryTry { public static void main(String[] args) { List countries = new ArrayList(); countries.add(new Country("Belgium",77000)); countries.add(new Country("Switzerland",41000)); countries.add(new Country("Uruguay",440000)); ... Collections.sort(countries);

for (Country country : countries){ System.out.println(country.getName() + " " + country.getArea()); } } }

Sandro Pedrazzini

Interfacce e polimorfismo

23

Interfaccia Comparator (1)

• Se ora volessimo ordinare le stesse nazioni dell’esempio 2 in base al nome, invece che in base alla superficie, dovremmo ridefinire il metodo compareTo(). • Oltre che essere scomodo, ci obbligherebbe a definire sottoclassi unicamente per distinguere diversi metodi compareTo() (modifica del design per scopi che con il design nulla hanno a che vedere)

Sandro Pedrazzini

Interfacce e polimorfismo

24

Interfaccia Comparator (2) • Soluzione: utilizzo di un overloading di sort(), che accetta come secondo parametro un oggetto Comparator • Gli oggetti presenti in List vengono ordinati in base all’ordinamento definito in Comparator. class Collections { ... public static void sort(List list, Comparator
View more...

Comments

Copyright © 2017 DOCUMEN Inc.