Ripasso ereditarietà



Scaricare 0.79 Mb.
01.06.2018
Dimensione del file0.79 Mb.



Ripasso ereditarietà

  • Ripasso ereditarietà

  • Classi astratte

  • Interfacce



L’ereditarietà permette di definire nuove classi partendo da classi sviluppate in precedenza.

  • L’ereditarietà permette di definire nuove classi partendo da classi sviluppate in precedenza.

  • La nuova classe viene definita esprimendo solamente le differenze che essa possiede rispetto alla classe di partenza.

  • L’ereditarietà permette di specificare “il punto di partenza”, cioè la classe base, e le differenze rispetto a questa.



L’ereditarietà può estendersi a più livelli generando quindi una gerarchia di classi.

  • L’ereditarietà può estendersi a più livelli generando quindi una gerarchia di classi.

  • Una classe derivata può, a sua volta, essere base di nuove sottoclassi.

  • Sportivo è sottoclasse di Persona ed è superclasse di Nuotatore, Motociclista e Calciatore.

  • Nella parte alta della gerarchia troviamo le classi generiche, scendendo aumenta il livello di specializzazione.



class Persona {

  • class Persona {

  • }

  • class Sportivo extends Persona {

  • }

  • class Nuotatore extends Sportivo {

  • }

  • class Motociclista extends Sportivo {

  • }

  • class Calciatore extends Sportivo {

  • }



Sono possibili due tipi di ereditarietà:

  • Sono possibili due tipi di ereditarietà:

    • ereditarietà singola
    • ereditarietà multipla
  • L’ereditarietà singola impone ad una sottoclasse di derivare da una sola superclasse.

  • L’esempio presentato precedentemente è un caso di ereditarietà singola: ogni sottoclasse ha una sola classe base, mentre è possibile da una superclasse avere più classi derivate.

  • Vari linguaggi ad oggetti pongono il vincolo dell’ereditarietà singola per problemi di chiarezza e semplicità d’implementazione, Java è uno di questi, C++ non lo è.

  • Non è possibile quindi una definizione di classe del tipo:

    • class A extends B,C


L’ereditarietà multipla si ha quando una sottoclasse deriva da più superclassi

  • L’ereditarietà multipla si ha quando una sottoclasse deriva da più superclassi

  • La classe Quadrato ha due superclassi: PoligonoRegolare e Parallelogramma



Java non prevede ereditarietà multipla fra classi

  • Java non prevede ereditarietà multipla fra classi

  • L’introduzione delle Interfacce permette parzialmente di ovviare a questa limitazione

  • La definizione di Quadrato in pseudolinguaggio è la seguente:

    • Classe Quadrato Deriva Da PoligonoRegolare,Parallelogramma
    • fine Classe Quadrato
  • Quadrato erediterà attributi e metodi sia da PoligonoRegolare che da Parallelogramma



Una classe derivata può differenziarsi dalla classe base aggiungendo nuove caratteristiche:

  • Una classe derivata può differenziarsi dalla classe base aggiungendo nuove caratteristiche:

    • nuovi attributi
    • e/o nuovi metodi
  • in questo caso si parla di estensione.

  • L’esempio relativo alla classe Libro e LibroDiTesto è un esempio di ereditarietà per estensione: la sottoclasse aggiunge nuove caratteristiche ma non altera il comportamento delle funzionalità offerte dalla classe base.



La classe derivata potrebbe però fornire le stesse caratteristiche della classe base differenziandosi invece per il comportamento

  • La classe derivata potrebbe però fornire le stesse caratteristiche della classe base differenziandosi invece per il comportamento

  • Si definisce ereditarietà per ridefinizione (overriding) la situazione in cui uno o più metodi della classe base siano ridefiniti nella classe derivata

  • I metodi avranno quindi la stessa firma (nome e lista di tipi dei parametri) ma differente corpo





Attenzione a non confondere

  • Attenzione a non confondere

  • il sovraccarico dei metodi (overloading) situazione in cui oltre al corpo del metodo è differente anche la sua firma

  • con la ridefinizione (overriding) situazione in cui la firma del metodo è identica ma è differente il corpo



È possibile incontrare situazioni in cui sono presenti sia estensione che ridefinizione

  • È possibile incontrare situazioni in cui sono presenti sia estensione che ridefinizione

  • Nell’esempio presentato in precedenza relativo alla biblioteca scolastica avremmo potuto ridefinire nella classe LibroDiTesto il metodo stampa() per includere la visualizzazione dei nuovi attributi.



La parola chiave this, intesa come riferimento all’oggetto stesso, è utilizzata per eliminare ambiguità o per esplicitare ulteriormente il riferimento ad un attributo o ad un metodo interno.

  • La parola chiave this, intesa come riferimento all’oggetto stesso, è utilizzata per eliminare ambiguità o per esplicitare ulteriormente il riferimento ad un attributo o ad un metodo interno.

  • In una gerarchia di classi può essere necessario far riferimento ad un attributo o metodo della superclasse, in questo caso si utilizza la parola chiave super.



L’ereditarietà facilita il riutilizzo di software estendendone o ridefinendone caratteristiche e comportamenti; è possibile adattare una classe preesistente alle nuove esigenze.

  • L’ereditarietà facilita il riutilizzo di software estendendone o ridefinendone caratteristiche e comportamenti; è possibile adattare una classe preesistente alle nuove esigenze.

  • Specificare le differenze da una classe simile piuttosto che ridefinire completamente la classe facilita enormemente lo sviluppo di nuovi progetti eliminando ridondanza di codice.

  • L’ereditarietà non è un meccanismo di inclusione del codice di una classe base in una derivata. Non c’è copia di codice, ogni modifica della struttura di una classe base si ripercuote automaticamente nelle sue classi derivate



Abbiamo fino ad ora utilizzato il modificatore final per definire attributi non modificabili (costanti)

  • Abbiamo fino ad ora utilizzato il modificatore final per definire attributi non modificabili (costanti)

  • final può essere utilizzato anche per i metodi; anche in questo caso sta a significare la non modificabilità del metodo (un metodo dichiarato final non può essere ridefinito da una sottoclasse)

  • Esistono anche classi definite final che non possono essere estese (una classe dichiarata final non può avere sottoclassi)



Si definiscono metodi astratti quei metodi in cui è presente solo la firma ma non il corpo (il modificatore di un metodo astratto è abstract)

  • Si definiscono metodi astratti quei metodi in cui è presente solo la firma ma non il corpo (il modificatore di un metodo astratto è abstract)

  • Una classe che contiene almeno un metodo astratto si definisce classe astratta e da essa non possono essere istanziati oggetti

  • Le sottoclassi di una classe astratta devono implementare tutti i metodi astratti della classe base o essere a loro volta astratte





Definire la classe astratta Veicolo con gli attributi cilindrata e numero_posti, i metodi: set e get e stampa

  • Definire la classe astratta Veicolo con gli attributi cilindrata e numero_posti, i metodi: set e get e stampa

  • Definire le classi derivate Moto e Automobile, la classe Automobile ha anche l’attributo Euro (valori da 0 a 5)

  • Realizzare una applicazione che utilizza 2 Automobili e 2 Motociclette e utilizza tutti i metodi presenti in queste classi



E’ possibile definirne un’interfaccia esplicitamente mediante un costrutto specifico

  • E’ possibile definirne un’interfaccia esplicitamente mediante un costrutto specifico

      • Interfaccia Risorsa
      • Metodo leggi() Di Tipo Stringa
      • Metodo scrivi(buffer Di Tipo Stringa)
      • Metodo disponibili() Di Tipo Intero
      • Fine Interfaccia Risorsa
  • L’interfaccia di questo esempio definisce le operazioni di un ipotetico oggetto di tipo Risorsa.

  • L’interfaccia non essendo una classe implementata non può essere istanziata direttamente.

  • Per implementare delle risorse dobbiamo implementare i metodi dichiarati dall’interfaccia Risorsa

  • Ma per ogni tipo di risorsa dovranno essere implementati in maniera differente (es. per accedere ad un file si effettueranno operazioni diverse rispetto che per accedere alla rete)



L’interfaccia fornisce uno schema di come dovrà essere strutturata la classe: quali metodi dovranno essere presenti

  • L’interfaccia fornisce uno schema di come dovrà essere strutturata la classe: quali metodi dovranno essere presenti

  • L’interfaccia non fornisce l’implementazione dei metodi ma lascia allo sviluppatore l’onere di scriverli in modo specifico per ognuna delle classi che fa uso dell’interfaccia.

  • L’utilizzo di un’interfaccia è utile quando di devono definire i metodi che dovrà possedere un oggetto senza poterne dare un’implementazione univoca per tutte le tipologie di oggetti che faranno uso dell’interfaccia.

  • Una classe che vuole fare uso di un’interfaccia si dice che la implementa; questo rende obbligatorio l’implementazione di tutti i metodi definiti nell’interfaccia.



public interface Risorsa {

  • public interface Risorsa {

  • public String leggi();

  • public void Scrivi(String buffer);

  • public int disponibili();

  • }

  • public class RisorsaFile implements Risorsa {

  • public String leggi() {

  • // Ritorno il contenuto del file

  • }

  • public void Scrivi(String buffer) {

  • // Scrivo il contenuto di buffer nel file

  • }

  • public int disponibili() {

  • // Ritorno il numero di caratteri disponibili nel file

  • }

  • }



Una classe può implementare anche più di una interfaccia

  • Una classe può implementare anche più di una interfaccia

  • E’ possibile implementare un’interfaccia e contemporaneamente estendere una classe.

  • In questo modo si può ovviare al limite di Java di non possedere l’ereditarietà multipla.

  • Rimane l’inconveniente che utilizzando un’interfaccia per simulare l’ereditarietà multipla è necessario implementarne tutti i metodi, rendendo le scelte di progetto difficili e delicate.



Riprendere l’esercizio relativo ai veicoli sostituendo alla classe astratta Veicolo l’interfaccia MezzoDiTrasporto

  • Riprendere l’esercizio relativo ai veicoli sostituendo alla classe astratta Veicolo l’interfaccia MezzoDiTrasporto





Condividi con i tuoi amici:


©astratto.info 2019
invia messaggio

    Pagina principale