ESERCIZI Java svolti per università LEZIONE 6 | Polimorfismo, Interfacce, Extends, Implements

Поделиться
HTML-код
  • Опубликовано: 23 дек 2024

Комментарии • 18

  • @CodeBrothers
    @CodeBrothers  Месяц назад

    ✨ System.out.println("Ti piace ciò che facciamo?" } ✨
    🍂☕ Sostienici con un Java Coffee! ko-fi.com/codebrothers 🍂☕
    👾 Entra nella community Discord 🡆 discord.gg/bhA8TTQgGh 👾
    🦾 Clicca sulla mia PLAYLIST con tutti i tutorial di teoria, e ISCRIVITI ADESSO per rimanere aggiornato! 🦾
    Ecco a te: ruclips.net/video/5HC_yoPj43E/видео.html

  • @giuseppemastrosimone342
    @giuseppemastrosimone342 3 года назад +2

    Sempre bellissimi contenuti, complimenti

    • @CodeBrothers
      @CodeBrothers  3 года назад

      Heeeey!! Grazie Beppe, come sempre ci fa molto piacere e spero stai imparando sempre di più 🦾

  • @matteomedori9708
    @matteomedori9708 3 года назад +1

    Video completo e molto chiaro, complimenti!

    • @CodeBrothers
      @CodeBrothers  3 года назад

      Ti ringraziamo moltissimo, ti consiglio la nostra playlist sugli esercizi! 😄

  • @stefaex
    @stefaex 3 года назад +2

    davvero complimenti, secondo me sei portato ad insegnare sta roba.. :)

    • @CodeBrothers
      @CodeBrothers  3 года назад +1

      Ciao Sdeh, ci fa tantissimo piacere grazie! Vedremo di mantenere sempre le aspettative e nel frattempo di continuare con esercizi sempre migliori. Tra qualche tempo uscirà infatti una piccola serie sui giochi da fare in Java ^^

  • @luigimiranda98
    @luigimiranda98 2 года назад +1

    Non ho ben capito l'utilità di una classe nell' implementare due interfacce che hanno lo stesso identico metodo.
    E poi un'altra cosa, forse io non avrò capito al 100% però a me queste classi astratte sembrano quasi inutili da usare, come se le interfacce risolvessero tutti i problemi di abstract class.

    • @CodeBrothers
      @CodeBrothers  2 года назад +1

      Ciao Lu! Ottima domanda, sei l'unico che fin ora se l'è chiesta 😆
      Effettivamente non ha molto senso, anzi, non è nemmeno una buona pratica da seguire! Il contratto molto probabilmente sarebbe rotto (immagina due interfacce per esempio Dottore e Mamma che entrambe hanno il metodo "avvisa", dubito fortemente che ti avviseranno delle stesse cose quando saranno implementate XD) e avresti comportamenti inaspettati.
      Bisognerebbe scegliere metodi con un nome unico in questi casi. "Quelli di Java" semplicemente hanno permesso di implementare tante interfacce visto che non esiste la multiereditarietà e nello sfortunato caso in cui ci fossero metodi uguali almeno il codice non ti si spacca ma puoi metterlo a posto 😉

    • @luigimiranda98
      @luigimiranda98 2 года назад +1

      @@CodeBrothers perfect allora avevo capito bene, e grazie per avermi veramente chiarito while(true){print("molto ");} sull'argomento interfacce.
      Per quanto riguarda invece l'altra domanda? PS Ho aggiornato il commento di prima

    • @CodeBrothers
      @CodeBrothers  2 года назад

      @@luigimiranda98 🤣🤣 grazie per il while infinito ahaha
      Ah ecco perchè non avevo visto l'altra domanda! Certamente, prima di tutto ti chiedo soltanto se hai visto il video che avevamo pubblicato con la spiegazione sulla keyword ABSTRACT così in caso so che altri esempi farti 😇
      ps: mi hai proprio dato lo spunto per fare una lezione dedicata proprio su questo argomento, grazie Lu!

    • @luigimiranda98
      @luigimiranda98 2 года назад

      @@CodeBrothers un while che proviene dal mio essere un c programmer Ahahahaha.
      Si il video l'ho visto e ho anche compreso le differenze tra le due cose, però a questo punto mi sorge spontaneo dire: " su progetti più complessi userei sempre un'interfaccia rispetto una classe astratta".
      L'interfaccia mi permette multiereditarietà, mi permette di non arrivare alla complessità esponenziale, quindi dopo aver visto il video sulle interfacce non riesco a trovare più la collocazione all'utilizzo della classe astratta. Quindi ho paura di non aver capito a fondo la loro differenza e dove mi conviene usare una o l'altra.

    • @CodeBrothers
      @CodeBrothers  2 года назад

      @@luigimiranda98 è un dubbio che viene a tutti 😆 vediamo di risolverlo! Se ti documenterai sul tema vedrai che ci sono modi di pensare veramente variegati sul quando scegliere una metodologia piuttosto che un'altra.
      C'è chi sceglie la classe astratta quando vuole esprimere un idea di "IS A" (e quindi una relazione tra classi per esempio Border Collie IS-A Dog) mentre un'interfaccia viene utilizzata per descrivere le azioni che gli oggetti che la implementano sono in grado di fare (devono rispettare il contratto).
      Quindi già qui riassumendo capiamo che con una interfaccia spieghi COSA sarà in grado di fare quell'oggetto mentre con la classe astratta riuscirai anche a dire COME è fatto quell'oggetto strutturalmente visto che ci possiamo mettere degli instance fields.
      Inoltre ti ricordi il mio esempio nel video? A volte noi non sappiamo A PRIORI come dovrà essere fatto un certo oggetto. Avevamo infatti un pesce che tifava l'italia e un pipistrello con le gambe, erano tutti animali, ma in anticipo tu che ne sapevi? Ecco che ti serviva assolutamente una classe astratta!
      Fermo restando che ha sicuramente senso questo tipo di approccio, nella pratica noi facciamo così:
      - hai dello stato comune da mantenere tra i vari oggetti che estendono la tua classe?
      - Questi oggetti sono legati tra di loro dal punto di vista logico? Fanno parte di un qualcosa di comune? Tipo sono tutti animali, sono tutte auto etc etc?
      - hai del comportamento (ovvero l'implementazione anche parziale di un metodo) da condividere tra le varie implementazioni?
      Se la risposta alle 3 domande è sì, probabilmente ti serve una classe astratta.
      INVECE:
      hai degli oggetti scollegati tra di loro che magari hanno solo bisogno di definire un contratto comune tra di loro e che non condividono COMPORTAMENTO e STATO tra di loro?
      Allora probabilmente dovrai usare una interfaccia.
      Dico probabilmente perchè purtroppo la risposta in Java è sempre "dipende" 🤣
      Non li abbiamo ancora trattati ma le interfacce hanno i metodi di default e questo apre nuove strade alla "condivisione di comportamento tra le classi".
      Non è questo commento il luogo adatto per fare una lezione sui metodi di default ma nella lezione apposita scioglieremo anche questo dubbio.
      Infine ricorda che le classi astratte vanno usate con estrema parsimonia perchè in Java non c'è la multiereditarietà e quindi meglio non creare gerarchie complesse.
      La soluzione è composition over inheritance di cui parleremo ;)
      Fammi sapere se ti è tutto chiaro, un saluto Luigi! 😄

  • @alexdelarge1508
    @alexdelarge1508 7 месяцев назад +1

    Che c'è di strano nell'accedere ad un field statico di un'interfaccia attraverso l'istanza di una classe che implementa quell'interfaccia? Cioè, il contratto dice che ogni classe che implementa quell'interfaccia deve avere quelle caratteristiche, quindi deve possedere anche quella "costante". Se poi creo un oggetto di quella classe, ovviamente deve avere anche quella determinata caratteristica, quella costante, cioè un altezza di 10, perché lo dice l'interfaccia, da contratto.
    Per esempio, se Gatto implementa CanMeow, e CanMeow ha String verso = "miao";, allora è giusto che CanMeow gatto = new Gatto(); possa permetterci di fare gatto.verso e darci "miao".
    Il succo è, il senso di metterlo statico che chiedi nel video, è proprio di riferirsi all'interfaccia, cioè quel field è comune a chiunque estenda l'interfaccia, è una caratteristica di chi la estende.
    Faccio questa domanda perché nel video non dai questa spiegazione (6:20), eppure sembra logica, quindi mi chiedo se sto sbagliando io o se è effettivamente così...

    • @CodeBrothers
      @CodeBrothers  7 месяцев назад

      Ciao Alex! Provo a rispiegarmi a scanso di equivoci, fammi sapere in caso se poi è tutto chiaro 😄
      La cosa strana è che tu hai un field STATICO e quindi si presuppone che non si riferisca ad una ISTANZA particolare.
      Quando tu fai: gatto.verso, a quale scopo lo stai facendo? Perchè lo stai richiamando da una istanza se tanto è statico? Potevi benissimo scrivere CanMeow.VERSO e rendere palese il tutto anche agli altri Dev che magari lavorano con te.
      Non è strano che una istanza ABBIA quel field, d'altronde tutte le istanze lo condivideranno, è strano che tu vada a richiamarlo DA una istanza.

    • @alexdelarge1508
      @alexdelarge1508 7 месяцев назад

      @@CodeBrothers chiaro, quindi è per una migliore leggibilità del codice. grazie