1 00:00:01,070 --> 00:00:33,340 Pues aquí, por ejemplo, como que tenemos esto muy repe, ¿no? Estas dos sentencias de instance of. ¿Podríamos agruparlas en una? Pues sí, podemos agruparlas en una si nos damos cuenta de lo siguiente, que también tiene que ver con lo que tú me preguntaste al principio de la clase, que te dije, si implementas una, también las de arriba. ¿Vale? Que era esta cosa de aquí. ¿Dónde está esto? ¿Vale? Que era esto de aquí. 2 00:00:33,340 --> 00:00:39,090 Teníamos el envío normal 3 00:00:39,090 --> 00:00:41,630 De envío hereda 4 00:00:41,630 --> 00:00:43,969 Envío rastreable 5 00:00:43,969 --> 00:00:46,670 De envío rastreable 6 00:00:46,670 --> 00:00:47,369 Hereda 7 00:00:47,369 --> 00:00:49,310 Envío urgente 8 00:00:49,310 --> 00:00:51,310 Y envío 9 00:00:51,310 --> 00:00:53,469 No me lo digáis 10 00:00:53,469 --> 00:00:55,130 Que tengo que desarrollar 11 00:00:55,130 --> 00:00:59,829 Jolines 12 00:00:59,829 --> 00:01:01,409 No me lo digáis 13 00:01:01,409 --> 00:01:03,670 Que tengo que desarrollar la memoria 14 00:01:03,670 --> 00:01:06,409 No me digáis la letra 15 00:01:06,409 --> 00:01:22,409 El envío rastreable, el estándar, concha, este, el envío estándar. Y luego teníamos el envío refrigerado. Y el envío refrigerado heredaba directamente de envío. 16 00:01:22,409 --> 00:01:42,829 Y luego, además, los envíos podían ser o no asegurables, para lo cual teníamos la interfaz asegurable. ¿Y qué envíos eran asegurables? Pues este implementaba asegurable el refrigerado y el urgente también implementaba asegurable, ¿verdad? Los dos, creo recordar. 17 00:01:42,829 --> 00:01:59,689 Vale, esta era nuestra jerarquía. Entonces, de estos solo se pueden instanciar tres cosas. Solo se puede instanciar este, solo se puede instanciar este y solo se puede instanciar este, ya sé. No te mueras ahora, porque estás en clase y te pueden echar a mirar a culpa. 18 00:01:59,689 --> 00:02:03,609 en otro momento 19 00:02:03,609 --> 00:02:04,469 ya yo, eres libre 20 00:02:04,469 --> 00:02:08,289 vale, entonces 21 00:02:08,289 --> 00:02:11,550 estas dos son clases abstractas 22 00:02:11,550 --> 00:02:12,949 no se pueden instanciar objetos 23 00:02:12,949 --> 00:02:14,810 y esta es interfaz 24 00:02:14,810 --> 00:02:17,250 no se puede instanciar objetos, se usan solo 25 00:02:17,250 --> 00:02:19,389 para dar un diseño unificado 26 00:02:19,389 --> 00:02:20,729 vale 27 00:02:20,729 --> 00:02:21,849 entonces 28 00:02:21,849 --> 00:02:24,629 el instance of 29 00:02:24,629 --> 00:02:26,710 puede llevar un poquito a error 30 00:02:26,710 --> 00:02:29,449 porque el instance of, como lo hemos usado 31 00:02:29,449 --> 00:02:31,310 hasta ahora, lo hemos 32 00:02:31,310 --> 00:02:33,189 usado, si este objeto x 33 00:02:33,189 --> 00:02:35,270 es una instancia de 34 00:02:35,270 --> 00:02:37,289 esta clase c, pues me dará true 35 00:02:37,289 --> 00:02:38,810 entonces 36 00:02:38,810 --> 00:02:41,530 el uso que hemos hecho del instance 37 00:02:41,530 --> 00:02:43,050 of hasta ahora 38 00:02:43,050 --> 00:02:45,490 era para devolverme 39 00:02:45,490 --> 00:02:47,189 true o false, si este 40 00:02:47,189 --> 00:02:49,810 objeto x se instanció 41 00:02:49,810 --> 00:02:52,620 es decir 42 00:02:52,620 --> 00:02:54,740 acompañó al new de esta clase 43 00:02:54,740 --> 00:02:56,659 se instanció como esta clase, es el uso que hemos 44 00:02:56,659 --> 00:02:57,240 dado hasta ahora 45 00:02:57,240 --> 00:03:00,120 pero ahora añado 46 00:03:00,120 --> 00:03:02,199 si un objeto 47 00:03:02,199 --> 00:03:03,879 se ha instanciado como este 48 00:03:03,879 --> 00:03:06,000 o como este o como este, es decir 49 00:03:06,000 --> 00:03:07,819 su new se ha hecho 50 00:03:07,819 --> 00:03:10,099 de envío urgente o de new envío estándar 51 00:03:10,099 --> 00:03:11,319 o new envío refrigerado 52 00:03:11,319 --> 00:03:14,060 el instance of también me va a dar 53 00:03:14,060 --> 00:03:16,020 true para todas las 54 00:03:16,020 --> 00:03:17,000 super clases 55 00:03:17,000 --> 00:03:19,919 o interfaces que implemente 56 00:03:19,919 --> 00:03:21,620 también me va a dar true, entonces 57 00:03:21,620 --> 00:03:23,479 un envío estándar, si yo le hago 58 00:03:23,479 --> 00:03:26,039 instance of este va a decir 59 00:03:26,039 --> 00:03:28,219 true, pero si le hago instance of 60 00:03:28,219 --> 00:03:29,360 este también va a decir true 61 00:03:29,360 --> 00:03:32,000 y si le digo instance of este también va a decir true 62 00:03:32,000 --> 00:03:34,159 y si le digo instance of 63 00:03:34,159 --> 00:03:36,539 este no, porque este no implementaba 64 00:03:36,539 --> 00:03:37,900 ¿vale? entonces 65 00:03:37,900 --> 00:03:39,300 cojo un objeto de estos 66 00:03:39,300 --> 00:03:42,000 si le digo es instance of 67 00:03:42,000 --> 00:03:44,039 envío refrigerado, por supuesto, si lo es 68 00:03:44,039 --> 00:03:45,759 pero si hiciera 69 00:03:45,759 --> 00:03:48,020 es instance of envío 70 00:03:48,020 --> 00:03:49,400 normal, también me diría que true 71 00:03:49,400 --> 00:03:51,979 si le digo instance of este 72 00:03:51,979 --> 00:03:54,080 no, este no, porque esta clase no le da 73 00:03:54,080 --> 00:03:56,199 de este, si le digo es instance 74 00:03:56,199 --> 00:03:57,400 of este de aquí 75 00:03:57,400 --> 00:03:59,699 sí, me diría que sí 76 00:03:59,699 --> 00:04:01,560 entonces, un objeto 77 00:04:01,560 --> 00:04:04,099 el instance of 78 00:04:04,099 --> 00:04:06,139 me va a dar true cuando lo aplico 79 00:04:06,139 --> 00:04:08,240 a la clase con la que está instanciado 80 00:04:08,240 --> 00:04:10,120 pero también si lo aplico a cualquiera 81 00:04:10,120 --> 00:04:12,280 de las superclases o interfaces 82 00:04:12,280 --> 00:04:13,080 que implemente 83 00:04:13,080 --> 00:04:14,759 ¿vale? tiene sentido 84 00:04:14,759 --> 00:04:17,680 entonces, eso nos permite 85 00:04:17,680 --> 00:04:19,959 reunificar un poquito 86 00:04:19,959 --> 00:04:21,379 el código que nos había quedado ahí 87 00:04:21,379 --> 00:04:23,199 entonces 88 00:04:23,199 --> 00:04:25,259 esto ya 89 00:04:25,259 --> 00:04:27,100 nos permite 90 00:04:27,100 --> 00:04:30,220 unificar este código 91 00:04:30,220 --> 00:04:31,839 porque 92 00:04:31,839 --> 00:04:34,480 envío urgente y envío refrigerado 93 00:04:34,480 --> 00:04:35,899 los dos 94 00:04:35,899 --> 00:04:37,579 heredan de asegurable 95 00:04:37,579 --> 00:04:39,779 luego estos dos if 96 00:04:39,779 --> 00:04:41,959 los podría agrupar 97 00:04:41,959 --> 00:04:43,579 voy a ponerlo aquí arriba 98 00:04:43,579 --> 00:04:45,180 voy a dejar esto comentado 99 00:04:45,180 --> 00:04:48,420 un poquito 100 00:04:48,420 --> 00:04:50,079 podría estar más 101 00:04:50,079 --> 00:04:52,379 podría estar más 102 00:04:52,379 --> 00:04:53,240 no, no, tendría 103 00:04:53,240 --> 00:04:57,660 al lado de la x 104 00:04:57,660 --> 00:05:00,519 que sí, que estaba viendo a ver todos los más pequeños que podía estar 105 00:05:00,519 --> 00:05:01,959 ahora sí está pegando 106 00:05:01,959 --> 00:05:03,500 vale 107 00:05:03,500 --> 00:05:05,819 ahora está mejor 108 00:05:05,819 --> 00:05:06,420 vale 109 00:05:06,420 --> 00:05:10,519 vale, entonces 110 00:05:10,519 --> 00:05:12,779 alternativa 111 00:05:12,779 --> 00:05:14,819 a este código que acabo de comentar 112 00:05:14,819 --> 00:05:16,180 estos dos 113 00:05:16,180 --> 00:05:18,439 los puedo resumir en este 114 00:05:18,439 --> 00:05:20,019 si mi envío 115 00:05:20,019 --> 00:05:22,040 es asegurable 116 00:05:22,040 --> 00:05:24,000 es decir 117 00:05:24,000 --> 00:05:26,279 es de envío urgente 118 00:05:26,279 --> 00:05:28,060 o es de envío refrigerado 119 00:05:28,060 --> 00:05:30,579 que son las dos 120 00:05:30,579 --> 00:05:31,860 clases que implementan 121 00:05:31,860 --> 00:05:32,879 asegurable 122 00:05:32,879 --> 00:05:35,899 instance of 123 00:05:35,899 --> 00:05:40,399 envío 124 00:05:40,399 --> 00:05:41,420 perdón 125 00:05:41,420 --> 00:05:42,980 asegurable 126 00:05:42,980 --> 00:05:47,279 pues esto lo podemos hacer y no pasa nada 127 00:05:47,279 --> 00:05:55,670 ¿vale? 128 00:05:56,310 --> 00:05:59,370 entonces esto, si lo veis de buenas a primeras 129 00:05:59,370 --> 00:06:00,850 puede generaros la confusión de 130 00:06:00,850 --> 00:06:03,050 pero si asegurable no se puede instanciar 131 00:06:03,050 --> 00:06:05,189 es imposible hacer un new asegurable 132 00:06:05,189 --> 00:06:07,649 ¿Cómo va a ser E una instancia de asegurable? 133 00:06:08,189 --> 00:06:09,990 Claro, pero esto lo que significa es, 134 00:06:10,730 --> 00:06:14,990 E es una instancia de algún objeto que implemente asegurable, 135 00:06:15,110 --> 00:06:16,389 es lo que significa también. 136 00:06:16,509 --> 00:06:17,470 También significa eso. 137 00:06:18,470 --> 00:06:20,389 Bueno, pues en ese caso, si lo es, 138 00:06:20,529 --> 00:06:22,509 es cuando queremos hacer el coste total del seguro. 139 00:06:26,860 --> 00:06:27,040 ¿Vale? 140 00:06:27,060 --> 00:06:28,980 En ese caso es cuando queremos hacer el coste total del seguro. 141 00:06:29,560 --> 00:06:37,220 Entonces, aquí es donde uno haría suma más igual mi envío E 142 00:06:37,220 --> 00:06:43,680 Y yo querría llamar a calcular coste seguro. 143 00:06:45,199 --> 00:06:46,600 Querría llamar a este método. 144 00:06:47,319 --> 00:06:48,480 Ay, es que me lo ha hecho solito. 145 00:06:48,759 --> 00:06:51,180 Sí, me lo ha hecho solo, pero no quiero que me lo haga solo. 146 00:06:51,660 --> 00:06:52,439 Ahí, vale. 147 00:06:53,500 --> 00:06:55,480 Vale, esto es lo que querríamos hacer, ¿verdad? 148 00:06:56,120 --> 00:06:58,420 De este objeto E que implementa asegurable, 149 00:06:58,639 --> 00:07:00,279 llamar a calcular coste seguro. 150 00:07:01,399 --> 00:07:05,079 Claro, pero es que ya sabemos cómo funciona el compilador. 151 00:07:05,079 --> 00:07:08,000 si tú le pides un método de un objeto 152 00:07:08,000 --> 00:07:09,920 va a mirar cómo está 153 00:07:09,920 --> 00:07:10,959 declarado ese objeto 154 00:07:10,959 --> 00:07:13,899 para ver los métodos que hay en la clase declarada 155 00:07:13,899 --> 00:07:15,300 ¿y cómo está declarado? 156 00:07:15,740 --> 00:07:16,600 como envío 157 00:07:16,600 --> 00:07:19,000 está declarado como envío 158 00:07:19,000 --> 00:07:21,560 luego no puedo llamar aquí a nada 159 00:07:21,560 --> 00:07:22,620 que no esté en envío 160 00:07:22,620 --> 00:07:24,600 no puedo 161 00:07:24,600 --> 00:07:27,439 y calcular coste seguro 162 00:07:27,439 --> 00:07:29,740 no está en envío, calcular coste seguro 163 00:07:29,740 --> 00:07:31,959 está en la interfaz 164 00:07:31,959 --> 00:07:33,560 asegurable, que luego 165 00:07:33,560 --> 00:07:35,860 implementan en biourgente 166 00:07:35,860 --> 00:07:37,439 en biorefrigerado, lo implementan 167 00:07:37,439 --> 00:07:39,540 lógicamente, pero no está aquí 168 00:07:39,540 --> 00:07:41,420 luego aquí tengo 169 00:07:41,420 --> 00:07:42,560 pues un problemilla 170 00:07:42,560 --> 00:07:45,240 entonces, estos 171 00:07:45,240 --> 00:07:46,759 mini problemillas 172 00:07:46,759 --> 00:07:49,459 sí que se arreglan, y no hay 173 00:07:49,459 --> 00:07:51,600 otra con esa cosa tan horrible del casting 174 00:07:51,600 --> 00:07:52,740 pero el casting 175 00:07:52,740 --> 00:07:55,620 no es tan malo, suele ser 176 00:07:55,620 --> 00:07:57,600 muy malo, porque nos arregla 177 00:07:57,600 --> 00:07:59,519 errores de compilación a costa de hacer una 178 00:07:59,519 --> 00:08:01,540 burrada, pero si está 179 00:08:01,540 --> 00:08:03,379 controlado, ¿no? Entonces 180 00:08:03,379 --> 00:08:05,360 aquí diríamos, oye, pues voy a hacer un casting 181 00:08:05,360 --> 00:08:07,339 de E, voy a convertirlo 182 00:08:07,339 --> 00:08:09,199 en algo más concreto 183 00:08:09,199 --> 00:08:11,379 de envío, que sí que tenga 184 00:08:11,379 --> 00:08:13,439 ese método. Entonces dirías, 185 00:08:13,519 --> 00:08:15,600 bueno, pues lo voy a convertir en envío refrigerado 186 00:08:15,600 --> 00:08:16,420 que tiene el método. 187 00:08:17,459 --> 00:08:19,600 Oye, pero a lo mejor E no es envío refrigerado, 188 00:08:19,680 --> 00:08:21,139 es envío urgente, puede ser cualquiera de los dos. 189 00:08:21,860 --> 00:08:23,600 Entonces, ¿en qué lo convierto? ¿En refrigerado 190 00:08:23,600 --> 00:08:24,339 o en urgente? 191 00:08:25,339 --> 00:08:27,639 Vale, pues lo que podemos hacer es hacer un casting 192 00:08:27,639 --> 00:08:28,920 a la interfaz. 193 00:08:30,279 --> 00:08:31,600 Aunque no tenga 194 00:08:31,600 --> 00:08:33,580 sentido, en principio 195 00:08:33,580 --> 00:08:34,740 nos parezca extraño 196 00:08:34,740 --> 00:08:37,610 asegurable 197 00:08:37,610 --> 00:08:42,990 entonces este casting significa 198 00:08:42,990 --> 00:08:44,889 oye compilador 199 00:08:44,889 --> 00:08:47,029 mira este objeto 200 00:08:47,029 --> 00:08:48,570 míralo 201 00:08:48,570 --> 00:08:51,250 como si fuera asegurable 202 00:08:51,250 --> 00:08:53,309 míralo como si fuera asegurable 203 00:08:53,309 --> 00:08:56,419 es grave que lo mire 204 00:08:56,419 --> 00:08:58,200 como si fuera asegurable, en absoluto lo es 205 00:08:58,200 --> 00:08:59,200 porque lo implementa 206 00:08:59,200 --> 00:09:01,620 porque de hecho es una instancia 207 00:09:01,620 --> 00:09:04,399 de algo que implemente asegurable 208 00:09:04,399 --> 00:09:08,000 luego si vengo de un instance of 209 00:09:08,000 --> 00:09:09,500 el casting sin ningún miedo 210 00:09:09,500 --> 00:09:12,539 entonces al hacer el casting 211 00:09:12,539 --> 00:09:13,899 ahora ya puedo llamar 212 00:09:13,899 --> 00:09:15,659 a todos los métodos de esta interfaz 213 00:09:15,659 --> 00:09:17,899 lo puedo llamar 214 00:09:17,899 --> 00:09:19,320 y ya está 215 00:09:19,320 --> 00:09:21,620 me he ahorrado 216 00:09:21,620 --> 00:09:23,679 hacer los dos if 217 00:09:23,679 --> 00:09:25,860 aunque esto 218 00:09:25,860 --> 00:09:28,360 repito es un poco más 219 00:09:28,360 --> 00:09:30,240 como abstracto, más extraño 220 00:09:30,240 --> 00:09:32,200 porque es ver si algo 221 00:09:32,200 --> 00:09:33,179 es instancia de esto 222 00:09:33,179 --> 00:09:51,960 Instancia de esto es imposible. Pero esto, instance of, no significa solo ser instancia de. Instance of significa, ¿es instancia de esto o de alguna de las subclases o clases que lo implementen? Eso significa. 223 00:09:52,820 --> 00:09:54,460 ¿Instance of es instancia de esto? 224 00:09:54,559 --> 00:09:56,440 Que de esto no podría ser en este caso. 225 00:09:56,740 --> 00:09:59,259 ¿O de alguna de las clases que lo implementen? 226 00:09:59,960 --> 00:10:00,559 Pues sí. 227 00:10:01,559 --> 00:10:05,860 Si es instancia de alguna de las clases que lo implementen como refrigerado urgente, entro. 228 00:10:06,860 --> 00:10:08,960 Y ahora ya el problema, llamar al método. 229 00:10:09,580 --> 00:10:14,200 Necesito para llamar al método poner aquí algo que tenga ese método. 230 00:10:15,539 --> 00:10:16,059 ¿Vale? 231 00:10:16,080 --> 00:10:18,279 Ese método está en envío refrigerado o urgente. 232 00:10:18,460 --> 00:10:20,960 Pero yo no sé cuál de las dos es. 233 00:10:21,460 --> 00:10:21,899 No lo sé. 234 00:10:21,960 --> 00:10:22,879 Puede ser una de las dos. 235 00:10:23,620 --> 00:10:25,539 Pero puedo hacer el casting asegurable 236 00:10:25,539 --> 00:10:26,659 porque sea cual sea, 237 00:10:27,580 --> 00:10:29,440 cualquiera de las dos es asegurable. 238 00:10:30,139 --> 00:10:31,440 Entonces, puedo hacerlo de cara 239 00:10:31,440 --> 00:10:33,299 a que el compilador me permite llamar esto. 240 00:10:34,059 --> 00:10:34,600 Y ya está. 241 00:10:39,049 --> 00:10:39,769 No, no, no, no, no. 242 00:10:39,830 --> 00:10:41,210 Porque la llamada a los métodos 243 00:10:41,210 --> 00:10:43,909 se hace siempre al objeto 244 00:10:43,909 --> 00:10:45,210 tal y como se instanció. 245 00:10:46,269 --> 00:10:49,090 El compilador mira cómo se ha declarado. 246 00:10:49,690 --> 00:10:51,009 Entonces, aquí el compilador 247 00:10:51,009 --> 00:10:53,230 al hacer el casting dice, 248 00:10:53,370 --> 00:10:54,950 uy, qué bien, calcular coste seguro, 249 00:10:54,950 --> 00:10:57,190 es tan asegurable, le da igual que esté vacío 250 00:10:57,190 --> 00:10:59,309 pero luego en tiempo 251 00:10:59,309 --> 00:11:01,230 de ejecución, cuando esto se ejecute 252 00:11:01,230 --> 00:11:02,889 la ejecución 253 00:11:02,889 --> 00:11:05,289 siempre se va a hacer llamando al método 254 00:11:05,289 --> 00:11:07,049 tal y como se instanció el objeto 255 00:11:07,049 --> 00:11:08,610 ¿cómo se instanció? 256 00:11:08,769 --> 00:11:10,529 ni idea, por ahí arriba estará 257 00:11:10,529 --> 00:11:12,110 pero lo que sí que tenemos la seguridad 258 00:11:12,110 --> 00:11:14,110 es que cuando esto se ejecute 259 00:11:14,110 --> 00:11:16,149 y ya en tiempo de ejecución 260 00:11:16,149 --> 00:11:17,830 se llame a este método 261 00:11:17,830 --> 00:11:20,570 sí o sí se va a llamar a la versión del método 262 00:11:20,570 --> 00:11:22,289 que está en el objeto 263 00:11:22,289 --> 00:11:23,769 tal y como se instanció 264 00:11:23,769 --> 00:11:39,389 Entonces, cuando entremos por aquí, siendo E una instancia de envío refrigerado, se llamará a calcular coste seguro de envío refrigerado. Cuando entremos por aquí, siendo E una instancia de envío urgente, se llamará a la versión de envío urgente. 265 00:11:39,389 --> 00:11:42,450 ¿Vale? Es justo la definición 266 00:11:42,450 --> 00:11:43,370 De polimorfismo 267 00:11:43,370 --> 00:11:46,529 Llamo al método que se corresponde 268 00:11:46,529 --> 00:11:47,830 A cómo te instanciaste 269 00:11:47,830 --> 00:11:50,350 Pero el compilador nos ha puesto 270 00:11:50,350 --> 00:11:51,210 Un filtro previo 271 00:11:51,210 --> 00:11:53,950 Que es, ya, pero para yo dejarte llamarlo 272 00:11:53,950 --> 00:11:55,389 En tiempo de escritura de código 273 00:11:55,389 --> 00:11:58,590 Necesito que lo llames desde algo 274 00:11:58,590 --> 00:12:00,450 Que lo tenga en esa clase 275 00:12:00,450 --> 00:12:02,470 Aunque luego la implementación esté más abajo 276 00:12:02,470 --> 00:12:03,950 O te instancie más abajo 277 00:12:03,950 --> 00:12:05,330 ¿Vale? 278 00:12:09,389 --> 00:12:11,529 Bueno pues con esto 279 00:12:11,529 --> 00:12:14,769 Estábamos haciendo el otro servicio 280 00:12:14,769 --> 00:12:15,970 Que era actualizar estado 281 00:12:15,970 --> 00:12:16,850 Estabais haciendo 282 00:12:16,850 --> 00:12:19,309 Y que más cosas había por aquí 283 00:12:19,309 --> 00:12:21,409 Pues unas cuantas 284 00:12:21,409 --> 00:12:24,509 Pues dime 285 00:12:24,509 --> 00:12:27,809 Este mismo 286 00:12:27,809 --> 00:12:30,070 La última línea 287 00:12:30,070 --> 00:12:30,750 Hace falta 288 00:12:30,750 --> 00:12:33,210 La cual 289 00:12:33,210 --> 00:12:34,309 La de retún 290 00:12:34,309 --> 00:12:37,990 Ah no es que se me ha olvidado 291 00:12:37,990 --> 00:12:38,830 Poner los comentarios 292 00:12:38,830 --> 00:12:41,750 Vale, vale, es que se me ha olvidado comentarla 293 00:12:41,750 --> 00:12:43,029 Vale 294 00:12:43,029 --> 00:12:46,240 Vale, pues venga ahora 295 00:12:46,240 --> 00:12:49,019 Continuáis con el ejercicio vosotros 296 00:12:49,019 --> 00:12:51,100 Con las dos cosas que se quedaron pendientes y con lo que falte 297 00:12:51,100 --> 00:12:53,500 Y os concentráis 298 00:12:53,500 --> 00:12:54,559 Y me preguntáis 299 00:12:54,559 --> 00:12:55,279 Si algo