‫In questa lezione imparerai la differenza fondamentale tra classi di risorse e interfacce durante la progettazione delle
‫applicazioni.
‫È essenziale sapere quando usare una classe astratta e quando usare un'interfaccia e quando nessuna delle due.
‫Le classi e le interfacce astratte sembrano in qualche modo simili, ma ci sono differenze chiave che determineranno quale
‫sia la scelta migliore per ciò che stai cercando di ottenere.
‫Comprendere la differenza tra una classe astratta e un'interfaccia è molto importante, quindi possiamo essere
‫in grado di progettare applicazioni liberamente accoppiate ed estensibili in modo che le applicazioni possano essere modificate e
‫cambiate facilmente senza rompere tutto.
‫Discuteremo di queste differenze e di come decidere quando utilizzare quali in questo video.
‫Ma prima di farlo, rinfreschiamo la memoria sulle classi e le interfacce astratte.
‫Quindi, in primo luogo, le classi astratte e la classe astratta sono una classe incompleta o una classe che non può essere istanziata, il che significa
‫che non possiamo creare oggetti da essa.
‫Lo scopo di una classe astratta è fornire un modello per le classi derivate e impostare alcune regole come
‫ciò che le classi derivate devono implementare.
‫Ma perché dovremmo aver bisogno che una classe sia contrassegnata come una classe astratta per cominciare?
‫Cosa c'è di sbagliato nelle lezioni regolari?
‫Immaginiamo di avere una motocicletta di classe e un'auto di classe e che condividano alcune funzionalità per ridurre la ridondanza
‫del codice.
‫Creiamo una classe base chiamata Vehicle per impedire la creazione di istanze di tipo veicolo e per imporre ogni metodo per
‫implementare la loro versione dei metodi del veicolo.
‫Dobbiamo contrassegnarlo come una classe astratta.
‫Possiamo sfruttare le classi astratte per progettare componenti e specificare un certo livello di funzionalità comuni che
‫devono essere implementate dalle classi giuste.
‫Quindi rendiamo astratto questo veicolo e andrà bene.
‫Ora diamo un'occhiata alle interfacce ancora una volta.
‫Quindi un'interfaccia è un contratto e può contenere solo dichiarazioni di metodo.
‫Non può contenere definizioni di metodo.
‫Definiscono un'abilità che ha una classe.
‫Immaginiamo di avere tre classi.
‫Quindi abbiamo la classe, la bicicletta, la moto e l'auto.
‫E poi vogliamo assicurarci che tutte queste classi ereditino da questo veicolo di classe.
‫E se vuoi aggiungere la funzionalità di guida autonoma alla nostra auto, ad esempio, e vogliamo creare
‫altre classi, ad esempio, che potrebbero creare qualcosa come un aeroplano, non ha senso aggiungere la funzionalità di
‫guida autonoma a il veicolo della migliore classe perché non tutte le nostre sottoclassi avranno questa
‫caratteristica.
‫Sarebbe più conveniente aggiungerlo sotto forma di un'interfaccia chiamata AI self-driving.
‫Quindi queste classi che implementano questa interfaccia possono fornire la logica per realizzarla.
‫Ora, parliamo di somiglianze tra interfacce e classi astratte, sia le interfacce che le classi
‫astratte possono essere istanziate.
‫Significa che non possiamo creare oggetti da loro.
‫Ma entrambi supportano il polimorfismo, il che significa che possiamo memorizzare un oggetto di tipo cad in una variabile di
‫tipo, classe astratta animale.
‫La stessa cosa vale per le interfacce in cui possiamo memorizzare qualsiasi raccolta come un elenco o uno stack in una variabile
‫enumerabile di tipo II.
‫Quindi ora diamo un'occhiata alle differenze chiave.
‫Una classe astratta è progettata per essere ereditata da sottoclassi che implementano o sovrascrivono i suoi metodi.
‫In altre parole, le classi astratte sono implementate parzialmente o non sono implementate affatto.
‫D'altra parte, le interfacce non sono affatto implementate.
‫Quindi una classe astratta non può avere un costruttore opposto a quello.
‫Le classi astratte possono avere costruttori e campi, nonché definizioni di metodo e l'implementazione
‫sarà responsabilità della classe che ha implementato l'interfaccia.
‫D'altra parte, una classe astratta può contenere metodo, definizioni e campi e le interfacce non hanno alcun
‫costruttore, come abbiamo detto, inoltre, non possono avere campi.
‫Quindi ora le classi possono implementare molte interfacce, che è un modo per ottenere una sorta di multi ereditarietà.
‫Poiché teashop è un linguaggio di ereditarietà singola e non lo consente per impostazione predefinita.
‫Tuttavia, una classe può ereditare solo estendere una classe.
‫Quindi se una classe ha implementato un'interfaccia, deve implementare tutti i suoi membri, come proprietà, metodi
‫e così via, d'altra parte, quando una classe estende una classe astratta, deve
‫implementare i suoi membri astratti solo in modo che conoscano la parte non implementata della classe astratta.
‫Diamo un'occhiata a un'analogia qui.
‫Immagina di essere tu un editoriale di un istruttore acuto in cui l'istruttore non può ottenere nulla a meno che non sia un
‫esperto in un argomento o lei sia un'esperta in un argomento perché non possiamo avere istanze di classi astratte.
‫Quindi un istruttore dovrebbe diventare un esperto in un argomento per insegnarlo.
‫Quindi l'istruttore è diventato un esperto di C diesis e ora può insegnare questi diesis a un certo punto l'istruttore di C
‫diesis ha dovuto modificare i video, anche se non tutti gli istruttori devono fare la stessa cosa.
‫Quindi abbiamo implementato l'interfaccia I video editor per farlo funzionare.
‫Quindi non tutti gli istruttori devono essere in grado di modificare, ma quelli che implementano questo editor
‫video dovranno farlo.
‫Va bene.
‫Uno, se scegli l'ereditarietà su un'interfaccia durante la progettazione della classe C shop, le librerie utilizzeranno una classe
‫extra.
‫Se hai alcune funzionalità che desideri, sono le sottoclassi da avere.
‫Ad esempio, se si dispone di un insieme di funzioni, si desidera che le sottoclassi le inseriscano in una classe
‫astratta.
‫La classe astratta viene utilizzata quando la classe derivata condivide le sue proprietà principali e il comportamento della classe
‫astratta, il tipo di comportamento che definisce effettivamente l'interfaccia utente della classe.
‫Se si desidera un contratto generale su un comportamento o una funzionalità, le interfacce sono generalmente allentate rispetto
‫alle classi astratte.
‫Non vorrai usare le interfacce in una situazione in cui scrivi costantemente lo stesso codice per tutti
‫i metodi di interfaccia.
‫Ha usato una classe astratta e ha definito ogni metodo una volta.
‫Quindi un breve riassunto.
‫Quando parliamo di classi astratte, definiamo le caratteristiche di un tipo di oggetto specificando cos'è
‫un oggetto.
‫Quando parliamo di un'interfaccia e definiamo le funzionalità che abbiamo promesso di fornire, stiamo parlando di
‫stabilire un contratto su ciò che l'oggetto può fare.
‫Quindi qual è l'oggetto è una classe astratta, cosa può fare l'oggetto.
‫E interfaccia.
‫Va bene, quindi spero che ti sia piaciuto e hai capito il riassunto e questa panoramica dei
‫due diversi tipi di approcci.
‫E ora andiamo avanti e usiamo quei concetti ed esempi diversi nelle prossime lezioni e nel resto
‫del corso.