Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    40

    [java] aiuto per esercizio con ereditarietà e pattern decorator

    Qui vi riporto la consegna dell'esercizio,assolutamente non pretendo che lo fate voi al posto mio,ma dopo che ho postato tale esercizio avrei già delle domande :
    --- Testo dell'esercizio ---

    Consideriamo di modellare il concetto di persona (con nome, cognome,
    data di nascita, codice fiscale) e il fatto che questa persona, oltre ad
    avere dei dati anagrafici, possa anche avere il ruolo di studente, di
    lavoratore o di studente e lavoratore.

    Si vuole:

    - dare una soluzione standard che usi l'ereditarieta` (quattro classi:
    la classe Persona con tre sottoclassi, Studente, Lavoratore,
    StudenteLavoratore) , sapendo discutere quali sono i limiti di questa
    soluzione;

    - dare una soluzione con il design pattern Decorator, in cui Studente e
    Lavoratore hanno la funzione di oggetti decorator; come si modella
    invece StudenteLavoratore? Quali sono i vantaggi di questa soluzione? Se
    si volesse forzare il codice client ad avere al massimo una decorazione
    di tipo Lavoratore e una di tipo Studente per ogni persona, cosa si deve
    fare?

    Per entrambe le soluzioni, presentare un diagramma delle classi e un
    programma Java funzionante, che contenga un metodo StampaInfo il quale:
    - per una persona, stampa nome, cognome, data di nascita, codice fiscale;
    - se è anche lavoratore, stampa anche professione e stipendio;
    - se è anche studente, stampa anche facoltà e corso di laurea.

    --- Fine testo --

    Ora la prima domanda che mi pongo,dato che nell'ereditarietà una classe può avere una sola sopraclasse,quindi la classe persona potrà essere sopra classe della classe studente e lavoratore, la classe StudenteLavoratore non può ereditare sia dalla classe Studente e sia dalla classe lavoratore,cosa mi consigliate di fare? di rendere la classe StudenteLavoratore direttamente sottoclasse della classe Persona come Studente e lavoratore?

  2. #2

    Moderazione

    Java ha una sezione apposita, sposto.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510

    Re: [java] aiuto per esercizio con ereditarietà e pattern decorator

    Originariamente inviato da boxer89
    Ora la prima domanda che mi pongo,dato che nell'ereditarietà una classe può avere una sola sopraclasse,quindi la classe persona potrà essere sopra classe della classe studente e lavoratore, la classe StudenteLavoratore non può ereditare sia dalla classe Studente e sia dalla classe lavoratore,cosa mi consigliate di fare? di rendere la classe StudenteLavoratore direttamente sottoclasse della classe Persona come Studente e lavoratore?
    La classe StudenteLavoratore eredita da Studente, ma siccome studente eredita da persona allora StudenteLavoratore eredita anche i metodi di persona.
    L' ereditarietà multipla causa problemi quando si eredita a cascata da due classi diverse, perché ci possono essere dei metodi ereditati che hanno lo stesso nome.

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Dalla domanda che fai sembra quasi che tu non abbia capito il pattern decorator.

    L'esercizio peraltro è anche abbastanza semplice essendoci una sola classe concreta e due decorator. La classe concreta è quella che normalmente useresti come superclasse e i decorator sono quelle che normalemnte progetteresti come figlie. L'ereditarietà non va bene nel momento in cui c'è la possibilità di creare classi figlie le cui funzionalità non sono altro che la combinazione delle funzionalità di altre classi figlie.
    In questo caso si cerca di isolare queste funzionalità in un interfaccia o una classe base.

    Nel tuo caso la funzionalità comune è StampaInfo, la classe base è Persona. Percio bisogna creare un interfaccia (o classe base astratta) InfoPrinter che dichiari il metodo StampaInfo. InfoPrinter deve implementare la classe base persona.

    Ora non ti resta che implementare due classi decorator (e non tre) Studente e Lavoratore. Entrambe ereditano da InfoPrinter ma poiche questa eredita da persona entrambe sono anche di tipo Persona. Internamente le due classi contengono un istanza dell' oggetto da decorare il tipo di quest'istanza è Persona.
    La chiave di volta di tutto questo apparato sta nell'implementazione del metodo StampaInfo il quale chiamerà prima StampaInfo dell'oggetto interno e poi ci "attaccherà" il proprio comportamento.

    Ti faccio un esempio standard che usa qualche attore in piu rispetto a quanto ti serve per questo specifico esercizio. In una gerarchia di classi, infatti, ci potrebbero essere piu classi da decorare invece che una sola (Persona).
    Non provare a compilare è pseudocodice

    codice:
    public abstract class PersonaAbstract
    {
      public abstract string StampaInfo();
    }
    
    public abstract class PersonaConcrete
    {
      public abstract string StampaInfo()
      {
        //stampa nome e cognome
      }
    }
    
    public abstract class InfoPrinter extends PersonaAbstract
    {
      public abstract string StampaInfo();
    }
    
    public class Studente extends InfoPrinter
    {
      PersonaAbstract inner;
    
      public Studente(PersonaAbstract persona)
      {
        this.inner = persona;
      }
    
      public string StampaInfo()
      {
        persona.StampaInfo() + "Corso: " + Corso;
      }
    }
    
    public class Lavoratore extends InfoPrinter
    {
      PersonaAbstract inner;
    
      public Lavoratore(PersonaAbstract persona)
      {
        this.inner = persona;
      }
    
      public string StampaInfo()
      {
        persona.StampaInfo() + "Lavoro: " + Lavoro;
      }
    }
    e cosi si usano:
    codice:
    //creo una persona
    PersonaAbstract studenteLavoratore = new PersonaConcrete();
    //... inserisco nome e cognome
    studenteLavoratore.Stampainfo(); // stampa nome e cognome
    //lo trasformo in uno studente
    studenteLavoratore = new Studente(studenteLavoratore);
    //...inserisco i suoi dati da studente
    studenteLavoratore.Stampainfo(); // stampa nome e cognome e i dati da studente
    //lo trasformo in uno studente lavoratore
    studenteLavoratore = new Lavoratore(studenteLavoratore);
    //...inserisco i dati da lavoratore
    studenteLavoratore.Stampainfo(); // stampa nome e cognome, i dati da studente e da lavoratore

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.