1
00:00:01,220 --> 00:00:07,990
Salve, questa è quasi la vittoria della lotteria nell'ultima lezione che abbiamo visto come le interfacce vengono tipicamente utilizzate.

2
00:00:08,330 --> 00:00:11,220
Quindi capiamo praticamente quando usare le interfacce.

3
00:00:11,660 --> 00:00:18,310
Ma la domanda è: perché sono state usate le interfacce e perché invece le classi astratte non vengono utilizzate.

4
00:00:18,350 --> 00:00:23,330
Quindi seguiremo il consiglio di un articolo Java efficace che risponde a questa domanda.

5
00:00:24,480 --> 00:00:30,730
Ecco l'articolo 18 di Effective Java che consiglia di preferire interfacce o

6
00:00:30,730 --> 00:00:31,910
classi astratte.

7
00:00:32,220 --> 00:00:37,420
Non guardare gli scenari quando dovremmo usare classi astratte.

8
00:00:37,500 --> 00:00:40,370
Vediamo quando dovremmo preferire le interfacce.

9
00:00:40,470 --> 00:00:44,990
Gli elementi che le interfacce sono ideali per la definizione di mix.

10
00:00:45,270 --> 00:00:47,070
Vediamo perché è così.

11
00:00:47,140 --> 00:00:48,120
Sappiamo che ha senso.

12
00:00:48,150 --> 00:00:50,220
Le nostre funzionalità aggiuntive.

13
00:00:50,460 --> 00:00:54,870
Cioè sono come componenti aggiuntivi che le classi potrebbero voler supportare.

14
00:00:55,350 --> 00:01:02,040
Dal momento che le funzionalità di Vixen o aggiuntive che una classe potrebbe voler supportare più di esse Nolfi

15
00:01:02,130 --> 00:01:09,420
usa una classe astratta per definire un mixin, quindi non può essere usata da tutte quelle classi che già estendono qualche altra

16
00:01:09,420 --> 00:01:14,430
classe e che qualche altra classe potrebbe anche essere un servizio di mixaggio .

17
00:01:14,450 --> 00:01:16,130
Le lezioni astratte hanno senso.

18
00:01:16,140 --> 00:01:24,750
Una classe può supportare al massimo un solo mixin. Ma se si utilizza l'interfaccia, non avremmo tali limiti.

19
00:01:24,750 --> 00:01:30,630
Tutto ciò che dobbiamo fare è aggiungere gli attrezzi alla relazione plastica e implementare il metodo

20
00:01:30,630 --> 00:01:31,970
nella nuova interfaccia.

21
00:01:32,370 --> 00:01:40,210
Quindi è facile modificare una classe esistente che sta già estendendo alcune altre classi non del tipo, come la

22
00:01:40,210 --> 00:01:44,450
definizione rappresentata per il comportamento ma senza lo stato coinvolto.

23
00:01:44,530 --> 00:01:52,930
Quindi, per l'interfaccia, ricordate che in questo caso le interfacce sono prive di stateless, ma assicuratevi che anche in futuro

24
00:01:52,930 --> 00:01:58,540
non avreste bisogno di alcuno stato per far parte di questo supertipo.

25
00:01:58,540 --> 00:02:01,800
Ovviamente puoi creare una classe astratta con solo metodi astratti.

26
00:02:02,110 --> 00:02:08,680
Ma ancora una volta non può essere usato da classi che stanno già estendendo qualche altra classe in modo che non debba

27
00:02:08,710 --> 00:02:09,820
andare per interfaccia.

28
00:02:09,820 --> 00:02:15,390
Java non supporta l'ereditarietà multipla.

29
00:02:15,470 --> 00:02:20,060
Quindi la domanda è quando dovremmo preferire le classi astratte.

30
00:02:20,140 --> 00:02:26,260
Se il tipo sta definendo l'identità principale di un sottoprocesso, allora dovresti andare con una classe astratta o

31
00:02:26,260 --> 00:02:29,660
persino avere una classe concreta, ma è un'identità fondamentale.

32
00:02:29,680 --> 00:02:32,970
Sarebbe rappresentato al comportamento in questo stato.

33
00:02:33,100 --> 00:02:37,960
Non puoi usare un'interfaccia qui come interfaccia che conosciamo come apolidi.

34
00:02:38,080 --> 00:02:43,630
Sappiamo che la nostra classe di segnalibri è definita come una classe astratta in quanto rappresenta l'identità

35
00:02:43,630 --> 00:02:45,160
principale delle sue sottoclassi.

36
00:02:45,160 --> 00:02:52,090
Specificamente definisce lo stato usando le variabili protette come la descrizione del titolo dell'ID non

37
00:02:52,090 --> 00:03:00,340
pur mentre ci si trova nell'articolo dice anche che le classi astratte possono essere utilizzate per fornire un'implementazione scheletrica

38
00:03:00,340 --> 00:03:06,460
dell'interfaccia che implementerebbe l'interfaccia e fornirebbe una qualche forma di scheletro di base per

39
00:03:07,270 --> 00:03:08,650
l'implementazione implementazioni.

40
00:03:08,710 --> 00:03:15,100
L'assistenza all'implementazione pro-white per i programmatori che è programmatori può estendere un'implementazione scheletrica e utilizzare

41
00:03:15,340 --> 00:03:21,520
alcune delle implementazioni che i programmatori non dovranno reinventare la logica, risparmiandole così un

42
00:03:22,090 --> 00:03:23,870
po 'di tempo.

43
00:03:23,920 --> 00:03:27,430
E anche eventuali potenziali bug che potrebbero introdurre.

44
00:03:27,430 --> 00:03:32,530
Ovviamente i programmatori sono anche liberi di ignorare la disoccupazione di implementazione scheletrica

45
00:03:32,530 --> 00:03:39,450
o l'interfaccia stessa è un esempio della libreria Java con una classe o una lista dal lavoro

46
00:03:39,500 --> 00:03:46,700
se il pacchetto è implementato per le interfacce e sta estendendo anche la classe astratta che è uno scheletro

47
00:03:46,790 --> 00:03:48,610
implementazione dell'interfaccia di lista.

48
00:03:48,710 --> 00:03:56,060
Quindi è solo approfittando di alcune delle funzionalità fornite con l'API di luglio scorso che fornisce implementazioni di questo tipo

49
00:03:56,060 --> 00:04:02,570
per diverse interfacce, specialmente se si guarda a ciò che si fa con il pacchetto, si troverà

50
00:04:02,900 --> 00:04:06,570
qualcuno disposto a utilizzare le abilità di quel tipo.

51
00:04:07,520 --> 00:04:13,820
Osservando questa gerarchia ci si potrebbe chiedere perché l'ostilità più illecita sia in grado di implementare in modo specifico un'interfaccia di

52
00:04:14,270 --> 00:04:17,100
lista poiché la lista astratta lo sta già facendo.

53
00:04:17,150 --> 00:04:23,300
Non è assolutamente necessario implementarlo esplicitamente in questo caso, ma suppongo che sia fatto

54
00:04:23,300 --> 00:04:25,180
per motivi di chiarezza.

55
00:04:25,380 --> 00:04:28,550
Hai appena dimostrato che la nostra lista è davvero una lista.

56
00:04:28,580 --> 00:04:33,720
In questo modo non è necessario sfogliare l'albero di ereditarietà per conoscere questo fatto.

57
00:04:35,940 --> 00:04:42,210
Per quanto riguarda la convenzione di denominazione, le implementazioni di Skilton iniziano con la parola

58
00:04:42,210 --> 00:04:46,530
chiave abstract seguita dall'interfaccia come nel caso dell'elenco astratto.

59
00:04:46,680 --> 00:04:53,220
Si potrebbe voler ricordare che nella demo over indifferences avevamo un'interfaccia chiamata V che aveva

60
00:04:53,220 --> 00:05:00,750
una sottoclasse astratta chiamata abstract che è fondamentalmente un'implementazione skeleton e che forniva anche l'implementazione per uno

61
00:05:00,780 --> 00:05:07,110
dei metodi astratti ereditati e c'era anche la classe concreta X che esteso questa

62
00:05:07,200 --> 00:05:09,080
classe scheletrica astratta.

63
00:05:09,080 --> 00:05:15,090
Quindi abbiamo già implementato un'implementazione di scheletro su classi astratte che sono ottimi candidati per

64
00:05:15,090 --> 00:05:16,310
tali implementazioni.

65
00:05:17,840 --> 00:05:24,550
Perché no Infine, gli elementi di cui abbiamo bisogno per utilizzare il nostro più cura durante la progettazione delle nostre interfacce.

66
00:05:24,600 --> 00:05:29,580
Se il codice che scrivi è utilizzato solo all'interno della tua organizzazione, molto probabilmente stai bene.

67
00:05:29,820 --> 00:05:36,160
Ma se stai progettando una API pubblica, dovresti fare un brainstorming sulle firme dei metodi.

68
00:05:36,180 --> 00:05:42,530
Una volta che l'API è stata rilasciata e ampiamente utilizzata, sarebbe estremamente difficile apportare modifiche.

69
00:05:42,570 --> 00:05:48,510
Cioè se si aggiungono nuovi metodi in una delle proprie interfacce in una versione successiva, qualsiasi

70
00:05:48,510 --> 00:05:55,010
codice gentile che implementa questa interfaccia non verrà più compilato a meno che non implementi i nuovi metodi.

71
00:05:55,230 --> 00:06:02,580
Ma se i client non ricompilano il codice allora stanno bene e funzionano ancora con il tuo nuovo codice assumendo

72
00:06:02,580 --> 00:06:06,970
che tu abbia usato la stessa versione del compilatore come prima.

73
00:06:07,020 --> 00:06:12,250
Questo è che non hai usato una versione diversa del compilatore per compilare il tuo nuovo codice.

74
00:06:12,690 --> 00:06:15,140
Ma come i clienti cercano di ricompilare.

75
00:06:15,300 --> 00:06:18,920
Quindi vedranno errori di compilazione.

76
00:06:18,990 --> 00:06:24,270
Si può ricordare che questa illustrazione della lezione precedente che stiamo ascoltando in

77
00:06:24,270 --> 00:06:29,950
questa API Gen-Y standard è implementata da altri dischi non di ascolto di popolarità modificati.

78
00:06:30,090 --> 00:06:33,050
Quindi potrebbe rompere il codice in entrambe queste API.

79
00:06:33,210 --> 00:06:36,870
E questo sarebbe un problema molto serio in questo contesto.

80
00:06:36,890 --> 00:06:43,070
Datums dice che se il tuo tipo si evolverà nel tempo, dovresti andare per le classi astratte.

81
00:06:43,400 --> 00:06:45,460
Questo perché con lezioni astratte.

82
00:06:45,630 --> 00:06:51,230
Se aggiungiamo nuovi metodi concreti, vengono automaticamente ereditati dal sottoprocesso.

83
00:06:51,240 --> 00:06:59,550
Tuttavia questa raccomandazione è valida solo fino al 7 luglio a partire dall'8 luglio in poi anche in deface

84
00:06:59,610 --> 00:07:04,490
consente l'aggiunta di nuovi metodi concreti che vengono automaticamente ereditati.

85
00:07:04,480 --> 00:07:09,570
Quindi la facilità di evoluzione non è un grosso problema dall'8 luglio in poi.

86
00:07:09,570 --> 00:07:16,140
Tuttavia, l'aggiunta di metodi astratti sta cambiando. Le firme dei metodi astratti esistenti continuerebbero a infrangere

87
00:07:16,140 --> 00:07:18,820
il codice di tutti gli implementatori.

88
00:07:18,900 --> 00:07:25,690
Quindi, anche con Java 8 dovresti stare attento quando crei le tue interfacce, quindi è tutto qui.

89
00:07:25,690 --> 00:07:26,860
Solo per riassumere

90
00:07:26,870 --> 00:07:30,160
Utilizzare le interfacce se si desidera definire ha senso.

91
00:07:30,430 --> 00:07:37,000
O se vuoi che un buon rappresentante definito faccia il comportamento di sottoclassi ma senza uno stato in-nato, la

92
00:07:37,110 --> 00:07:42,120
ragione principale per questo è che Jawan non supporta l'ereditarietà multipla delle classi.

93
00:07:42,810 --> 00:07:48,510
Se il Rappresentante fa il comportamento con lo stato è ciò che è necessario, allora dovrebbe essere usato il Russell astratto.

94
00:07:48,630 --> 00:07:52,980
Anche le classi astratte sono grandi implementazioni del calcio Whiting.

95
00:07:53,310 --> 00:07:54,210
Questo è tutto.

96
00:07:54,210 --> 00:07:55,080
E grazie.
