Esercizio polimorfismo Java

di il
24 risposte

24 Risposte - Pagina 2

  • Re: Esercizio polimorfismo Java

    schumy2000 ha scritto:


    ti ripeto che v.superficie così come è espresso è un errore grave in sede di esame.
    fai un metodo che ti ritorna la superfice.

    Ciao.

    E come??
  • Re: Esercizio polimorfismo Java

    andbin ha scritto:


    paloppa ha scritto:


    public double mediaCosti(int n){
            
            int contatore=0;
            double media=0;
            
            for (int i= 0 ; i<v.length; i++){
            
                if(v[i].superficie>n)
                    contatore++;
                media+=v[i].costo();
            }
           return media/contatore;    
        }
    Guarda che così stai sommando i costi di TUTTE le case e poi lo dividi per il numero di case che sono SOLO quelle con una certa superficie in sù.
    Non ha granchè senso ....
    Perchè scusa? Forse ho sbagliato io omettendo una graffa dopo if, ma se rientra nel caso in cui la superficie e maggiore di n , il contatore avanza, alla variabile media viene sommato il valore costo e poi continua il ciclo for.

    Sbaglio?
  • Re: Esercizio polimorfismo Java

    paloppa ha scritto:


    Perchè scusa? Forse ho sbagliato io omettendo una graffa dopo if
    Appunto. Il media+=v.costo(); è nel for ma fuori dal if. Quindi la sommatoria è su TUTTE le case.
    Mentre l'incremento del contatore è giustamente condizionato dal if.
  • Re: Esercizio polimorfismo Java

    andbin ha scritto:


    paloppa ha scritto:


    Perchè scusa? Forse ho sbagliato io omettendo una graffa dopo if
    Appunto. Il media+=v.costo(); è nel for ma fuori dal if. Quindi la sommatoria è su TUTTE le case.
    Mentre l'incremento del contatore è giustamente condizionato dal if.



    Ok allora metto la graffa dopo la condizione dell'if e la chiudo dopo media*=v

    Dovrebbe essere tutto bene adesso no?
  • Re: Esercizio polimorfismo Java

    andbin ha scritto:


    paloppa ha scritto:


    Perchè scusa? Forse ho sbagliato io omettendo una graffa dopo if
    Appunto. Il media+=v.costo(); è nel for ma fuori dal if. Quindi la sommatoria è su TUTTE le case.
    Mentre l'incremento del contatore è giustamente condizionato dal if.


    Rieccomi qui , ho fatto un nuovo esercizio sul polimorfismo e penso mi sia riuscito.

    Allor il testo dice :
    Si definisca una gerarchia di classi per rappresentare le polizze di un’agenzia di
    assicurazione. Le polizze sono di due tipi: automobilistiche e sulla vita. Per ogni polizza si
    rapresenti il nome del contraente e l’anno di riferimento. Per le polizze automobilistiche si
    rappresenti la potenza dell’auto (in KW). Per le polizze sulla vita si rapresenti il numero di
    anni di durata della polizza.
    Per entrambi i tipi di polizza si definisca un metodo che calcola l’importo annuale della rata
    da pagare: per quelle automobilistiche è 100 più 10 per la potenza, mentre per quelle sulla
    vita è 200 più 20 per il numero di anni di durata.
    Si definisca una classe Archivio che contiene come campo un array V in cui è possibile
    inserire sia polizze automobilistiche che sulla vita.
    Si definisca inoltre un costruttore della classe Archivio che dato un parametro n istanzia il
    vettore V con n elementi, di cui circa un metà polizze automobilistiche e l’altra metà
    polizze sula vita. Si definiscano i campi degli oggetti in modo casuale.
    Si definisca infine un metodo della classe Archivio che, dato un parametro intero a, ed una
    stringa n restituisce l’importo della rata che il contraente di nome n deve pagare nell’anno a.
    Se questa informazione non è presente nell’archivio si restituirà il valore 0.



    Allora io ho fatto tutto. Genero casualmente i campi come giustamente mi dice il testo.

    Per fare le prove ho messo che i numeri casuali me li generi tra 1 e 10 per esempio.

    Volevo vedere inoltre se il risultato che mi usciva era corretto e ho deciso di stampare tutti i campi e farmi il calcolo da solo e vedere se tutto corrispondeva.

    Soltanto che i campi potenzaAuto per esempio non so come stamparlo.

    Per i campi nomeContraente e annoRiferimento li stampo facendo puntare l'array alla variabile ( che si trova nella sovraclasse) mentre per stampare per esempio una proprietà di una sottoclasse come posso fare??

    Qui vi posto il metodo importoRata (l'ultimo passo dell'esercizio)

     public double importoRata(String n , int a){
            double media=0;
           // n="Contraente"+(int)(Math.random()*50);
           // a=(int)(Math.random()*200);
            
            for (int i=0 ; i<v.length; i++){
                if ( n.equals(v[i].nomeContraente) && a!=v[i].annoRiferimento)
                    
                    return v[i].importoAnnualePolizza();
            
            else
                  return media;
            }
       return media;   
    }

    E qui il metodo stampa
     public void stampa(){
            for (int i=0 ; i<v.length; i++){
                
                System.out.println("Nome Persona " + v[i].nomeContraente);
                System.out.println("Anno riferimento " + v[i].annoRiferimento);
                
                
                
            
        }
    }
  • Re: Esercizio polimorfismo Java

    paloppa ha scritto:


    Qui vi posto il metodo importoRata (l'ultimo passo dell'esercizio)
    Mi spiace ma continui a postare solo pezzetti di codice (che dicono relativamente poco, senza vedere l'architettura delle classi) e oltretutto continuiamo a vedere che usi un po' campi (v.nomeContraente) e un po' metodi (v.importoAnnualePolizza()) per accedere alle informazioni. E già questo è discutibile.
  • Re: Esercizio polimorfismo Java

    andbin ha scritto:


    paloppa ha scritto:


    Qui vi posto il metodo importoRata (l'ultimo passo dell'esercizio)
    Mi spiace ma continui a postare solo pezzetti di codice (che dicono relativamente poco, senza vedere l'architettura delle classi) e oltretutto continuiamo a vedere che usi un po' campi (v.nomeContraente) e un po' metodi (v.importoAnnualePolizza()) per accedere alle informazioni. E già questo è discutibile.

    Ok allora ti posto tutto il codice e vediamo di migliorare un po la sintassi dell'esercizio.


    Sovraclasse
    
    package gerarchia20settembre201;
    
    
    public abstract class Polizza {
        
        String nomeContraente;
        int annoRiferimento;
        
        public Polizza (String nomeContraente , int annoRiferimento){
            this.nomeContraente=nomeContraente;
            this.annoRiferimento=annoRiferimento;
        }
        
        public abstract double importoAnnualePolizza();
        
        
        
    }
    
    Sottoclasse Vita
    
    package gerarchia20settembre201;
    
    
    
    
    public class Vita extends Polizza {
        
        int anniDurataPolizza;
        
        public Vita(String nomeContraente , int annoRiferimento , int anniDurataPolizza){
            
            super(nomeContraente , annoRiferimento);
            this.anniDurataPolizza=anniDurataPolizza;
        }
        
        public double importoAnnualePolizza(){
           return 200+ 20*anniDurataPolizza;
        }
        
    }
    

    Sottoclasse Automobilista
    package gerarchia20settembre201;
    
    
    public class Automobilistica extends Polizza {
        
        int potenzaAuto;
        
        public Automobilistica(String nomeContraente , int annoRiferimento , int potenzaAuto){
            super(nomeContraente , annoRiferimento);
            this.potenzaAuto=potenzaAuto;
            
        }
        
        public double importoAnnualePolizza(){
            return 100 + 10*potenzaAuto;
        }
        
        
        
    }
    
    Classe Archivio
    
    
    
    package gerarchia20settembre201;
    
    
    public class Archivio {
        
        Polizza v[];
        
        public Archivio(int n , int m){
            
            v= new Polizza[n+m];
            
            for(int i= 0 ; i<n ; i++)
                v[i]=new Automobilistica ("Contraente" + (int)(Math.random()*10) ,(int)(Math.random()*10) , (int)(Math.random()*10) );
                
            
            for(int i=n ; i<v.length ; i++)
                 v[i]=new Vita ("Contraente" + (int)(Math.random()*10) ,(int)(Math.random()*10) , (int)(Math.random()*10) );
        }
        
        
        public double importoRata(String n , int a){
            double media=0;
           // n="Contraente"+(int)(Math.random()*50);
           // a=(int)(Math.random()*200);
            
            for (int i=0 ; i<v.length; i++){
                if ( n.equals(v[i].nomeContraente) && a!=v[i].annoRiferimento)
                    
                    return v[i].importoAnnualePolizza();
            
            else
                  return media;
            }
       return media;   
    }
        
        public void stampa(){
            for (int i=0 ; i<v.length; i++){
                
                System.out.println("Nome Persona " + v[i].nomeContraente);
                System.out.println("Anno riferimento " + v[i].annoRiferimento);
                
                
                
            
        }
    }
    }

    Main
    
    package gerarchia20settembre201;
    
    
    
    public class Gerarchia20Settembre201 {
    
       
        public static void main(String[] args) {
            
            Archivio oggetto= new Archivio(10,0);
            
            oggetto.stampa();
            
            System.out.println("\n" + oggetto.importoRata("Contraente4",2 ));
         
            
            
            
        }
        
    }
    
  • Re: Esercizio polimorfismo Java

    paloppa ha scritto:


    Ok allora ti posto tutto il codice e vediamo di migliorare un po la sintassi dell'esercizio.
    Innanzitutto i campi di istanza si mettono tipicamente private. Talvolta (e solo per certi tipi di design delle classi) possono essere protected, raramente hanno il livello di default (=package level) come nel tuo caso e quasi mai public.

    Quindi: tieni i campi private e poi definisci dei metodi "accessori" getter e/o setter.

    paloppa ha scritto:


    Soltanto che i campi potenzaAuto per esempio non so come stamparlo.
    Tornando a questo tuo problema, la questione è semplice: l'array è di tipo Polizza (la classe base astratta) e solo "vedendo" un oggetto come tipo Polizza NON puoi accedere a metodi/campi specifici di una sottoclasse.
    Dovresti fare un cast (down-cast per la precisione) al tipo specifico ma chiaramente devi assicurarti che l'oggetto sia realmente di quel tipo, tipicamente con l'operatore instanceof

    In alternativa (e che comunque vale in generale) conviene che ciascuna classe ridefinisca toString() in modo che poi puoi stampare la descrizione degli oggetti senza dover sapere a priori di che tipo siano.
  • Re: Esercizio polimorfismo Java

    andbin ha scritto:


    paloppa ha scritto:


    Ok allora ti posto tutto il codice e vediamo di migliorare un po la sintassi dell'esercizio.
    Innanzitutto i campi di istanza si mettono tipicamente private. Talvolta (e solo per certi tipi di design delle classi) possono essere protected, raramente hanno il livello di default (=package level) come nel tuo caso e quasi mai public.

    Quindi: tieni i campi private e poi definisci dei metodi "accessori" getter e/o setter.

    paloppa ha scritto:


    Soltanto che i campi potenzaAuto per esempio non so come stamparlo.
    Tornando a questo tuo problema, la questione è semplice: l'array è di tipo Polizza (la classe base astratta) e solo "vedendo" un oggetto come tipo Polizza NON puoi accedere a metodi/campi specifici di una sottoclasse.
    Dovresti fare un cast (down-cast per la precisione) al tipo specifico ma chiaramente devi assicurarti che l'oggetto sia realmente di quel tipo, tipicamente con l'operatore instanceof

    In alternativa (e che comunque vale in generale) conviene che ciascuna classe ridefinisca toString() in modo che poi puoi stampare la descrizione degli oggetti senza dover sapere a priori di che tipo siano.

    Risposte chiaramente esaustive e ti ringrazio. Per quanto riguarda il discorso della instanziazione , il professore penso che gli vadano bene anche delle istanziazioni di default perchè nel compito sicuramente vorrà vedere l'utilizzo del polimorfismo , overriding ecc!!

    Certo , se le instanziassi private , poi dovrei fare un metodo get per richiamarle.

    Per quanto riguarda il metodo toString() ho letto un po su internet ma non ho capito la sintassi come va applicata.

    Dichiaro per esempio
    public String toString(){
            return ("Potenza auto : " + potenzaAuto);
        }
    nella sottoclasse Automobilistica. E poi? dove e come la richiamo?
  • Re: Esercizio polimorfismo Java

    paloppa ha scritto:


    Per quanto riguarda il discorso della instanziazione , il professore penso che gli vadano bene anche delle istanziazioni di default perchè nel compito sicuramente vorrà vedere l'utilizzo del polimorfismo , overriding ecc!!
    Le variabili di istanza non c'entrano nulla con il concetto di "override". L'overriding si applica solo ai metodi di istanza (quelli che chiaramente sono ereditabili da una sotto-classe e quindi ridefinibili).

    paloppa ha scritto:


    Certo , se le instanziassi private , poi dovrei fare un metodo get per richiamarle.
    Sì, appunto quello che dovresti fare.

    paloppa ha scritto:


    Per quanto riguarda il metodo toString() ho letto un po su internet ma non ho capito la sintassi come va applicata.
    toString() deve semplicemente restituire una stringa che "descrive" l'oggetto. Sovente è una stringa con un formato molto tecnico es.
    per la classe java.awt.Rectangle "java.awt.Rectangle[x=10,y=20,width=30,height=40]" ma alla fine il formato in questi casi lo decidi tu.

    paloppa ha scritto:


    E poi? dove e come la richiamo?
    System.out.println(v);

    dove (v è il tuo array).

    E println invoca il toString per ottenere la stringa da stampare.
Devi accedere o registrarti per scrivere nel forum
24 risposte