• Non ci sono risultati.

Concetti di OOP Concetti di OOP OOP = Object Oriented Programming OOP = Object Oriented Programming OOPS = Object Oriented Mistakes OOPS = Object Oriented Mistakes

N/A
N/A
Protected

Academic year: 2021

Condividi "Concetti di OOP Concetti di OOP OOP = Object Oriented Programming OOP = Object Oriented Programming OOPS = Object Oriented Mistakes OOPS = Object Oriented Mistakes"

Copied!
56
0
0

Testo completo

(1)

Concetti di OOP Concetti di OOP

OOP = Object Oriented Programming OOP = Object Oriented Programming OOPS = Object Oriented Mistakes OOPS = Object Oriented Mistakes

Corso di Programmazione Corso di Programmazione CdS:

CdS: Informatica e Tecnologie Informatica e Tecnologie per la Produzione di Software per la Produzione di Software Nicola Fanizzi Nicola Fanizzi

fanizzi@di.uniba.it

fanizzi@di.uniba.it

(2)

2 2

Introduzione: Concetti OOP Introduzione: Concetti OOP

Oggetti e Classi Oggetti e Classi

classi e istanziazioneclassi e istanziazione

Information Hiding Information Hiding

accessoaccesso publicpublic e e privateprivate

Ereditarietà Ereditarietà

estendere le classi: gerarchiaestendere le classi: gerarchia

ereditarietà multipla: le interfacceereditarietà multipla: le interfacce

accesso accesso protectedprotected

Polimorfismo Polimorfismo

late-bindinglate-binding

già incontrati già incontrati

(3)

3 3

Ereditarietà Ereditarietà

Possibilità di definire nuove classi utilizzando come Possibilità di definire nuove classi utilizzando come punto di partenza classi pre-esistenti

punto di partenza classi pre-esistenti

L'ereditarietà organizza astrazioni di oggetti L'ereditarietà organizza astrazioni di oggetti dai più generici ai più specifici

dai più generici ai più specifici

L'ereditarietà stabilisce una relazione L'ereditarietà stabilisce una relazione

"

" è un è un " "

Esempi:

Esempi:

Una mountain bike Una mountain bike è unè un tipo di bicicletta tipo di bicicletta

Un'utilitaria Un'utilitaria è un tipo di automobileè un tipo di automobile

Un'automobile Un'automobile è un tipo di veicoloè un tipo di veicolo

Un portatile Un portatile è un tipo di computerè un tipo di computer

(4)

4 4

Gerarchia degli Strumenti Gerarchia degli Strumenti

Musicali Musicali

Strumenti Musicali Strumenti Musicali

Idiofoni Idiofoni Membranofoni Membranofoni

Aerofoni Aerofoni

Cordofoni Cordofoni Elettrofoni Elettrofoni

Ad Ancia Ad Ancia

A Canna A Canna A Bocchino A Bocchino

Clarinetto Clarinetto Sassofono Sassofono

Fagotto Fagotto

(5)

5 5

Gerarchia Gerarchia

Strumenti Musicali Strumenti Musicali

La gerarchia aiuta a comprendere le relazioni e le La gerarchia aiuta a comprendere le relazioni e le somiglianze tra gli strumenti musicali

somiglianze tra gli strumenti musicali

Un clarinetto “è un” tipo di strumento a fiatoUn clarinetto “è un” tipo di strumento a fiato

Gli strumenti a fiato “sono un” tipo di aerofonoGli strumenti a fiato “sono un” tipo di aerofono

NB: NB: La relazione La relazione è un è un è è transitiva transitiva

Un clarinetto è unUn clarinetto tipo di strumento a fiato tipo di strumento a fiato

Uno strumento a fiato è unUno strumento a fiato tipo di aerofono tipo di aerofono

Un clarinetto è unUn clarinetto tipo di aerofono tipo di aerofono

(6)

6 6

Estensione: Terminologia Estensione: Terminologia

Estensione Estensione (o (o derivazione derivazione ) di classi ) di classi

definizione di una classe a partire da un’altra classe definizione di una classe a partire da un’altra classe mediante l’aggiunta e/o la specializzazione di

mediante l’aggiunta e/o la specializzazione di caratteristiche (attributi e/o comportamenti) caratteristiche (attributi e/o comportamenti)

classe base

classe base detta anche super-classe detta anche super-classe classe estesa

classe estesa detta anche detta anche derivataderivata ovvero ovvero sotto-classesotto-classe

Clarinetto

Clarinetto StrumentoStrumento ad ancia

ad ancia AerofonoAerofono StrumentoStrumento musicale musicale

(7)

7 7

Estensione Estensione

In Java si utilizza la parola chiave extendsIn Java si utilizza la parola chiave extends nell’intestazione della classe derivata

nell’intestazione della classe derivata

NB:NB: non è constentito estendere più di una classe non è constentito estendere più di una classe

public class Clarinetto public class Clarinetto extends

extends StrumentoAdAncia {...} StrumentoAdAncia {...}

Un oggetto di una sottoclasse, quindi, ha più tipi:Un oggetto di una sottoclasse, quindi, ha più tipi:

per dichiarazione, è del tipo della sottoclasseper dichiarazione, è del tipo della sottoclasse

è un oggetto specializzato del tipo della superclasseè un oggetto specializzato del tipo della superclasse

Clarinetto cl1 = new Clarinetto();

Clarinetto cl1 = new Clarinetto();

(8)

8 8

Classe

Classe Persona Persona

1.1. class Persona { class Persona {

2.2. private String nome;private String nome;

3.3. private String cognome;private String cognome;

4.4.

5.5. public Persona(String nome, String cognome) { public Persona(String nome, String cognome) {

6.

6. this.nome = nome; this.cognome = cognome; this.nome = nome; this.cognome = cognome;

7.7. } }

8.8.

9.

9. public String getNome() { return nome; } public String getNome() { return nome; }

10.10.

11.11. public String getCognome() { return cognome; } public String getCognome() { return cognome; }

12.12.

13.13. public String toString() { public String toString() {

14.14. return getNome() + “ ” + getCognome() + "."; return getNome() + “ ” + getCognome() + ".";

15.

15. } }

(9)

9 9

Classe

Classe Studente Studente

1.1. class Studente extends Persona { class Studente extends Persona {

2.2. private int matricola; private int matricola;

3.3.

4.4. public Studente(String n, String c, int m) { public Studente(String n, String c, int m) {

5.5. super(n, c); super(n, c);

this.matricola = m;

this.matricola = m;

6.6. } }

8.8. public String getMatricola() { public String getMatricola() { return matricola;}

return matricola;}

10.10. public String toString() { public String toString() {

11.

11. return getNome() + "" + getCognome() + return getNome() + "" + getCognome() + ", matr. " + matricola + ".";

", matr. " + matricola + ".";

12.12. } }

} // classe Studente } // classe Studente

(10)

10 10

Uso di Classi Derivate Uso di Classi Derivate

1.1. Persona p1; Persona p1;

2.2. Studente s3; Studente s3;

3.3.

4.4. p1 = new Persona("Guglielmo", "Cancelli"); p1 = new Persona("Guglielmo", "Cancelli");

5.5. System.out.println(p1.getNome()); System.out.println(p1.getNome());

6.6. // Guglielmo // Guglielmo

7.7. System.out.println(p1.toString()); System.out.println(p1.toString());

8.8. // Guglielmo Cancelli. // Guglielmo Cancelli.

9.9.

10.

10.s3 = new Studente("Marisa", "Monte", 123456); s3 = new Studente("Marisa", "Monte", 123456);

11.11.System.out.println(s3.getCognome()); System.out.println(s3.getCognome());

12.12. // Monte // Monte

13.

13.System.out.println(s3.getMatricola()); System.out.println(s3.getMatricola());

14.14. // 123456 // 123456

15.15.System.out.println(s3.toString()); System.out.println(s3.toString());

(11)

11 11

Classi

Classi Persona Persona e e Studente Studente

nome : String cognome : String

Persona(String n, String c) String getNome()

String getCognome() String toString()

Persona

estende

matricola : int

Studente(String n, String c, int m) String getMatricola()

Studente

nome = "Guglielmo"

cognome = "Cancelli"

String getNome() String getCognome() String toString()

p1 : Persona

nome = "Marisa"

cognome = "Monte"

matricola = "123456"

String getNome() String getCognome() String getmatricola()

s3 : Studente

(12)

12 12

Quando viene costruito un nuovo oggetto Quando viene costruito un nuovo oggetto

sottoclasse, viene sempre chiamato il costruttore sottoclasse, viene sempre chiamato il costruttore

per la superclasse per la superclasse

L'invocazione del costruttore della superclasse L'invocazione del costruttore della superclasse può essere:

può essere:

implicitaimplicita

chiamato del costruttore di

chiamato del costruttore di defaultdefault della classe base della classe base

esplicitaesplicita

chiamata di

chiamata di super()super() all'inizio del costruttore della all'inizio del costruttore della classe derivata

classe derivata

Ereditarietà: Costruttori

Ereditarietà: Costruttori

(13)

13 13

Ereditarietà: Costruttori Ereditarietà: Costruttori

public class

public class B { B { public public B() { B() {

System.out.println("B1"); System.out.println("B1");

} }

public public B(int B(int i) i) {{

System.out.println("B2");System.out.println("B2");

} }

} // classe B} // classe B public class

public class C extends C extends B { B { public public C() { C() {

System.out.println("C1"); System.out.println("C1");

System.out.println(); System.out.println();

} }

// segue...

// segue...

//...

//...

publicpublic C( C(intint a) a) {{

System.out.println("C1");

System.out.println("C1");

System.out.println();

System.out.println();

}}

public

public C( C(intint a, a, intint b) b) {{ super

super(a + b);(a + b);

System.out.println("C2");

System.out.println("C2");

System.out.println();

System.out.println();

}}

publicpublic staticstatic voidvoid main main (String[] args)

(String[] args) {{ C o1 =

C o1 = new C();new C();

C o2 =

C o2 = new C(2);new C(2);

C o3 =

C o3 = new C(2,4);new C(2,4);

B1B1 C1C1 B1B1 C2C2 B2B2 C2C2

(14)

14 14

Accesso

Accesso protected protected

Nella definizione di gerarchie di classi, Nella definizione di gerarchie di classi, l’uso dei soli modificatori

l’uso dei soli modificatori public public e e private

private è troppo restrittivo è troppo restrittivo

viene di solito usato il modificatore viene di solito usato il modificatore protected

protected

livello di restrizione dell’accesso intermedio livello di restrizione dell’accesso intermedio

tra tra public public e e private private

(15)

15 15

Accesso

Accesso package package

Un'istruzione packageUn'istruzione package indica che le definizioni successive fanno indica che le definizioni successive fanno parte di una collezione più vasta, detta

parte di una collezione più vasta, detta pacchettopacchetto

Classi (ed interfacce) vanno messe in un pacchettoClassi (ed interfacce) vanno messe in un pacchetto

per motivi organizzativi (modularità)per motivi organizzativi (modularità)

per motivi di accessoper motivi di accesso

Per evitare conflitti sui nomi, Java inserisce le classi di un pacchetto Per evitare conflitti sui nomi, Java inserisce le classi di un pacchetto in uno spazio di nomi (

in uno spazio di nomi (name spacename space) separato e distinto (per ogni ) separato e distinto (per ogni pacchetto).

pacchetto).

Specifica predefinita: ai membri di una classe senza specifica di Specifica predefinita: ai membri di una classe senza specifica di accesso possono accedere solo i membri del pacchetto

accesso possono accedere solo i membri del pacchetto

due classi dello stesso pacchetto hanno implicitamente accesso due classi dello stesso pacchetto hanno implicitamente accesso public

public e protected e protected

(16)

16 16

Diritti di Accesso Diritti di Accesso

 

 

 

 

private private

 

 

 

 

default default

 

 

 

 

protected protected

 

 

 

 

public public

generale generale pacchetto

pacchetto sottoclasse

sottoclasse thisthis

restrizione restrizione per i membri per i membri

(17)

17 17

Controllo dell'Accesso Controllo dell'Accesso

Esempio 1 Esempio 1

package

package demo; demo;

public class

public class P { P { private int

private int data; data;

public

public P() P() {{ setData(0);

setData(0);

}}

public int getData() public int getData() {{

return data;

return data;

}}

protected void setData protected void setData (int v)

(int v) {{

data = v;

data = v;

}}

void print() void print() {{

System.out.println();System.out.println();

}}

} // class P} // class P

(18)

18 18

Controllo dell'Accesso Controllo dell'Accesso

Esempio 2 Esempio 2

import demo.P;

import demo.P;

public class Q extends P public class Q extends P {{ public Q() public Q() {{

super();super();

}}

public Q(int v) public Q(int v) {{ setData(v);setData(v);

  }}

public String toString()public String toString(){{ int v = getData(); int v = getData();

return String.valueOf(v);return String.valueOf(v);

}}

public void invalid1() public void invalid1() {{ data = 12; data = 12;

}}

public void invalid2() public void invalid2() {{ print();print();

}}

} // class Q} // class Q

(19)

19 19

Controllo dell'Accesso Controllo dell'Accesso

Esempio 3 Esempio 3

package demo;

package demo;

public class R public class R {{

private P p;

private P p;

public R() public R() {{

p = new P();

p = new P();

}}

public void set(int v) public void set(int v) {{

p.setData(v);

p.setData(v);

}}

public int get() public int get() {{

return p.getData();

return p.getData();

}}

public void use() public void use() {{

p.print();

p.print();

}}

public void invalid() public void invalid() {{

p.data = 12;

p.data = 12;

}} } } //R//R

(20)

20 20

Controllo dell'Accesso Controllo dell'Accesso

Esempio 4 Esempio 4

import demo.P;

import demo.P;

public class S public class S {{

private P p;

private P p;

public S() public S() {{

p = new P();

p = new P();

}}

public int get() public int get() {{

return p.getData();

return p.getData();

}}

public void illegal1 public void illegal1

(int v) (int v) {{

p.setData(v);

p.setData(v);

}}

public void illegal2 public void illegal2 () {() {

p.data = 12;

p.data = 12;

}}

public void illegal3 public void illegal3 () {() {

p.print();

p.print();

}} } // S} // S

(21)

21 21

Attributi ed Ereditarietà Attributi ed Ereditarietà

Un attributo/metodo di una Un attributo/metodo di una

superclasse può essere nascosto superclasse può essere nascosto

dalla definizione nella sottoclasse dalla definizione nella sottoclasse

di un attributo/metodo con lo di un attributo/metodo con lo

stesso nome

stesso nome

(22)

22 22

Attributi ed Ereditarietà Attributi ed Ereditarietà

public class D public class D {{

protected int d;

protected int d;

public D() public D() {{

d = 0;

d = 0;

}}

public D(int v) public D(int v) {{

d = v;

d = v;

}}

public void printD() public void printD() {{

System.out.println("in D, d =

System.out.println("in D, d = " + d);" + d);

System.out.println();

System.out.println();

}} }}

(23)

23 23

Attributi ed Ereditarietà Attributi ed Ereditarietà

public class F extends D public class F extends D {{

int d;

int d;

public F(int v) public F(int v) {{

d = v;

d = v;

super.d = v*100;

super.d = v*100;

}}

public void printF() public void printF() {{

System.out.println("in D, d =

System.out.println("in D, d = " + super.d);" + super.d);

System.out.println("in F, d =

System.out.println("in F, d = " + this.d);" + this.d);

System.out.println();

System.out.println();

}}

La classe

La classe F estende F estende D e D e introduce una nuova introduce una nuova

variabile istanza variabile istanza dd. .

La definizione di

La definizione di d in d in F F nasconde la definizione nasconde la definizione

eseguita da eseguita da DD

(24)

24 24

Operatore

Operatore instanceof instanceof

1.1. Persona p; Persona p;

2.2. Studente s; Studente s;

4.4. p = new Persona("Antonio", "Stornaiolo"); p = new Persona("Antonio", "Stornaiolo");

5.5. s = new Studente("Emilio", "Solfrizzi", 543210); s = new Studente("Emilio", "Solfrizzi", 543210);

7.7. System.out.println(p instanceof Persona); System.out.println(p instanceof Persona);

8.8. // true // true

9.9. System.out.println(p instanceof Studente); System.out.println(p instanceof Studente);

10.

10. // false // false

11.11.System.out.println(s instanceof Persona); System.out.println(s instanceof Persona);

12.12. // true // true

13.

13.System.out.println(s instanceof Studente); System.out.println(s instanceof Studente);

14.14. // true // true

(25)

25 25

Ereditarietà e Tipi Ereditarietà e Tipi

public class X public class X {{ public X() public X() {{

// corpo non necessario// corpo non necessario }}

public static boolean public static boolean isX(Object v) isX(Object v) {{

return (v instanceof X); return (v instanceof X);

}}

public static booleanpublic static boolean isObj(X v) isObj(X v) {{

return (v instanceof return (v instanceof Object);

Object);

}} } } // X// X

public class Y extends X { public class Y extends X { public Y() {public Y() {

// corpo non necessario // corpo non necessario }}

public static boolean isYpublic static boolean isY (Object v) {

(Object v) {

return (v instanceof Y);

return (v instanceof Y);

}}

// continua...

// continua...

(26)

26 26

Corso di Programmazione (IPSW) © 2004 S.Ferilli & N.Fanizzi - dib - UniBA Corso di Programmazione (IPSW) © 2004 S.Ferilli & N.Fanizzi - dib - UniBA

Ereditarietà e Tipi Ereditarietà e Tipi

public static void public static void

main(String[] args) main(String[] args) {{ X x = new X(); X x = new X();

Y y = new Y(); Y y = new Y();

X z = y; X z = y;

System.out.println("x System.out.println("x is an Object:

is an Object: " + " + X.isObj(x));

X.isObj(x));

System.out.println("x System.out.println("x is an X:

is an X: " + X.isX" + X.isX (x));

(x));

System.out.println("x System.out.println("x is a Y:

is a Y: " + Y.isY(x));" + Y.isY(x));

System.out.println("y System.out.println("y is an Object:

is an Object: " + " + X.isObj(y));

X.isObj(y));

System.out.println("y System.out.println("y is an X:

is an X: " + X.isX" + X.isX (y));

(y));

System.out.println("y System.out.println("y is a Y:

is a Y: " + Y.isY(y));" + Y.isY(y));

System.out.println("z System.out.println("z is an Object:

is an Object: " + " + X.isObj(z));

X.isObj(z));

System.out.println("z System.out.println("z is an X:

is an X: " + X.isX" + X.isX (z));

(z));

System.out.println("z System.out.println("z is a Y:

is a Y: " + Y.isY(z));" + Y.isY(z));

(27)

27 27

Ereditarietà e Tipi Ereditarietà e Tipi

Output del programma:

Output del programma:

x is an Object:

x is an Object: truetrue x is an X:

x is an X: truetrue x is a Y:

x is a Y: falsefalse y is an Object:

y is an Object: truetrue y is an X:

y is an X: truetrue y is a Y:

y is a Y: truetrue z is an Object:

z is an Object: truetrue z is an X:

z is an X: truetrue z is a Y:

z is a Y: truetrue

(28)

28 28

Finalizzazione di Classi Finalizzazione di Classi

Una classe finalUna classe final è una classe che non può essere estesa è una classe che non può essere estesa

Gli sviluppatori potrebbero voler impedire agli utenti di estendere Gli sviluppatori potrebbero voler impedire agli utenti di estendere certe classi

certe classi

Rende più difficile l'intromissione mediante sovrascrittura Rende più difficile l'intromissione mediante sovrascrittura (overriding)

(overriding) final public class

final public class U U {{ // U():

// U(): costruttore predefinitocostruttore predefinito public

public U() U() {{ }}

// f():

// f(): facilitatorefacilitatore public

public voidvoid f() f() {{

System.out.println("f() non può essere sovrascritto:

System.out.println("f() non può essere sovrascritto:

U e' finale");

U e' finale");

}} }}

(29)

29 29

Finalizzazione di Metodi Finalizzazione di Metodi

Un metodo Un metodo final final è un metodo che non può è un metodo che non può essere sovrascritto

essere sovrascritto

public class

public class V V {{ public

public V() V() {{ }}

final

final publicpublic void f() void f() {{

System.out.println("il metodo finale f System.out.println("il metodo finale f () non può essere sovrascritto");

() non può essere sovrascritto");

}} }}

(30)

30 30

Ereditarietà e Polimorfismo Ereditarietà e Polimorfismo

Polimorfismo Polimorfismo letteralmente: da

letteralmente: da molte forme molte forme

un oggetto di una classe viene considerato un oggetto di una classe viene considerato secondo varie sfaccettature

secondo varie sfaccettature

p. di tipo statico e p. di tipo statico e

p. di tipo dinamico ( p. di tipo dinamico ( late binding late binding ) )

in pratica in pratica

è possibile assegnare è possibile assegnare

il riferimento a un oggetto della classe estesa il riferimento a un oggetto della classe estesa

a una variabile il cui tipo è la classe base

a una variabile il cui tipo è la classe base

(31)

31 31

Polimorfismo Polimorfismo

Un'espressione di codice può invocare metodi Un'espressione di codice può invocare metodi diversi a seconda dei tipi di oggetti manipolati diversi a seconda dei tipi di oggetti manipolati

Esempio: Esempio: overloading della funzione come il overloading della funzione come il metodo

metodo min() min() di di java.lang.Math java.lang.Math

Il metodo invocato dipende dai tipi di argomenti Il metodo invocato dipende dai tipi di argomenti effettivi

effettivi

int a, b, c;int a, b, c;

double

double x, y, z; x, y, z;

c = min(a, b);

c = min(a, b); // invoca min() su interi// invoca min() su interi z = min(x, y);

z = min(x, y); // invoca min() su double// invoca min() su double

(32)

32 32

Polimorfismo Polimorfismo

Due tipi di polimorfismo Due tipi di polimorfismo

Polimorfismo Polimorfismo sintattico sintattico : determinare quale : determinare quale metodo invocare in fase di compilazione

metodo invocare in fase di compilazione

Efficiente Efficiente

Facile da comprendere e analizzare Facile da comprendere e analizzare

Detto anche polimorfismo

Detto anche polimorfismo primitivoprimitivo

Polimorfismo Polimorfismo puro puro : il metodo da invocare : il metodo da invocare può essere determinato solo in fase di

può essere determinato solo in fase di esecuzione

esecuzione

(33)

33 33

PolymorphismDemo PolymorphismDemo

// Esempio di polimorfismo puro // Esempio di polimorfismo puro public

public classclass PolymorphismDemo { PolymorphismDemo { public

public static static voidvoid main(String[] args) main(String[] args) {{ Point[] p =

Point[] p = newnew Point[4]; Point[4];

p[0] =

p[0] = newnew Colored3DPoint(4, 4, 4, Color.BLACK); Colored3DPoint(4, 4, 4, Color.BLACK);

p[1] =

p[1] = newnew ThreeDimensionalPoint(2, 2, 2); ThreeDimensionalPoint(2, 2, 2);

p[2] =

p[2] = newnew ColoredPoint(3, 3, Color.RED); ColoredPoint(3, 3, Color.RED);

p[3] =

p[3] = newnew Point(4, 4); Point(4, 4);

for (int i = 0; i < p.length; ++i) for (int i = 0; i < p.length; ++i) {{ String s = p[i].toString();

String s = p[i].toString();

System.out.println("p[" + i + "]:

System.out.println("p[" + i + "]: " + s);" + s);

}}

return return;; }}

(34)

34 34

Polimorfismo Polimorfismo

Esempio Esempio

1.1. Persona r; Persona r;

2.2.

3.3. r = r =

new Studente("Lino", "Torvaldi", 987654);

new Studente("Lino", "Torvaldi", 987654);

4.4.

5.5. System.out.println(r.toString()); System.out.println(r.toString());

6.6. // Lino Torvaldi, matr. 987654. // Lino Torvaldi, matr. 987654.

7.7. // E NON Lino Torvaldi. // E NON Lino Torvaldi.

9.9. System.out.println(r.getMatricola()); System.out.println(r.getMatricola());

10.10. // NO, ERRORE (IN COMPILAZIONE)! // NO, ERRORE (IN COMPILAZIONE)!

(35)

35 35

Late Binding Late Binding

public class L public class L {{

// L():

// L(): costruttore predefinitocostruttore predefinito public L()

public L() {{ }}

// f():

// f(): facilitatorefacilitatore public void f()

public void f() {{

System.out.println("Uso f() di L");

System.out.println("Uso f() di L");

g();g();

}}

// g():

// g(): facilitatorefacilitatore public void g()

public void g() {{

System.out.println("Uso g() di L");

System.out.println("Uso g() di L");

}} }}

(36)

36 36

Late Binding Late Binding

public class M extends L public class M extends L {{

// M():

// M(): costruttore predefinitocostruttore predefinito public M()

public M() { { // nessun corpo necessario// nessun corpo necessario }}

// g():

// g(): facilitatorefacilitatore public void g()

public void g() {{

System.out.println("Uso g() di M");

System.out.println("Uso g() di M");

}}

public static void main(String[] args) public static void main(String[] args) {{

L l = new L();

L l = new L();

M m = new M();

M m = new M();

l.f();

l.f();

m.f();

m.f();

return;

return;

}}

Output Output

Uso f() di L Uso f() di L Uso g() di L Uso g() di L Uso Uso f() di Lf() di L

(37)

37 37

Cast Cast

1.1. Persona p; Persona p;

2.2. Studente s; Studente s;

3.3.

4.4. p = new Studente("Letizia", p = new Studente("Letizia",

"Arnaboldi", 000000);

"Arnaboldi", 000000);

5.5.

6.6. s = (Studente)p; s = (Studente)p;

7.

7. System.out.println("matr." + s.getMatricola()); System.out.println("matr." + s.getMatricola());

8.8. // matr. 000000 // matr. 000000

(38)

38 38

Classe

Classe Object Object

Ogni classe implicitamente o esplicitamenteOgni classe implicitamente o esplicitamente estende la classe più estende la classe più generica

generica ObjectObject,, definita nel package definita nel package java.langjava.lang Metodi

Metodi

toString()toString()

equals()equals()

clone()clone()

getClass()getClass()

finalize()finalize()

hashCode() hashCode()

wait(), wait(long), wait(long,int) wait(), wait(long), wait(long,int)

come si vedrà, i metodi possono essere ridefiniti nelle classi derivatecome si vedrà, i metodi possono essere ridefiniti nelle classi derivate

(39)

39 39

Metodo

Metodo equals equals

Esempio Esempio

1.1. int x,y; // coordinateint x,y; // coordinate

2.2.

3.3. public boolean equals(Punto p) { public boolean equals(Punto p) {

4.4. // pre: p!=null// pre: p!=null

5.

5. return (this.x == p.x) && (this.y == p.y); return (this.x == p.x) && (this.y == p.y);

6.6. } }

7.7.

8.8. public boolean equals(Object p) { public boolean equals(Object p) {

9.9. // pre: p!=null // pre: p!=null

10.10. boolean uguali; boolean uguali;

11.11. if (p instanceof Punto) if (p instanceof Punto)

12.

12. uguali = this.equals((Punto) p); uguali = this.equals((Punto) p);

13.13. else else

14.14. uguali = false; uguali = false;

(40)

40 40

Classi:

Classi:

Ereditarietà e Progettazione Ereditarietà e Progettazione

L’ereditarietà (in generale) è una tecnica L’ereditarietà (in generale) è una tecnica che va tenuta in considerazione nella

che va tenuta in considerazione nella progettazione delle classi

progettazione delle classi

prima prima si progetta la gerarchia delle classi si progetta la gerarchia delle classi

criteri per decidere se una classe può essere definita criteri per decidere se una classe può essere definita

come estensione di una classe come estensione di una classe

poi poi vengono implementate le classi vengono implementate le classi

(41)

41 41

Classi Astratte Classi Astratte

Una Una classe astratta classe astratta è una classe implementata è una classe implementata in modo

in modo parziale parziale

metodi astratti:metodi astratti: viene specificata la loro viene specificata la loro intestazione ma non il loro corpo

intestazione ma non il loro corpo

una classe astratta una classe astratta nonnon può essere istanziata può essere istanziata

Utilità delle classi astratte Utilità delle classi astratte

definire un comportamento comune le classi derivatedefinire un comportamento comune le classi derivate

dichiarare le funzionalità che devono essere dichiarare le funzionalità che devono essere

implementate da tutte le classi che la estendono implementate da tutte le classi che la estendono

una classeuna classe senza metodi astratti è detta senza metodi astratti è detta concretaconcreta

(42)

42 42

Classi Astratte Classi Astratte

Esempio Esempio

Si supponga di voler creare una classe Si supponga di voler creare una classe GeometricObject

GeometricObject

Metodi concreti ragionevoli comprendonoMetodi concreti ragionevoli comprendono

getPosition() getPosition() setPosition() setPosition()

getColor() getColor() setColor() setColor()

paint() paint()

Per tutti tranne Per tutti tranne paint()paint(), è possibile creare , è possibile creare implementazioni.

implementazioni.

Per Per paint()paint(), occorre conoscere il tipo di oggetto da , occorre conoscere il tipo di oggetto da disegnare: è un quadrato, un triangolo ecc.

disegnare: è un quadrato, un triangolo ecc.

Il metodo Il metodo paint()paint() dovrebbe essere un metodo astratto dovrebbe essere un metodo astratto

(43)

43 43

Classi Astratte Classi Astratte

Esempio Esempio

import java.awt.*;

import java.awt.*;

abstract public class GeometricObject abstract public class GeometricObject {{

Point position;

Point position;

Color color;

Color color;

public Point getPosition() public Point getPosition() {{

return position;

return position;

}}

public void setPosition(Point p) public void setPosition(Point p) {{

position = p;

position = p;

}}

public Color getColor() public Color getColor() {{

return color;

return color;

}}

public void setColor(Color c) public void setColor(Color c) {{

color = c;

color = c;

}}

(44)

44 44

Classe Astratta

Classe Astratta Forma Forma

1.1. abstract class Forma { abstract class Forma {

2.2. protected String colore; protected String colore;

3.3.

4.4. public Forma(String colore) { public Forma(String colore) {

5.5. this.colore = colore; this.colore = colore;

6.

6. } }

7.7.

8.8. public String colore() { public String colore() {

9.

9. return colore; return colore;

10.10. } }

11.11.

12.12. // Ogni forma deve saper calcolare la sua area// Ogni forma deve saper calcolare la sua area

13.13. public abstract double area(); public abstract double area();

14.14.

15.

15. } }

(45)

45 45

Classe Concreta

Classe Concreta Quadrato Quadrato

1.1. class Quadrato extends Forma { class Quadrato extends Forma {

2.2. protected double lato; protected double lato;

3.3.

4.4. public Quadrato(double lato, String colore) { public Quadrato(double lato, String colore) {

5.5. super(colore); super(colore);

6.

6. this.lato = lato; this.lato = lato;

7.7. } }

8.8.

9.

9. public double lato() { public double lato() {

10.10. return lato; return lato;

11.11. } }

12.12.

13.13. // Restituisce l'area di questo Quadrato // Restituisce l'area di questo Quadrato

14.14. public double area() { public double area() {

15.

15. return lato*lato; return lato*lato;

(46)

46 46

Classe Concreta

Classe Concreta Cerchio Cerchio

1.1. class Cerchio extends Forma { class Cerchio extends Forma {

2.2. protected double raggio; protected double raggio;

3.3.

4.4. public Cerchio(double raggio, String colore) { public Cerchio(double raggio, String colore) {

5.5. super(colore); super(colore);

6.6. this.raggio = raggio; this.raggio = raggio;

7.7. } }

8.8.

9.9. public double raggio() { public double raggio() {

10.

10. return raggio; return raggio;

11.11. } }

12.12.

13.

13. // Restituisce l'area di questo Cerchio // Restituisce l'area di questo Cerchio

14.14. public double area() { public double area() {

15.15. return raggio*raggio*Math.PI; return raggio*raggio*Math.PI;

(47)

47 47

Esempio Esempio

Uso delle Classi Astratte/Concrete Uso delle Classi Astratte/Concrete

1.1. Quadrato q; Quadrato q; // un quadrato // un quadrato

2.2. Forma fq; Forma fq; // un altro quadrato// un altro quadrato

4.4. q = new Quadrato(5, "bianco"); q = new Quadrato(5, "bianco");

5.5. fq = new Quadrato(10, "rosso"); fq = new Quadrato(10, "rosso");

6.6.

7.7. System.out.println(q.area()); System.out.println(q.area()); // 25.0 // 25.0

8.8. System.out.println(q.colore()); System.out.println(q.colore()); // bianco// bianco

9.9. System.out.println(q.lato()); System.out.println(q.lato()); // 5.0 // 5.0

10.

10.

11.11.System.out.println(fq.area()); System.out.println(fq.area()); // 100.0 // 100.0

12.12.System.out.println(fq.colore()); System.out.println(fq.colore()); // rosso // rosso

13.

13.

14.14.System.out.println(fq.lato());System.out.println(fq.lato());

15.15. // NO, errore di compilazione! // NO, errore di compilazione!

(48)

48 48

Interfacce Interfacce

Una Una interfaccia interfaccia ( ( interface interface ) descrive un ) descrive un insieme di comportamenti

insieme di comportamenti

consiste nella dichiarazione di un certo numero consiste nella dichiarazione di un certo numero di metodi d’istanza e pubblici

di metodi d’istanza e pubblici

i metodi sono considerati implicitamente astratti i metodi sono considerati implicitamente astratti

le variabili sono considerate le variabili sono considerate public public , , final final e e static

static

una classe una classe implementa implementa ( ( implements implements ) una ) una

interfaccia se implementa tutti i metodi d’istanza interfaccia se implementa tutti i metodi d’istanza

dichiarati dall’interfaccia

dichiarati dall’interfaccia

(49)

49 49

Interfacce Interfacce

Un'interfaccia è un modello che specifica Un'interfaccia è un modello che specifica che cosa deve essere presente in una classe che cosa deve essere presente in una classe

che implementa l'interfaccia che implementa l'interfaccia

Un'interfaccia non può specificare nessuna Un'interfaccia non può specificare nessuna implementazione dei metodi

implementazione dei metodi

Tutti i metodi di un'interfaccia sono pubblici Tutti i metodi di un'interfaccia sono pubblici

Tutte le variabili definite in un'interfaccia sono Tutte le variabili definite in un'interfaccia sono public

public , , final final e e static static

(50)

50 50

Interfacce Interfacce

Un'interfaccia per un oggetto colorabile Un'interfaccia per un oggetto colorabile

public

public interfaceinterface Colorable Colorable {{ public Color getColor();

public Color getColor();

public void setColor(Color c);

public void setColor(Color c);

}}

Ora l'interfaccia può essere utilizzata per creare Ora l'interfaccia può essere utilizzata per creare classi che implementano l'interfaccia

classi che implementano l'interfaccia

(51)

51 51

Interfacce Interfacce

import java.awt.*;

import java.awt.*;

public class ColorablePoint public class ColorablePoint

extends Point extends Point implements

implements Colorable Colorable {{ Color color;

Color color;

public ColorablePoint() public ColorablePoint() {{

super();

super();

setColor(Color.blue);

setColor(Color.blue);

}} . . . . . .

Riferimenti

Documenti correlati

questo è chiamato costruttore e è quello chiamato quando un oggetto di questa classe

Let us take an example: an object image will contain the variables which make it possible to define an image (as the size of the image, its mode of compression, the image itself)

• The member objects of your new class are typically private, making them inaccessible to the client programmers who are using the class. • This allows you to change those

Lipari (Scuola Superiore Sant’Anna) OOSD September 23, 2010 4 / 37G. Example

public void setSender(String sender) { /* set sender;*/ } public void setReceiver(String receiver) { /* set receiver;*/ } public void setContent(String content) { /* set content;*/

Lipari (Scuola Superiore Sant’Anna) OO Design Principles October 28, 2011 1 /

Use Extract Method, then call the method from all the places If the code is in two classes derived from the same base class. Use Extract Method and Pull-Up Field If the similar code

Lipari (Scuola Superiore Sant’Anna) Agile Programming November 28, 2011 1 / 67G.