Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315

    interfacce e classi astratte

    Qual è il reale vantaggio dell'utilizo di una interfaccia piuttosto che di una classe astratta?
    Da quello che ho capito entrambe possiedono metodi astratti e quindi per entrambe bisogna fare override dei metodi nella classe (che estende la classe astratta o che implementa l'interfaccia), e allora perchè utilizzare una piuttosto che l'altra?
    Io ho provato a darmi una risposta e cioè: conviene utilizzare l'interfaccia per simulare l'ereditarietà multipla in quanto utilizzando una classe astratta non potrei avere un'estensione di questo tipo:
    codice:
    public class Classe extends ClasseAstratta1, ClasseAstratta2
    {
    ...
    }
    mentre in questa maniera potrei implementare più interfacce contemporaneamente:
    codice:
    public class Classe implements Interfaccia1, Interfaccia2
    {
    ...
    }
    Tanto alla fine anche in un'interfaccia si possono definire variabili e metodi che voglio che siano ereditabili e quindi a quel punto se voglio ereditare da più parti conviene farlo con le interfacce.

    Giusto?

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    una delle ragioni è questa, un'altra riguarda il fatto che la classe base astratta abbia proprietà/funzionalità tipiche della classe, che non variano al variare della classe figlia e soprattutto che sono utilizzate solo nella gerarchia di classe.

    Es. classe Animale. Ogni animale ha un nome (proprietà generica).
    Il verso di ogni animale è tipico per la razza (Cane, Gatto, Scimmia).

    A priori ogni Animale ha un nome, ma il verso dipende dalla figlia (e quindi lasci il metodo verso astratto in modo da costringere chi deriva a dirmi che verso fa l'animale).
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    beh ma lo stesso non posso farlo anche sfruttando un'interfaccia anzichè una classe astratta? L'unica differenza sarebbe che anzichè estendere una classe astratta dovrei implementare un'interfaccia.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    no, non puoi.
    Se hai il membro "name", dentro l'interfaccia non puoi implementare metodi come getName o setName, che comunque ti interessano per sapere il nome che hai dato all'Animale (dove per nome intendo la razza).

    questa è una proprietà generica, riguarda tutti gli animali, quindi è bene venga messa a monte con una classe astratta.
    Se io usassi una interfaccia, sarei costretta a ripetere i getter e i setter in ogni figlia.
    Questo è un esempio BANALE, puoi non trovarci l'utilità, ma situazioni più complesse risultano opportunamente modellate nei casi in cui devi cmq mettere da parte un comportamento generale
    RTFM Read That F*** Manual!!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    mi sfugge una cosa. in una classe astratta non posso implementare nessun metodo, neanche gli eventuali metodi set e get, giusto? Se si allora la situazione non è la stessa dell'interfaccia? Anche lì non posso implementare gli eventuali metodi set e get che mi servono per "gestire" l'attributo name.


    EDIT: pensandoci però l'attributo name che non è una costante non può essere dichiarato all'interno di una interfaccia e quindi è meglio utilizzare una classe astratta in modo tale che l'attributo name possa essere dichiarato all'interno della classe astratta insieme ai metodi (es. setName() e getName()) senza implementazione che poi saranno implementati nella classe che estende la classe astratta. Giusto?
    Ultima modifica di newutente; 12-11-2014 a 13:48

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da newutente Visualizza il messaggio
    mi sfugge una cosa. in una classe astratta non posso implementare nessun metodo, neanche gli eventuali metodi set e get, giusto? Se si allora la situazione non è la stessa dell'interfaccia? Anche lì non posso implementare gli eventuali metodi set e get che mi servono per "gestire" l'attributo name.
    Una classe astratta può avere tutti i metodi concreti che vuoi.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    si è vero, mi sono confuso.

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Avrei due domande:
    1) Una interfaccia la utilizziamo nel momento in cui vogliamo astrarre un concetto troppo generico e quindi vogliamo che ci sia una implementazione (override) diversa per ogni classe che implementa l'interfaccia?

    2) In una interfaccia si possono dichiarare metodi astratti, metodi di default e metodi statici. I metodi astratti necessitano dell'implementazione nella classe che implementa l'interfaccia, mentre i metodi di default hanno una loro prima implementazione ed eventualmente potrebbero subire l'override nella classe che implementa l'interfaccia. Quello che mi sfugge è l'utilità dei metodi statici. Io, come al solito, provo a dire la mia. I metodi statici hanno una loro implementazione, diciamo un po' come i metodi di default, però a differenza di questi non vengono ereditati nella classe che implementa l'interfaccia e quindi devono essere invocati tramite l'istruzione NomeInterfaccia.nomeMetodoStatico()
    Ma allora la domanda mi sorge spontanea: non sarebbe meglio usare direttamente i metodi di default che hanno il vantaggio di essere ereditati?

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    domanda numero uno:

    non solo per quello, il concetto è generico e puoi astrarlo. Diciamo che con l'interfaccia hai una dichiarazione di intenti e basta, lasci totalmente libero l'utente di implementarla come vuole.
    Per quanto riguarda l'interfaccia, la si preferisce per non bruciarsi l'eredità, puoi pensare che una classe astratta senza membri e senza metodi concreti sia uguale all'interfaccia.

    domanda numero 2

    allora lo statico è sempre una proprietà di classe, devi sempre leggerla in quel modo. Lo statico vive indipendentemente dalla classe, non riguarda una istanza. Sta qui la sottile differenza
    RTFM Read That F*** Manual!!!

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Quote Originariamente inviata da valia Visualizza il messaggio
    Per quanto riguarda l'interfaccia, la si preferisce per non bruciarsi l'eredità
    Ti riferisci al fatto che la si preferisce rispetto ad una classe astratta (che comunque dovrebbe essere ereditata da una classe)?

    Quote Originariamente inviata da valia Visualizza il messaggio
    domanda numero 2

    allora lo statico è sempre una proprietà di classe, devi sempre leggerla in quel modo. Lo statico vive indipendentemente dalla classe, non riguarda una istanza. Sta qui la sottile differenza
    e questo si evince anche dal fatto che per richiamare un metodo astratto non posso fare nomeOggetto.nomeMetodoStatico(), anche perchè un metodo astratto non viene ereditato, ma NomeInterfaccia.nomeMetodoStatico(). 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.