Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    esercizio in java

    salve a tutti, dovrei svolgere questo esercizio in java.
    PREMESSA: sono alle prime armi e ho appena imparato ad usare un'interfaccia in modo ULTRA BASILARE. infatti lo scopo di questo esercizio è solo quello di sfruttare un'interfaccia in modo da "simulare" una sorta di ereditarietà multipla.
    cioe quella di avere una classe che deriva, in un certo senso da piu classi grazie all'implementazione di un interfaccia. (cosa che in java non si puo fare, o meglio, una classe puo essere estesa solo da un altra classe).

    l'esercizio e' il seguente:

    Realizzate le classi e le interfacce necessarie a sviluppare un’applicazione in cui le Persone si
    suddividono in Studenti e Lavoratori. Possono esistere persone semplici, studenti, lavoratori
    ma anche studenti-lavoratori.
    Per le persone deve essere possibile specificare il nome e il cognome, per gli studenti il
    numero di matricola e per i lavoratori il salario mensile.
    Inoltre, sviluppate una classe di test che instanzi e immagazzini due persone semplici, uno
    studente, due lavoratori e uno studente-lavoratore. Inizializzate gli oggetti con valori a vostro
    piacimento. In seguito, il programma dovrà stampare a schermo tutte le informazioni
    contenute negli oggetti creati.


    io l'ho pensata cosi:
    creo una classe padre Persone
    creo una classe Studente che e' la figlia di Persone
    creo una classe Lavoratore che e' la figlia di Persone

    e qui arriva il dunque...
    dato che si vogliono istanziare oggetti Lavoratore-Studente
    devo fare anche la classe Lavoratore-Studente
    l'idea (quella che ho pensato) sarebbe quella di estenderla da studente e da lavoratore, ma siccome posso estenderla solo da una classe, ho deciso di estenderla dalla classe studente.

    a questo punto mancherebbe il numero matricola... (che mi piacerebbe, ma non posso, ereditarlo dalla classe lavoratore).
    allora ecco che creo un interfaccia... ci metto al suo interno una variabile di tipo int chiamata numeroMatricola e la implemento nella classe LavoratreStudente.

    secondo me pero e' una soluzione pessima, molto pessima.
    ma non ho idea di come potrei renderla piu efficace attraverso l'uso delle interfacce.

    qualcuno ha un idea?
    mille grazie
    e buon pesce d'aprile

  2. #2

    Moderazione

    Benvenuto sul forum! Ti ricordo che le discussioni relative a Java non sono trattate qui, ma nell'apposita sottosezione.

    Ora provvedo a spostare il thread, in futuro imposta correttamente la discussione fin da subito; nel frattempo ti consiglio di dare un'occhiata al regolamento.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    ok scusatemi, la prossima volta eviterò di incappare nel medesimo errore.
    qualcuno potrebbe darmi u nconsiglio?

    mille grazie

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Sei partito parlando, giustamente, delle interfacce.
    Ma, poi, hai detto di voler inserire un campo numeroMatricola nell'interfaccia "Studente". Il fatto, però, che un'interfaccia non possa contenere variabili, ma solo metodi, costanti e tipi innestati dovrebbe farti riflettere.

    Allora, hai una classe Persona. Corretto.
    Ora, se questa persona può essere uno Studente, un Lavoratore o uno Studente - Lavoratore, mi viene in mente che Studente e Lavoratore possano essere due interfacce.

    A me verrebbe in mente una modellizzazione di questo tipo:

    - Una classe Persona con tutti gli attributi possibili (nome, cognome, numeroMatricola, salario), la quale, di per sé, non usa né il numeroMatricola, né il salario (quindi, non prevede alcun metodo per la manipolazione di queste informazioni)

    - Un'interfaccia Studente, che permette di manipolare il numeroMatricola
    - Un'interfaccia Lavoratore, che permette di manipolare il salario

    Ora, questa la situazione:

    - Persona è una classe che rappresenta una persona normale
    - Lo studente è una Persona che implementa l'interfaccia Studente
    - Il lavoratore è una Persona che implementa l'interfaccia Lavoratore
    - Lo Studente-Lavoratore è una Persona che implementa entrambe le interfacce

    Non è proprio il massimo, ma nemmeno l'esercizio è il massimo come esempio d'uso delle interfacce, anzi direi che chi l'ha pensato ha egli stesso le idee piuttosto confuse. Ce ne sono di migliori.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    ciao Lele
    Grazie della risposta,

    infatti anche a me è sembrato strano l'esercizio.
    Io in questo esercizio non avrei usato nessuna interfaccia.
    perche ci ritroveremo sembre con un oggetto tra le mani che non usa determinati campi... cioe avrebbe dei campi vuoti, e questo non mi piace.

    quello che io avevo proposto nel primo topic era quello di:
    avere una classe Persona con solo Nome e Cognome
    una classe Studente che è estesa da Persona e che contiene solo la variabile numeroMAtricola
    una classe LAvoratore che e' stesa anch'essa da persona e che contiene solo salario
    e infine una classe StudenteLavoratore che e' figlia di studente e che contiene solamente Salario

    in questo modo ogni oggetto istanziato sfrutta tutti i suoi campi.
    avrei solo la ripetizione del campo salario in lavoratore e in lavoratoreStudente
    che mi sembra meglio di avere campi vuoti per ogni oggetto.

    no?
    fammi sapere
    milel grazie

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Tutto è fattibile.
    Il fatto di avere dei campi non usati non è né meglio, né peggio di altre soluzioni.
    Se l'esercizio, comunque, riguarda le interfacce non credo tu possa esimerti dal usarle.

    Un vantaggio della soluzione proposta da me, rispetto a quella proposta da te, è questa:

    se un domani tu avessi una classe con dei metodi in grado di ricevere una Persona, uno Studente o un Lavoratore, sfruttando le interfacce puoi passare un oggetto Studente-Lavoratore sia al metodo che riceve una Persona, sia al metodo che riceve un Lavoratore, sia al metodo che riceve uno Studente. Con la tua soluzione, una delle ultime due possibilità la perdi, in quanto la classe StudenteLavoratore sarebbe direttamente discendente da Studente o da Lavoratore, ma non da entrambe.

    In quest'ottica ha senso l'uso delle interfacce, ma, ripeto, l'esempio usato non è certamente dei migliori.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    ciao grazie per la risposta
    non ho ben capito il vantaggio che mi hai descritto, cioe com'è possibile che potrei passare ad un metodo della nuova classe (che per esempio riceve una persona)
    sia un oggetto studenteLavoratore o un oggetto Studente o un oggetto Lavoratore

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Supponiamo di avere questi metodi:
    codice:
    usaPersona(Persona p) { ... }
    usaStudente(Studente s) { ... }
    usaLavoratore(Lavoratore l) { ... }
    E di avere queste classi:
    codice:
    class Persona
    class MioStudente extends Persona implements Studente
    class MioLavoratore extends Persona implements Lavoratore
    class MioStudenteLavoratore extends Persona implements Studente, Lavoratore
    Io posso effettuare le seguenti operazioni:
    codice:
    Persona p = new Persona();
    MioStudente s = new MioStudente();
    MioLavoratore l = new MioLavoratore();
    MioStudenteLavoratore sl = new MioStudenteLavoratore();
    
    usaPersona( p );   // Valido, ovvio
    usaPersona( s );   // Tutte le classi estendono Persona, quindi valido
    usaPersona( l );   // Come prima
    usaPersona( sl );   // Come prima
    
    usaStudente( s );   // Ok, è uno Studente
    usaStudente( sl );   // E' sia uno studente, che un lavoratore, quindi ok
    
    usaLavoratore( l );   // Ok, è un Lavoratore
    usaLavoratore( sl );   // E' sia uno studente, che un lavoratore, quindi ok
    L'oggetto "sl" lo posso usare in qualunque metodo perchè:

    1) E' una persona (extends Persona)
    2) E' un lavoratore (implements Lavoratore)
    3) E' uno studente (implements Studente)

    Con la tua gerarchia, uno StudenteLavoratore deriva solo da Studente (non da Lavoratore), quindi potrei usarlo con "usaStudente()", ma non con "usaLavoratore()".

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    grazie mille per l'esempio.
    quindi bisognerebbe mettere in realta, come argomento del metodo usaStudente(nomeInterfaccia variabile)
    cioe il tipo della variabile e' quello dell interfaccia e non quello della classe
    giusto?

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 © 2025 vBulletin Solutions, Inc. All rights reserved.