Esercizio Esame Classe Astratte

di il
18 risposte

Esercizio Esame Classe Astratte

Buongiorno a tutti , ho un problema con la realizzazione del codice di questo esercizio. Non capisco se è scritto male il testo oppure non io che non ho ben capito come realizzare una casse astratta. Allora sta di fatto che nella classe astratta mi chiede di generare il codice di due funzioni che sono x() e y() ma io non ho le variabili d'istanza , (ho pensato , le lascio vuote e le compilo nella classe CoordinataXY ma non posso farlo perchè mi da errore)qualcuno può aiutarmi?






18 Risposte

  • Re: Esercizio Esame Classe Astratte

    Ciccio92 ha scritto:


    Buongiorno a tutti , ho un problema con la realizzazione del codice di questo esercizio. Non capisco se è scritto male il testo oppure non io che non ho ben capito come realizzare una casse astratta. Allora sta di fatto che nella classe astratta mi chiede di generare il codice di due funzioni che sono x() e y() ma io non ho le variabili d'istanza , (ho pensato , le lascio vuote e le compilo nella classe CoordinataXY ma non posso farlo perchè mi da errore)qualcuno può aiutarmi?
    Innanzitutto ricorda che non puoi istanziare una classe astratta.

    Questo perché se hai una classe astratta MyAbstract, non puoi fare una new MyAbstract().
    Il compilatore ti darebbe un errore del tipo: MyAbstract is abstract; cannot be instantiated

    Pertanto devi definiriti una classe che eredita da MyAbstract ed istanziare quella classe.

    Poi posta il codice perché così non si capisce bene cosa non riesci a fare.
  • Re: Esercizio Esame Classe Astratte

    CarDeFusco ha scritto:


    Ciccio92 ha scritto:


    Buongiorno a tutti , ho un problema con la realizzazione del codice di questo esercizio. Non capisco se è scritto male il testo oppure non io che non ho ben capito come realizzare una casse astratta. Allora sta di fatto che nella classe astratta mi chiede di generare il codice di due funzioni che sono x() e y() ma io non ho le variabili d'istanza , (ho pensato , le lascio vuote e le compilo nella classe CoordinataXY ma non posso farlo perchè mi da errore)qualcuno può aiutarmi?
    Innanzitutto ricorda che non puoi instanziare una classe astratta.

    Questo perché se hai una classe astratta MyAbstract, non puoi fare una new MyAbstract().
    Il compilatore ti darebbe un errore del tipo: MyAbstract is abstract; cannot be instantiated

    Pertanto devi definiriti una classe che eredita da MyAbstract ed istanziare quella classe.

    Poi posta il codice perché così non si capisce bene cosa non riesci a fare.
    si scusa pensavo avesse caricato le immagini
  • Re: Esercizio Esame Classe Astratte

    Il mio problema è , come faccio a compilare i metodi della classe astratta se non ho le variabili ?
    Se non posso come posso fare affinchè non mi dia errore nella classe e le possa compilare nella classe che ne erediterà i metodi?
  • Re: Esercizio Esame Classe Astratte

    Ciccio92 ha scritto:


    CarDeFusco ha scritto:


    Ciccio92 ha scritto:


    Buongiorno a tutti , ho un problema con la realizzazione del codice di questo esercizio. Non capisco se è scritto male il testo oppure non io che non ho ben capito come realizzare una casse astratta. Allora sta di fatto che nella classe astratta mi chiede di generare il codice di due funzioni che sono x() e y() ma io non ho le variabili d'istanza , (ho pensato , le lascio vuote e le compilo nella classe CoordinataXY ma non posso farlo perchè mi da errore)qualcuno può aiutarmi?
    Innanzitutto ricorda che non puoi instanziare una classe astratta.

    Questo perché se hai una classe astratta MyAbstract, non puoi fare una new MyAbstract().
    Il compilatore ti darebbe un errore del tipo: MyAbstract is abstract; cannot be instantiated

    Pertanto devi definiriti una classe che eredita da MyAbstract ed istanziare quella classe.

    Poi posta il codice perché così non si capisce bene cosa non riesci a fare.
    si scusa pensavo avesse caricato le immagini
    Ed il codice che hai scritto ?
  • Re: Esercizio Esame Classe Astratte

    Ciccio92 ha scritto:


    il mio problema è , come faccio a compilare i metodi della classe astratta se non ho le variabili ?
    Se non posso come posso fare affinchè non mi dia errore nella classe e le possa compilare nella classe che ne erediterà i metodi?
    Per come leggo se non ho capito male alla fine dovrai fare una new della classe CoordinataXY, che eredita da AbstractCoordinata la quale a sua volta eredita dall'interfaccia ICoordinata.
    Questa è la gerarchia che devi creare. Se sei riuscito a fare già qualcosa posta almeno il codice.
  • Re: Esercizio Esame Classe Astratte

    Ciccio92 ha scritto:


    il mio problema è , come faccio a compilare i metodi della classe astratta se non ho le variabili ?
    La interfaccia dichiara solo i metodi (abstract, ovviamente) x() e y(). E fin qui credo non hai dubbi. Nella classe astratta questi metodi NON li devi implementare. Li devi usare nei metodi che devi per forza implementare (perché tra l'altro sono final) che sono distanza e somma. I x() e y() li PUOI invocare anche se sei nella classe astratta (e pur non avendoli) perché poi dovrai per forza estendere la classe astratta per definire una classe concreta e in questa i metodi ci saranno per forza e ovviamente concreti.
    Detto in altro modo: AbstractCoordinata si basa su x()/y() senza sapere DOVE saranno implementati ma solo sapendo che ci sono (dalla interfaccia) e in una sotto-classe concreta sicuramente ci saranno e quindi tutto funzionerà correttamente.
  • Re: Esercizio Esame Classe Astratte

    Nel codice ho lasciato dei commenti per dirvi dove non capisco che non va , grazie davvero per l'aiuto



    Interfaccia ICoordinata
    package esercizio2.coordinata;

    /**
    *
    * @author Alessio
    */
    public interface ICoordinata {
    public double x();
    public double y();
    }
    Classe Astratta AbstractCoordinata
    package esercizio2.coordinata;

    import static java.lang.Math.pow;

    /**
    *
    * @author Alessio
    */
    public abstract class AbstractCoordinata implements ICoordinata{

    public final double distanza(ICoordinata c){
    //Penso di averla fatta bene
    return Math.sqrt(pow((this.x()-c.x()),2)+pow((this.y()-c.y()),2));

    }
    public final ICoordinata somma(ICoordinata c){
    //ho fatto return null perchè so come risolverla ma volevo prima capire il problema di x() e y()

    return null;
    }
    /*il problema viene ora , i due metodi x() e y() non danno errori
    se lascio il throw ma l'esercizio non mi chiede di rilanciare un'eccezione
    cioè in teoria dovrei dichiararle senza implementarle ma se lascio per esempio
    public double x() {} mi da errore perchè vuole per forza un ritorno ma non so che ritornargli */
    @Override
    public double x() {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public double y() {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    }
  • Re: Esercizio Esame Classe Astratte

    Ciccio92 ha scritto:


    Nel codice ho lasciato dei commenti per dirvi dove non capisco che non va , grazie davvero per l'aiuto
    cioè in teoria dovrei dichiararle senza implementarle ma se lascio per esempio
    public double x() {} mi da errore perchè vuole per forza un ritorno ma non so che ritornargli */
    Dalla documentazione della Oracle (https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) :
    An abstract class is a class that is declared abstract—it may or may not include abstract methods. Abstract classes cannot be instantiated, but they can be subclassed.

    An abstract method is a method that is declared without an implementation (without braces, and followed by a semicolon), like this:

    abstract void moveTo(double deltaX, double deltaY);
    Immagino che debba dichiarare i metodi x() ed y() come abstract, altrimenti ti chiede l'implementazione (giustamente), cosa che a quanto vedo tu non hai fatto.

    Sempre nella documentazione puoi trovare questo esempio, spero ti chiarisca le idee:
    abstract class GraphicObject {
        int x, y;
        ...
        void moveTo(int newX, int newY) {
            ...
        }
        abstract void draw();
        abstract void resize();
    }
    Come puoi vedere il metodo moveTo non è dichiarato come abstract ed è implementato, a differenza dei metodi draw e resize dichiarati come abstract e non implementati. A questo punto dovresti avere tutti gli elementi necessari per capire il tuo errore ed apportare le dovute modifiche al codice.
  • Re: Esercizio Esame Classe Astratte

    Ciccio92 ha scritto:


    public interface ICoordinata {
        public double x();
        public double y();
    }
    Questa è ok. Il "public" nei metodi generalmente/tipicamente si omette (sono comunque implicitamente public nelle interfacce) ma è ok metterlo esplicitamente.

    Ciccio92 ha scritto:


    public  abstract class AbstractCoordinata implements ICoordinata{
        // [ ... ]
        
        @Override
        public double x() {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
    
        @Override
        public double y() {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
    }
    
    Questo NON va bene. Non devi proprio implementarli questi due qui in AbstractCoordinata. Tecnicamente è lecito definirli concreti come hai fatto qui. Ma se fai così succede una cosa abbastanza grave: per le sottoclassi manca l'obbligo di implementarli! Ovvero una sottoclasse concreta potrebbe fregarsene, non ridefinirli (poiché sono già concreti in AbstractCoordinata) e quindi poi quando il tuo codice funzionerà con degli oggetti concreti, si schianterà comunque per quei UnsupportedOperationException.

    Quello che devi capire è che in AbstractCoordinata NON è un problema se non hai ancora x() e y() concreti. Li avrai con una sottoclasse concreta che li implementa!
    In AbstractCoordinata puoi tranquillamente ragionare sui concetti di "distanza" e "somma" senza sapere assolutamente DOVE x()/y() saranno implementati. Concentrati appunto sul concetto.

    Quando poi definirai CoordinataXY che sarà concreta, allora lì dovranno essere implementati x() e y() (e che a rigor di logica useranno dei rispettivi campi di istanza).
    Quando istanzierai oggetti di tipo CoordinataXY, se su questi invocherai distanza/somma (di AbstractCoordinata), questi metodi useranno i x() e y() che sono implementati appunto nell'oggetto istanziato cioè in CoordinataXY.
  • Re: Esercizio Esame Classe Astratte

    CarDeFusco ha scritto:


    Ciccio92 ha scritto:


    Nel codice ho lasciato dei commenti per dirvi dove non capisco che non va , grazie davvero per l'aiuto
    cioè in teoria dovrei dichiararle senza implementarle ma se lascio per esempio
    public double x() {} mi da errore perchè vuole per forza un ritorno ma non so che ritornargli */
    Dalla documentazione della Oracle (https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) :
    An abstract class is a class that is declared abstract—it may or may not include abstract methods. Abstract classes cannot be instantiated, but they can be subclassed.

    An abstract method is a method that is declared without an implementation (without braces, and followed by a semicolon), like this:

    abstract void moveTo(double deltaX, double deltaY);
    Immagino che debba dichiarare i metodi x() ed y() come abstract, altrimenti ti chiede l'implementazione (giustamente), cosa che a quanto vedo tu non hai fatto.

    Sempre nella documentazione puoi trovare questo esempio, spero ti chiarisca le idee:
    abstract class GraphicObject {
        int x, y;
        ...
        void moveTo(int newX, int newY) {
            ...
        }
        abstract void draw();
        abstract void resize();
    }
    Come puoi vedere il metodo moveTo non è dichiarato come abstract ed è implementato, a differenza dei metodi draw e resize dichiarati come abstract e non implementati. A questo punto dovresti avere tutti gli elementi necessari per capire il tuo errore ed apportare le dovute modifiche al codice.

    Il fatto è che nel compito non c'è scritto che devono essere abstract i metodi x() e y() , di solito il professore scrive tutto.
    Se non fossero abstract , come potrei implementarli?
    Non avendo variabili d'istanza non so come fare.. =S
  • Re: Esercizio Esame Classe Astratte

    Ciccio92 ha scritto:


    Il fatto è che nel compito non c'è scritto che devono essere abstract i metodi x() e y() , di solito il professore scrive tutto.
    Se non fossero abstract , come potrei implementarli?
    Non avendo variabili d'istanza non so come fare.. =S
    Scusa, non è per criticare (ci mancherebbe ..) ma hai letto il mio ultimo intervento precedente a questo? Perché ho fatto una spiegazione ben precisa e credo chiara.
  • Re: Esercizio Esame Classe Astratte

    Ciccio92 ha scritto:


    CarDeFusco ha scritto:


    Ciccio92 ha scritto:


    Nel codice ho lasciato dei commenti per dirvi dove non capisco che non va , grazie davvero per l'aiuto
    Dalla documentazione della Oracle (https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) :
    An abstract class is a class that is declared abstract—it may or may not include abstract methods. Abstract classes cannot be instantiated, but they can be subclassed.

    An abstract method is a method that is declared without an implementation (without braces, and followed by a semicolon), like this:

    abstract void moveTo(double deltaX, double deltaY);
    Immagino che debba dichiarare i metodi x() ed y() come abstract, altrimenti ti chiede l'implementazione (giustamente), cosa che a quanto vedo tu non hai fatto.

    Sempre nella documentazione puoi trovare questo esempio, spero ti chiarisca le idee:
    abstract class GraphicObject {
        int x, y;
        ...
        void moveTo(int newX, int newY) {
            ...
        }
        abstract void draw();
        abstract void resize();
    }
    Come puoi vedere il metodo moveTo non è dichiarato come abstract ed è implementato, a differenza dei metodi draw e resize dichiarati come abstract e non implementati. A questo punto dovresti avere tutti gli elementi necessari per capire il tuo errore ed apportare le dovute modifiche al codice.

    Il fatto è che nel compito non c'è scritto che devono essere abstract i metodi x() e y() , di solito il professore scrive tutto.
    Se non fossero abstract , come potrei implementarli?
    Non avendo variabili d'istanza non so come fare.. =S
    Se non vuoi implementarli nella classe astratta non puoi non dichiararli abstract. Se invece vuoi implementarli e poi fare @Override nella classe che eredita puoi anche farlo. La regola però è sempre quella, se non li implementi ci metti abstract, se li implementi non ci metti abstract e li reimplementi nella classe che eredita da AbstractCoordinata ovvero CoordinataXY.
  • Re: Esercizio Esame Classe Astratte

    andbin ha scritto:


    Ciccio92 ha scritto:


    Il fatto è che nel compito non c'è scritto che devono essere abstract i metodi x() e y() , di solito il professore scrive tutto.
    Se non fossero abstract , come potrei implementarli?
    Non avendo variabili d'istanza non so come fare.. =S
    Scusa, non è per criticare (ci mancherebbe ..) ma hai letto il mio ultimo intervento precedente a questo? Perché ho fatto una spiegazione ben precisa e credo chiara.
    Sisi l'ho letta , solo che sul file del compito non c'è scritto che x e y devono essere abstract quindi non so come implementarli
  • Re: Esercizio Esame Classe Astratte

    CarDeFusco ha scritto:


    Ciccio92 ha scritto:


    CarDeFusco ha scritto:



    Dalla documentazione della Oracle (https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) :



    Immagino che debba dichiarare i metodi x() ed y() come abstract, altrimenti ti chiede l'implementazione (giustamente), cosa che a quanto vedo tu non hai fatto.

    Sempre nella documentazione puoi trovare questo esempio, spero ti chiarisca le idee:
    abstract class GraphicObject {
        int x, y;
        ...
        void moveTo(int newX, int newY) {
            ...
        }
        abstract void draw();
        abstract void resize();
    }
    Come puoi vedere il metodo moveTo non è dichiarato come abstract ed è implementato, a differenza dei metodi draw e resize dichiarati come abstract e non implementati. A questo punto dovresti avere tutti gli elementi necessari per capire il tuo errore ed apportare le dovute modifiche al codice.

    Il fatto è che nel compito non c'è scritto che devono essere abstract i metodi x() e y() , di solito il professore scrive tutto.
    Se non fossero abstract , come potrei implementarli?
    Non avendo variabili d'istanza non so come fare.. =S
    Se non vuoi implementarli nella classe astratta non puoi non dichiararli abstract. Se invece vuoi implementarli e poi fare @Override nella classe che eredita puoi anche farlo. La regola però è sempre quella, se non li implementi ci metti abstract, se li implementi non ci metti abstract e li reimplementi nella classe che eredita da AbstractCoordinata ovvero CoordinataXY.

    sisi questo l'ho capito , ma come faccio a implementarli non avendo nessuna variabile d'istanza
Devi accedere o registrarti per scrivere nel forum
18 risposte