Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [java] Polimorfismo esempio

    Ciao a tutti!
    Ho cercato per questo mio problema sia nel forum che in vari siti come fare, mi sembra che sia un fatto di polimorfismo...non ho capito però come risolverlo

    In pratica ho un'interfaccia:
    codice:
    public interface CodaMutabile{
      void enqueue(Object e);
      CodaMutabileConArray dequeue();
    }
    Poi ho due implementazioni
    codice:
    public class CodaMutabileConArray implements CodaMutabile {
    e
    codice:
    public class CodaMutabileConLinkedList implements CodaMutabile{
    La cosa che non capisco è: nell'interfaccia come faccio a definire il metodo dequeue() di un tipo generico? A fare in modo che diventi un'interfaccia condivisibile da entrambe le classi?
    Perché così solo la classe CodaMutabileConArray non dà errore...

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quello che non è chiaro e che non so perché l'hai fatta così è la dichiarazione nella interfaccia del metodo:

    CodaMutabileConArray dequeue();

    Che centra CodaMutabileConArray come ritorno di dequeue()?? .... nulla.

    Il fatto che una classe CodaMutabileConArray utilizza un array mentre una classe CodaMutabileConLinkedList utilizza un LinkedList è un dettaglio implementativo interno alla classe. Che non dovrebbe avere nulla a che fare con l'interfaccia "pubblica" definita dalla interfaccia.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Originariamente inviato da andbin
    Quello che non è chiaro e che non so perché l'hai fatta così è la dichiarazione nella interfaccia del metodo:

    CodaMutabileConArray dequeue();

    Che centra CodaMutabileConArray come ritorno di dequeue()?? .... nulla.

    Il fatto che una classe CodaMutabileConArray utilizza un array mentre una classe
    Il fatto è che io devo dire nell'interfaccia il tipo restituito da dequeue(), giusto?
    Solo che in CodaMutabileConArray restituisce un "CodaMutabileConArray", nell'altro un "CodaMutabileConLinkedList". Dici che dovrei mettere un tipo di ritorno generico tipo Object?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Lasentinella
    Dici che dovrei mettere un tipo di ritorno generico tipo Object?
    Beh, certo. Non avrebbe senso mettere una delle due classi. enqueue inserisce un elemento, dequeue ne estrae uno ... non una coda!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Originariamente inviato da andbin
    Beh, certo. Non avrebbe senso mettere una delle due classi. enqueue inserisce un elemento, dequeue ne estrae uno ... non una coda!!
    Il fatto è che io in questo caso ho fatto in modo che dequeue() restituisca la coda senza l'elemento tolto (scelte implementative richieste dal professore)

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Lasentinella
    Il fatto è che io in questo caso ho fatto in modo che dequeue() restituisca la coda senza l'elemento tolto (scelte implementative richieste dal professore)
    Allora il metodo nella interfaccia al massimo potrebbe essere:

    CodaMutabile dequeue();

    Ripeto che il fatto che una coda sia fatta internamente con un array o con una lista, è un dettaglio implementativo.

    Nelle due implementazioni concrete puoi fare l'override del metodo dichiarando sempre come tipo di ritorno CodaMutabile, che è quindi il tipo più generico.
    Ma nota, che con Java 5 puoi usare il "return covariante". Visto che CodaMutabileConArray è-un CodaMutabile, allora in CodaMutabileConArray puoi fare l'override mettendo come tipo di ritorno un sottotipo di CodaMutabile, cioè:

    public CodaMutabileConArray dequeue() { ......}


    Comunque a parte queste questioni del linguaggio, vuoi far ritornare la stessa coda (sé stessa)? O una copia con l'elemento in meno?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Comunque a parte queste questioni del linguaggio, vuoi far ritornare la stessa coda (sé stessa)? O una copia con l'elemento in meno?
    Una copia con l'elemento in meno

    Grazie mille per l'aiuto, mi hai fatto scoprire cose che non sapevo!

  8. #8
    Unico altro problema:
    codice:
    boolean equals(CodaMutabile c) throws CloneNotSupportedException;
    Questo è l'unico metodo che mi dà problemi (l'unico con il parametro CodaMutabile), in quanto nell'interfaccia utilizzo quello e nelle due classi al posto di CodaMutabile metto le due code relative..pensavo funzionasse correttamente e invece dà errore "non è una classe astratta e non si può fare l'override"

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Lasentinella
    Unico altro problema:
    codice:
    boolean equals(CodaMutabile c) throws CloneNotSupportedException;
    Questo è l'unico metodo che mi dà problemi (l'unico con il parametro CodaMutabile), in quanto nell'interfaccia utilizzo quello e nelle due classi al posto di CodaMutabile metto le due code relative..pensavo funzionasse correttamente e invece dà errore "non è una classe astratta e non si può fare l'override"
    No alt, stai facendo un po' di confusione. Quello sopra è il metodo equals() che sarebbe pure un overload, visto che il parametro non è Object e comunque CloneNotSupportedException non vedo cosa centra con equals()!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Originariamente inviato da andbin
    No alt, stai facendo un po' di confusione. Quello sopra è il metodo equals() che sarebbe pure un overload, visto che il parametro non è Object e comunque CloneNotSupportedException non vedo cosa centra con equals()!!
    Ehm sì hai ragione, quel throws non ci voleva.
    Non ho capito la frase sull'overload

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.