1 00:00:00,000 --> 00:00:01,960 flojerías, bueno 2 00:00:01,960 --> 00:00:03,560 esto es una pizarra, sí 3 00:00:03,560 --> 00:00:05,960 vale, bueno pues vamos 4 00:00:05,960 --> 00:00:08,039 a un concepto más relacionado con la herencia 5 00:00:08,039 --> 00:00:09,380 que es 6 00:00:09,380 --> 00:00:11,839 básico en cualquier diseño 7 00:00:11,839 --> 00:00:13,679 en cualquier aplicación mínimamente 8 00:00:13,679 --> 00:00:15,980 compleja y sobre 9 00:00:15,980 --> 00:00:17,579 la que se sustenta 10 00:00:17,579 --> 00:00:19,719 cualquier paquete que usemos, como el de 11 00:00:19,719 --> 00:00:21,679 colecciones, que es 12 00:00:21,679 --> 00:00:23,620 el siguiente que veremos, o las 13 00:00:23,620 --> 00:00:26,179 excepciones, o las interfaces gráficas 14 00:00:26,179 --> 00:00:27,019 cualquier cosa 15 00:00:27,019 --> 00:00:29,519 todos esos paquetes que nosotros 16 00:00:29,519 --> 00:00:31,500 ya usaremos para hacer nuestras cosas 17 00:00:31,500 --> 00:00:32,960 se sustentan sobre esta idea 18 00:00:32,960 --> 00:00:34,859 de interfaces 19 00:00:34,859 --> 00:00:37,539 que es lo que vamos a 20 00:00:37,539 --> 00:00:39,700 incorporar a otra que es 21 00:00:39,700 --> 00:00:40,020 nada 22 00:00:40,020 --> 00:00:43,479 a nivel de incorporación de detalles 23 00:00:43,479 --> 00:00:45,280 de código es nada, son cuatro cosas 24 00:00:45,280 --> 00:00:47,700 es sobre todo una cuestión de entender 25 00:00:47,700 --> 00:00:49,939 por qué aparecen, por qué las usamos 26 00:00:49,939 --> 00:00:50,479 ¿vale? 27 00:00:51,240 --> 00:00:52,560 bueno, pues a ver 28 00:00:52,560 --> 00:00:55,600 lo que es la herencia, la motivación 29 00:00:55,600 --> 00:00:57,280 de por qué apareció la herencia 30 00:00:57,280 --> 00:00:58,920 en esta vida 31 00:00:58,920 --> 00:01:01,700 la tenemos, ¿no? 32 00:01:03,159 --> 00:01:03,799 ¿Por qué? 33 00:01:04,379 --> 00:01:05,319 Es interesante la idea. 34 00:01:06,420 --> 00:01:07,219 Venga, me ha tocado. 35 00:01:10,239 --> 00:01:11,079 Para... 36 00:01:11,079 --> 00:01:13,879 Para... 37 00:01:13,879 --> 00:01:15,060 Una frase rápida. 38 00:01:15,500 --> 00:01:17,579 Para poder utilizar datos 39 00:01:17,579 --> 00:01:18,140 de otras clases. 40 00:01:20,260 --> 00:01:22,780 Bueno, poder utilizar datos no me gusta, 41 00:01:23,019 --> 00:01:23,939 porque no es la idea. 42 00:01:24,180 --> 00:01:27,739 Los datos tú los utilizas cuando instancias un objeto. 43 00:01:27,980 --> 00:01:28,920 Ahí utilizas datos. 44 00:01:29,079 --> 00:01:29,620 No exactamente. 45 00:01:29,620 --> 00:01:35,989 Claro, eso es la herencia 46 00:01:35,989 --> 00:01:37,010 Crear una clase a partir de otras 47 00:01:37,010 --> 00:01:37,629 ¿Pero por qué? 48 00:01:38,310 --> 00:01:38,790 ¿Por qué? 49 00:01:47,260 --> 00:01:49,400 Vale, que eso podríamos resumirlo en 50 00:01:49,400 --> 00:01:51,120 Reutilizar código 51 00:01:51,120 --> 00:01:52,459 ¿Verdad? 52 00:01:52,859 --> 00:01:54,459 Para automatizar sería la palabra 53 00:01:54,459 --> 00:01:56,959 No, no automatizamos nada 54 00:01:56,959 --> 00:01:58,859 No estamos automatizando nada 55 00:01:58,859 --> 00:02:01,019 Para reutilizar código 56 00:02:01,019 --> 00:02:03,019 Lo que tú has dicho viene a ser reutilizar código 57 00:02:03,019 --> 00:02:03,540 ¿Vale? 58 00:02:03,540 --> 00:02:05,359 entonces 59 00:02:05,359 --> 00:02:07,260 y además de 60 00:02:07,260 --> 00:02:09,460 reutilizar código 61 00:02:09,460 --> 00:02:10,319 en sí 62 00:02:10,319 --> 00:02:14,949 ¿para qué otra cosa nos ha servido? 63 00:02:15,150 --> 00:02:16,530 ¿cuál ha sido otra motivación 64 00:02:16,530 --> 00:02:17,409 fundamental? 65 00:02:19,830 --> 00:02:20,349 claro 66 00:02:20,349 --> 00:02:22,389 va por ahí, por el polimorfismo 67 00:02:22,389 --> 00:02:24,669 es decir, tú tienes un montón 68 00:02:24,669 --> 00:02:26,530 de datos, un montón 69 00:02:26,530 --> 00:02:28,270 de objetos en tu aplicación 70 00:02:28,270 --> 00:02:30,870 que no son lo mismo en realidad 71 00:02:30,870 --> 00:02:32,870 uno es alumno de FP 72 00:02:32,870 --> 00:02:34,330 alumno de la ESO 73 00:02:34,330 --> 00:02:38,349 alumno de infantil, no son lo mismo, con lo cual 74 00:02:38,349 --> 00:02:42,169 no los puedes crear, declarar como la misma clase 75 00:02:42,169 --> 00:02:46,129 porque son distintos, no son lo mismo, son clases distintas, pero 76 00:02:46,129 --> 00:02:49,909 comparten, como tú decías, mucha información, entonces efectivamente 77 00:02:49,909 --> 00:02:53,949 desde el momento en que todos identificas que todos 78 00:02:53,949 --> 00:02:58,169 son alumno, alumno ESO es alumno, alumno FP es 79 00:02:58,169 --> 00:03:02,129 alumno, alumno infantil es alumno, cuando identificas 80 00:03:02,129 --> 00:03:04,349 que todos son alumnos 81 00:03:04,349 --> 00:03:06,169 automáticamente puedes 82 00:03:06,169 --> 00:03:07,810 decir, vale, pues entonces 83 00:03:07,810 --> 00:03:09,909 si todos puedo yo decir que son 84 00:03:09,909 --> 00:03:11,990 alumno, es porque la idea de 85 00:03:11,990 --> 00:03:13,050 alumno existe 86 00:03:13,050 --> 00:03:15,830 luego habrá cosas que tengan 87 00:03:15,830 --> 00:03:18,189 los alumnos, porque esa idea existe y que por tanto 88 00:03:18,189 --> 00:03:19,490 la tengan todos los demás 89 00:03:19,490 --> 00:03:21,930 y luego ya cada uno tendrá 90 00:03:21,930 --> 00:03:23,590 lo suyo específico 91 00:03:23,590 --> 00:03:25,550 entonces 92 00:03:25,550 --> 00:03:28,189 el diseñarlo 93 00:03:28,189 --> 00:03:29,689 de esa manera, como 94 00:03:29,689 --> 00:03:32,030 tres clases que son 95 00:03:32,030 --> 00:03:34,150 distintas, pero todas 96 00:03:34,150 --> 00:03:35,830 heredan de la misma y todas 97 00:03:35,830 --> 00:03:38,229 comparten lo que tiene la superclase 98 00:03:38,229 --> 00:03:39,990 automáticamente 99 00:03:39,990 --> 00:03:41,669 tiene la ventaja 100 00:03:41,669 --> 00:03:44,229 del polimorfismo 101 00:03:44,229 --> 00:03:46,229 que decía él, y es que ahora yo ya 102 00:03:46,229 --> 00:03:47,909 puedo trabajar 103 00:03:47,909 --> 00:03:49,990 con instancias de esos 104 00:03:49,990 --> 00:03:52,150 objetos por igual, todas ellas llamarán 105 00:03:52,150 --> 00:03:53,930 a los mismos métodos, métodos que están 106 00:03:53,930 --> 00:03:56,169 en la superclase, todas ellas 107 00:03:56,169 --> 00:03:58,090 pueden estar en 108 00:03:58,090 --> 00:04:00,030 el mismo array, yo las puedo tratar a todas 109 00:04:00,030 --> 00:04:01,990 por igual, y si todos tienen 110 00:04:01,990 --> 00:04:03,789 el método matricular 111 00:04:03,789 --> 00:04:05,750 pues el alumno FP 112 00:04:05,750 --> 00:04:07,789 se puede matricular, el alumno infantil 113 00:04:07,789 --> 00:04:10,250 se puede matricular y el alumno 114 00:04:10,250 --> 00:04:12,009 de la ESO se puede matricular 115 00:04:12,009 --> 00:04:13,930 ¿vale? porque todos son alumnos 116 00:04:13,930 --> 00:04:15,889 yo los trato por igual, a todos les llamo 117 00:04:15,889 --> 00:04:16,810 el método matricular 118 00:04:16,810 --> 00:04:19,829 pero cada uno va a ejercer ese 119 00:04:19,829 --> 00:04:21,709 método de una manera distinta, cada uno lo va a ejercer 120 00:04:21,709 --> 00:04:22,730 de una forma distinta 121 00:04:22,730 --> 00:04:26,089 ¿vale? entonces todos comparten 122 00:04:26,089 --> 00:04:27,750 las llamadas a los métodos, todos 123 00:04:27,750 --> 00:04:29,689 los trato por igual, todos los meto 124 00:04:29,689 --> 00:04:31,449 en la misma caja, en el mismo array 125 00:04:31,449 --> 00:04:33,490 y el mismo lista enlazada 126 00:04:33,490 --> 00:04:35,189 los meto a todos por igual 127 00:04:35,189 --> 00:04:37,730 pero cada uno se comporta internamente 128 00:04:37,730 --> 00:04:39,509 de forma distinta, aunque yo los trate 129 00:04:39,509 --> 00:04:40,670 desde arriba por igual 130 00:04:40,670 --> 00:04:43,670 eso lo podemos hacer gracias a la herencia 131 00:04:43,670 --> 00:04:44,170 ¿vale? 132 00:04:45,930 --> 00:04:47,569 bueno, pues esto como herramienta 133 00:04:47,569 --> 00:04:49,589 entonces de diseño que luego facilita 134 00:04:49,589 --> 00:04:51,509 el desarrollo de una aplicación 135 00:04:51,509 --> 00:04:53,470 está muy bien, pero se nos 136 00:04:53,470 --> 00:04:55,370 ha quedado un poco coja 137 00:04:55,370 --> 00:04:57,490 os habréis 138 00:04:57,490 --> 00:04:59,430 dado cuenta si vosotros empezáis a pensar 139 00:04:59,430 --> 00:05:01,290 en situaciones de 140 00:05:01,290 --> 00:05:03,089 a gestionar, pues de 141 00:05:03,089 --> 00:05:05,610 cualquier cosa que haya que gestionar, de inventarios 142 00:05:05,610 --> 00:05:07,250 de gestionar un taller 143 00:05:07,250 --> 00:05:09,029 mecánico, gestionar una empresa de personal 144 00:05:09,029 --> 00:05:10,689 si os ponéis a pensar en situaciones 145 00:05:10,689 --> 00:05:13,230 pues veréis que con la 146 00:05:13,230 --> 00:05:15,269 relación de herencia no se 147 00:05:15,269 --> 00:05:16,490 puede reflejar todo 148 00:05:16,490 --> 00:05:19,389 primero porque la herencia 149 00:05:19,389 --> 00:05:21,310 en Java es una herencia 150 00:05:21,310 --> 00:05:23,389 simple, entonces recordad 151 00:05:23,389 --> 00:05:27,560 que en Java cada clase 152 00:05:27,560 --> 00:05:29,279 solo puede 153 00:05:29,279 --> 00:05:30,740 heredar de otra 154 00:05:30,740 --> 00:05:35,290 Entonces, tú puedes ser una cosa 155 00:05:35,290 --> 00:05:36,509 Pero no puedes ser otra 156 00:05:36,509 --> 00:05:38,149 No puedes ser otra a la vez 157 00:05:38,149 --> 00:05:39,529 ¿Vale? 158 00:05:40,189 --> 00:05:43,189 Entonces, bueno, eso tiene cierto sentido real 159 00:05:43,189 --> 00:05:45,629 Yo soy empleado 160 00:05:45,629 --> 00:05:46,589 Temporal 161 00:05:46,589 --> 00:05:48,810 ¿Vale? Soy empleado 162 00:05:48,810 --> 00:05:51,329 Y ya está, pero soy empleado solamente 163 00:05:51,329 --> 00:05:52,449 Soy empleado temporal 164 00:05:52,449 --> 00:05:55,009 Y soy empleado y no soy nada más 165 00:05:55,009 --> 00:05:57,329 Ni puedo ser nada más en esta jerarquía mía 166 00:05:57,329 --> 00:05:57,910 De clases 167 00:05:57,910 --> 00:06:01,189 ¿Vale? Pues entonces, eso realmente se queda 168 00:06:01,189 --> 00:06:03,170 un poco corto, porque luego a lo mejor puede 169 00:06:03,170 --> 00:06:04,589 haber otras cosas 170 00:06:04,589 --> 00:06:07,029 en la aplicación como 171 00:06:07,029 --> 00:06:09,490 eres empleado que ficha 172 00:06:09,490 --> 00:06:11,670 eres empleado que ejerce 173 00:06:11,670 --> 00:06:13,629 de jefe, eres empleado 174 00:06:13,629 --> 00:06:14,649 que hace no sé qué 175 00:06:14,649 --> 00:06:17,189 es decir, en mi aplicación puede haber 176 00:06:17,189 --> 00:06:19,209 una cosa, que para entendernos 177 00:06:19,209 --> 00:06:21,110 y que quede claro, que se llamen roles 178 00:06:21,110 --> 00:06:24,680 a lo mejor tú eres 179 00:06:24,680 --> 00:06:26,480 un empleado, pero hay diferentes 180 00:06:26,480 --> 00:06:27,759 papeles que puedes jugar 181 00:06:27,759 --> 00:06:30,420 y en un momento dado puedes jugar uno 182 00:06:30,420 --> 00:06:32,379 o a lo mejor puedes jugar otro 183 00:06:32,379 --> 00:06:35,360 entonces tú no eres solamente una cosa 184 00:06:35,360 --> 00:06:36,600 también 185 00:06:36,600 --> 00:06:39,139 tú te puedes definir 186 00:06:39,139 --> 00:06:41,379 por lo que haces, por los roles 187 00:06:41,379 --> 00:06:42,800 ¿vale? 188 00:06:43,740 --> 00:06:45,279 y que puedes tener muchos 189 00:06:45,279 --> 00:06:47,120 entonces esto amplía un poquito más 190 00:06:47,120 --> 00:06:49,560 nuestras posibilidades de diseñar la aplicación 191 00:06:49,560 --> 00:06:51,439 bueno, pues para meter esto en Java 192 00:06:51,439 --> 00:06:52,939 para reflejar esto en Java 193 00:06:52,939 --> 00:06:55,560 aparece una cosa que se llama 194 00:06:55,560 --> 00:06:56,220 interfaces 195 00:06:56,220 --> 00:06:58,920 entonces, ¿la interfaz qué es? 196 00:06:58,920 --> 00:07:00,660 una interfaz es una clase 197 00:07:00,660 --> 00:07:10,810 es como si fuera una clase abstracta pura, solamente tiene métodos vacíos. 198 00:07:11,269 --> 00:07:12,069 Eso es una interfaz. 199 00:07:12,689 --> 00:07:16,910 Se declara con la palabra interfaz, así. 200 00:07:19,449 --> 00:07:23,910 Es como si fuera una clase, pero en lugar de poner class, se pone interfaz. 201 00:07:26,089 --> 00:07:27,529 ¿Qué nombre le da uno? 202 00:07:29,089 --> 00:07:31,050 Pues bueno, el nombre que le dé la gana. 203 00:07:31,050 --> 00:07:34,810 Normalmente las interfaces están asociadas 204 00:07:34,810 --> 00:07:35,850 No es que sea obligatorio 205 00:07:35,850 --> 00:07:38,910 Pero es la idea, para eso se usan 206 00:07:38,910 --> 00:07:43,529 Están asociadas a funciones, comportamientos, roles 207 00:07:43,529 --> 00:07:46,329 Papeles que uno puede jugar en la aplicación 208 00:07:46,329 --> 00:07:49,610 Por eso sus nombres suelen acabar en hable 209 00:07:49,610 --> 00:07:53,370 Pues soy movible, soy expulsable 210 00:07:53,370 --> 00:07:54,949 Soy titulable 211 00:07:54,949 --> 00:07:57,350 Es decir, cosas que yo puedo hacer 212 00:07:57,350 --> 00:07:58,529 Suelen estar asociadas a eso 213 00:07:58,529 --> 00:08:10,120 Por ejemplo, estamos gestionando coches, en vuestras bases de datos de coches, de bases de datos, pues no sé qué relación tendrá 214 00:08:10,120 --> 00:08:23,199 Pero imaginaos que tenéis un taller mecánico que tiene coches, motos, carros de caballos, carruajes 215 00:08:23,199 --> 00:08:26,079 uno podría hacer un diseño en el cual 216 00:08:26,079 --> 00:08:27,000 todos ellos 217 00:08:27,000 --> 00:08:29,779 hereden de vehículo 218 00:08:29,779 --> 00:08:31,860 muy bien, todos hereden de vehículo 219 00:08:31,860 --> 00:08:34,419 esa parte ya la tenemos controlada 220 00:08:34,419 --> 00:08:36,059 en vehículo pondremos 221 00:08:36,059 --> 00:08:37,740 todo aquello que tienen 222 00:08:37,740 --> 00:08:39,980 todos los vehículos, el coche 223 00:08:39,980 --> 00:08:42,039 la moto, el carromato, lo pondremos 224 00:08:42,039 --> 00:08:44,580 todo, los métodos 225 00:08:44,580 --> 00:08:46,259 que esté claro cómo van a 226 00:08:46,259 --> 00:08:48,080 funcionar los ponemos en la superclase 227 00:08:48,080 --> 00:08:49,860 lo que no esté claro 228 00:08:49,860 --> 00:08:51,980 porque dependerá de cada ejemplo 229 00:08:51,980 --> 00:08:55,220 esos los ponemos como vacíos 230 00:08:55,220 --> 00:08:57,000 con lo cual el vehículo se convierte 231 00:08:57,000 --> 00:08:58,700 en abstracta y ahora ya 232 00:08:58,700 --> 00:09:01,259 cada subclase los rellena 233 00:09:01,259 --> 00:09:02,860 con su contenido específico 234 00:09:02,860 --> 00:09:03,899 esa parte ya la sabemos 235 00:09:03,899 --> 00:09:06,679 pero luego puede haber más cosas 236 00:09:06,679 --> 00:09:08,620 que haya que meter en la aplicación de alguna manera 237 00:09:08,620 --> 00:09:10,240 que tengan que quedar reflejadas 238 00:09:10,240 --> 00:09:11,440 por ejemplo 239 00:09:11,440 --> 00:09:13,899 el taller mecánico tiene 240 00:09:13,899 --> 00:09:16,820 su parte que define, tengo coches, carromatos 241 00:09:16,820 --> 00:09:18,179 todos son vehículos 242 00:09:18,179 --> 00:09:21,019 pero también gestiono ventas, hago cosas 243 00:09:21,019 --> 00:09:23,379 Bueno, pues esos cacharros de ahí 244 00:09:23,379 --> 00:09:24,399 Esos coches, esas motos 245 00:09:24,399 --> 00:09:26,419 Además de ser vehículos 246 00:09:26,419 --> 00:09:30,799 Además puede que necesiten ser vendidos o no ser vendidos 247 00:09:30,799 --> 00:09:32,600 Ser alquilados o no ser alquilados 248 00:09:32,600 --> 00:09:34,799 Es decir, desempeñar una función 249 00:09:34,799 --> 00:09:37,580 Y cada una de ellas la que toque en cada momento 250 00:09:37,580 --> 00:09:39,539 Entonces, por ejemplo 251 00:09:39,539 --> 00:09:42,240 Uno podría hacer una interfaz vendible 252 00:09:42,240 --> 00:09:43,500 Que se llamara vendible 253 00:09:43,500 --> 00:09:53,240 Entonces tendríamos 254 00:09:53,240 --> 00:09:56,539 La estructura que hemos hecho antes 255 00:09:56,539 --> 00:09:58,259 Pues tendríamos vehículo 256 00:09:58,259 --> 00:10:03,509 y de vehículo hereda 257 00:10:03,509 --> 00:10:05,570 el coche 258 00:10:05,570 --> 00:10:08,580 y la moto 259 00:10:08,580 --> 00:10:10,759 ¿vale? 260 00:10:10,860 --> 00:10:12,759 aquí ya con las propiedades que sean 261 00:10:12,759 --> 00:10:14,460 con los métodos que sean, lo que sea 262 00:10:14,460 --> 00:10:16,840 pues coche, pues lo que fuera 263 00:10:16,840 --> 00:10:18,500 pues mostrar datos, pintarlo 264 00:10:18,500 --> 00:10:20,759 cambiar ruedas, moto 265 00:10:20,759 --> 00:10:22,220 pues ponerle lo que fuera 266 00:10:22,220 --> 00:10:23,220 lo que sea 267 00:10:23,220 --> 00:10:26,159 luego tenemos la parte de ventas de la aplicación 268 00:10:26,159 --> 00:10:27,940 entonces 269 00:10:27,940 --> 00:10:31,039 puede ser 270 00:10:31,039 --> 00:10:32,980 que los coches sean vendibles 271 00:10:32,980 --> 00:10:34,720 se puedan vender pero las motos no, ese taller 272 00:10:34,720 --> 00:10:36,840 solo arregle motos y no las venda, solamente 273 00:10:36,840 --> 00:10:38,940 venda coches, entonces aquí 274 00:10:38,940 --> 00:10:39,720 tenemos un problema 275 00:10:39,720 --> 00:10:43,179 porque, jolines, el método 276 00:10:43,179 --> 00:10:45,200 vender solo aplica 277 00:10:45,200 --> 00:10:46,899 para coche, para moto no 278 00:10:46,899 --> 00:10:48,620 vale 279 00:10:48,620 --> 00:10:51,139 podríamos en coche poner un método 280 00:10:51,139 --> 00:10:52,980 específico suyo que fuera vender 281 00:10:52,980 --> 00:10:56,450 tendríamos solamente 282 00:10:56,450 --> 00:10:58,450 el pequeño problema de que este método 283 00:10:58,450 --> 00:11:00,230 solo estaría aquí, lógicamente 284 00:11:00,230 --> 00:11:02,330 aquí no puede estar porque la moto no puede ser vendida 285 00:11:02,330 --> 00:11:05,669 y yo no podría ponerlo aquí en la superclase 286 00:11:05,669 --> 00:11:07,590 como método abstracto 287 00:11:07,590 --> 00:11:09,450 no podría, porque si lo pongo 288 00:11:09,450 --> 00:11:11,730 aquí en la superclase como método abstracto 289 00:11:11,730 --> 00:11:13,509 moto se ve 290 00:11:13,509 --> 00:11:14,870 obligada a implementarlos 291 00:11:14,870 --> 00:11:17,509 entonces ya el diseño empieza a ser un poco 292 00:11:17,509 --> 00:11:19,509 raro, entonces ya empieza a ser 293 00:11:19,509 --> 00:11:21,269 feo, entonces 294 00:11:21,269 --> 00:11:23,570 me conviene separar partes, es decir, a ver 295 00:11:23,570 --> 00:11:25,330 esta es mi parte 296 00:11:25,330 --> 00:11:27,110 de lo que son, coche es vehículo 297 00:11:27,110 --> 00:11:29,370 moto es vehículo, ya lo tengo todo hecho 298 00:11:29,370 --> 00:11:31,450 ahora, ¿qué es lo que pueden 299 00:11:31,450 --> 00:11:33,230 hacer, este puede ser vendido 300 00:11:33,230 --> 00:11:35,649 meter eso aquí, por lo que acabo 301 00:11:35,649 --> 00:11:37,289 de decir, ya me estropea el diseño 302 00:11:37,289 --> 00:11:39,110 me lo hace un poco feo, porque ¿qué lo hago? 303 00:11:39,190 --> 00:11:41,649 ¿lo pongo aquí en abstracto? no porque me obliga 304 00:11:41,649 --> 00:11:43,570 vale, pues entonces no lo pongo 305 00:11:43,570 --> 00:11:45,490 aquí para que esta no se vea obligada 306 00:11:45,490 --> 00:11:47,789 pero si no lo pongo aquí, tengo el problema 307 00:11:47,789 --> 00:11:49,470 de que un objeto coche 308 00:11:49,470 --> 00:11:53,529 no puede llamar a vender 309 00:11:53,529 --> 00:11:55,289 perdón, un objeto coche 310 00:11:55,289 --> 00:11:57,049 si está declarado como vehículo 311 00:11:57,049 --> 00:11:59,309 que será lo normal, que esté 312 00:11:59,309 --> 00:12:01,289 declarado como vehículo, aunque esté instanciado 313 00:12:01,289 --> 00:12:03,409 como coche, pues no puede llamar 314 00:12:03,409 --> 00:12:04,870 a vender, tengo que hacer el casting 315 00:12:04,870 --> 00:12:07,330 ¿verdad? porque el compilador 316 00:12:07,330 --> 00:12:09,470 me dice, perdona, pero esto está declarado 317 00:12:09,470 --> 00:12:11,429 como vehículo, yo no puedo 318 00:12:11,429 --> 00:12:13,470 llamar al método vender porque aquí no está 319 00:12:13,470 --> 00:12:15,350 entonces tendríamos que hacer el casting 320 00:12:15,350 --> 00:12:17,350 ¿vale? soluciones hay 321 00:12:17,350 --> 00:12:19,389 pero son feas, mejor si hacemos un diseño 322 00:12:19,389 --> 00:12:19,909 más bonito 323 00:12:19,909 --> 00:12:23,129 bueno, pues entonces, yo podría hacer 324 00:12:23,129 --> 00:12:25,590 muy bien, saco todo esto de vender 325 00:12:25,590 --> 00:12:27,350 de la idea de ser 326 00:12:27,350 --> 00:12:29,549 la saco, ahora me voy a la hacer 327 00:12:29,549 --> 00:12:31,269 ¿vale? la herencia 328 00:12:31,269 --> 00:12:38,889 sería ser que soy las interfaces serían que hago pues lo voy a sacar a la parte del que hago me 329 00:12:38,889 --> 00:12:44,769 hago una interfaz vendible porque las cosas que yo tenga por aquí algunas serán vendibles y otras no 330 00:12:44,769 --> 00:12:50,029 pues me hago una interfaz vendible que va por libre no tiene nada que ver con la clase vehículo está 331 00:12:50,029 --> 00:13:00,120 de aquí empieza con la palabra clave interfaz vale y aquí ya pongo el método o los métodos 332 00:13:00,120 --> 00:13:02,460 pueden ser muchos, que van a tener 333 00:13:02,460 --> 00:13:04,259 que ejecutar todos 334 00:13:04,259 --> 00:13:06,120 aquellos que quiera yo que se 335 00:13:06,120 --> 00:13:08,679 adquieran, que se adscriban a este comportamiento 336 00:13:08,679 --> 00:13:10,299 por ejemplo 337 00:13:10,299 --> 00:13:11,320 pues el método vender 338 00:13:11,320 --> 00:13:20,360 vale, la interfaz es una clase 339 00:13:20,360 --> 00:13:22,360 abstracta como si 340 00:13:22,360 --> 00:13:24,320 fuera una clase abstracta pura 341 00:13:24,320 --> 00:13:26,179 puede tener uno 342 00:13:26,179 --> 00:13:28,179 o muchos métodos, pero todos 343 00:13:28,179 --> 00:13:30,320 los que tenga serán 344 00:13:30,320 --> 00:13:31,080 abstractos 345 00:13:31,080 --> 00:13:34,120 vale, con el matiz de método por defecto 346 00:13:34,120 --> 00:13:35,639 que os digo ahora, pero eso lo digo después 347 00:13:35,639 --> 00:13:38,019 Os estoy mintiendo cuando os digo 348 00:13:38,019 --> 00:13:39,700 que todos son abstractos, pero no pasa nada. 349 00:13:39,820 --> 00:13:41,679 Luego ya arreglo la mentira. 350 00:13:42,000 --> 00:13:43,700 Pero en esencia es la idea de la interfaz. 351 00:13:44,759 --> 00:13:45,899 La idea de la interfaz es que 352 00:13:45,899 --> 00:13:47,620 tenga un montón de métodos vacíos. 353 00:13:48,019 --> 00:13:48,840 Voy a vender. 354 00:13:49,820 --> 00:13:51,759 Vendible. Cuando alguien es 355 00:13:51,759 --> 00:13:53,919 vendible, ¿qué más nos interesa que nos haga? 356 00:13:54,299 --> 00:13:56,100 Pues, por ejemplo, generar su factura. 357 00:14:03,600 --> 00:14:04,659 ¿Vale? Pues aquí se ponen 358 00:14:04,659 --> 00:14:06,120 los métodos vacíos 359 00:14:06,120 --> 00:14:08,440 que se supone que tiene que 360 00:14:08,440 --> 00:14:10,279 implementar aquel 361 00:14:10,279 --> 00:14:12,679 que quiera ser vendible 362 00:14:12,679 --> 00:14:14,659 que todavía habrá que decidir 363 00:14:14,659 --> 00:14:16,740 cómo hacer una para convertirse en vendible 364 00:14:16,740 --> 00:14:19,419 esto se declara 365 00:14:19,419 --> 00:14:19,879 y ya está 366 00:14:19,879 --> 00:14:22,960 y se declara porque yo he identificado 367 00:14:22,960 --> 00:14:25,059 que hay un comportamiento en mi aplicación 368 00:14:25,059 --> 00:14:26,379 que va por ahí 369 00:14:26,379 --> 00:14:28,639 que hay cosas que pueden ser vendibles 370 00:14:28,639 --> 00:14:29,639 pues yo las recojo ahí 371 00:14:29,639 --> 00:14:37,879 que podría no ser así 372 00:14:37,879 --> 00:14:41,000 imaginaos que ahora mi aplicación aumenta 373 00:14:41,000 --> 00:14:42,379 y yo en mi taller 374 00:14:42,379 --> 00:14:44,120 incorporo otro 375 00:14:44,120 --> 00:14:46,179 otro vehículo 376 00:14:46,179 --> 00:14:48,460 que es un triciclo 377 00:14:48,460 --> 00:14:52,120 vale 378 00:14:52,120 --> 00:14:53,860 imaginaos que yo esto de las interfaces 379 00:14:53,860 --> 00:14:56,279 lo he olvidado y no lo estoy usando 380 00:14:56,279 --> 00:14:57,100 y paso de ello 381 00:14:57,100 --> 00:14:59,700 resulta que 382 00:14:59,700 --> 00:15:02,440 los coches y los triciclos pueden ser vendidos 383 00:15:02,440 --> 00:15:04,299 los vehículos 384 00:15:04,299 --> 00:15:06,240 no, pues con todo 385 00:15:06,240 --> 00:15:07,759 esto que he dicho como si no existiera 386 00:15:07,759 --> 00:15:10,139 pues tendría que hacer aquí también un vender 387 00:15:10,139 --> 00:15:12,039 es decir 388 00:15:12,039 --> 00:15:13,220 duplicarlo todo 389 00:15:13,220 --> 00:15:15,980 quedaría como muy feo, de nuevo tendría el mismo 390 00:15:15,980 --> 00:15:18,340 problema, si yo tengo un triciclo 391 00:15:18,340 --> 00:15:20,019 instanciado como, declarado 392 00:15:20,019 --> 00:15:22,139 como vehículo, que es la idea, que esté declarado 393 00:15:22,139 --> 00:15:23,159 como la superclase 394 00:15:23,159 --> 00:15:26,059 si yo ya me voy a vender, no voy a poder 395 00:15:26,059 --> 00:15:27,460 voy a tener que hacer el casting 396 00:15:27,460 --> 00:15:29,500 nada, mala solución 397 00:15:29,500 --> 00:15:32,500 ir poniendo parches así, mala solución 398 00:15:32,500 --> 00:15:35,440 bueno, pues cuál es la solución 399 00:15:35,440 --> 00:15:37,759 hacer esta interfaz que acabo de decir 400 00:15:37,759 --> 00:15:40,000 que recoja esas 401 00:15:40,000 --> 00:15:41,279 cosas que tiene que hacer 402 00:15:41,279 --> 00:15:44,299 cualquier entidad que yo quiero que sea vendible 403 00:15:44,299 --> 00:15:45,960 y ahora 404 00:15:45,960 --> 00:15:48,419 decir, vale 405 00:15:48,419 --> 00:15:50,460 pues coche, que está 406 00:15:50,460 --> 00:15:54,830 por aquí, cuando yo declare 407 00:15:54,830 --> 00:16:01,919 coche, vale, cuando yo declare 408 00:16:01,919 --> 00:16:04,059 coche, class coche 409 00:16:04,059 --> 00:16:05,879 que herede de ese 410 00:16:05,879 --> 00:16:07,480 de vehículo, pues yo no tengo 411 00:16:07,480 --> 00:16:09,740 alternativa, lógicamente 412 00:16:09,740 --> 00:16:12,100 este es vehículo 413 00:16:12,100 --> 00:16:15,779 y ahora, además de heredar 414 00:16:15,779 --> 00:16:17,659 de vehículo, yo digo 415 00:16:17,659 --> 00:16:19,899 además de eso, tienes 416 00:16:19,899 --> 00:16:22,120 que implementar 417 00:16:22,120 --> 00:16:24,299 esto, tiene que adherirse 418 00:16:24,299 --> 00:16:26,600 a este comportamiento 419 00:16:26,600 --> 00:16:27,860 de aquí, porque es vendible 420 00:16:27,860 --> 00:16:30,179 luego tiene que implementar 421 00:16:30,179 --> 00:16:31,980 esto de aquí, pues entonces 422 00:16:31,980 --> 00:16:33,600 ¿qué añado después del stents? 423 00:16:34,000 --> 00:16:35,659 después del stents añado 424 00:16:35,659 --> 00:16:36,620 implement 425 00:16:36,620 --> 00:16:39,139 la interfaz que sea 426 00:16:39,139 --> 00:16:41,559 vendible 427 00:16:41,559 --> 00:16:44,019 y ya abro 428 00:16:44,019 --> 00:16:45,299 mis llaves y hago el código 429 00:16:45,299 --> 00:16:47,220 ¿vale? 430 00:16:47,860 --> 00:16:49,700 entonces, una entidad 431 00:16:49,700 --> 00:16:51,580 puede heredar 432 00:16:51,580 --> 00:16:52,879 de otra entidad 433 00:16:52,879 --> 00:16:55,059 solo de una y significa 434 00:16:55,059 --> 00:16:56,159 yo soy eso 435 00:16:56,159 --> 00:16:59,100 todo lo que tenga 436 00:16:59,100 --> 00:17:01,840 que es todo su estado, su descripción 437 00:17:01,840 --> 00:17:03,559 vehículo, pues su color 438 00:17:03,559 --> 00:17:05,680 su marca, lo que sea 439 00:17:05,680 --> 00:17:06,839 todo va a estar aquí 440 00:17:06,839 --> 00:17:09,599 entonces heredar significa 441 00:17:09,599 --> 00:17:11,359 coger propiedades, yo soy esto 442 00:17:11,359 --> 00:17:13,059 está asociado al verbo ser, yo soy esto 443 00:17:13,059 --> 00:17:14,299 vale, un segundo 444 00:17:14,299 --> 00:17:16,880 pero además de ser tú algo 445 00:17:16,880 --> 00:17:18,119 además de ser algo 446 00:17:18,119 --> 00:17:20,019 tú haces cosas 447 00:17:20,019 --> 00:17:22,359 bueno, pues esas cosas 448 00:17:22,359 --> 00:17:25,200 si se pueden interpretar 449 00:17:25,200 --> 00:17:27,119 como que son un rol 450 00:17:27,119 --> 00:17:28,500 específico 451 00:17:28,500 --> 00:17:30,440 como el rol de ser vendible 452 00:17:30,440 --> 00:17:33,079 en lugar de esas cosas que haces tú 453 00:17:33,079 --> 00:17:34,740 ponerlas todas aquí una detrás de otra 454 00:17:34,740 --> 00:17:36,599 que queda un diseño patateo 455 00:17:36,599 --> 00:17:38,859 como esas cosas están asociados 456 00:17:38,859 --> 00:17:40,640 a un rol concreto, en este caso 457 00:17:40,640 --> 00:17:42,900 ser vendible, pues lo sacas 458 00:17:42,900 --> 00:17:44,960 aquí a una interfaz, donde pones 459 00:17:44,960 --> 00:17:45,759 esas cositas 460 00:17:45,759 --> 00:17:48,779 en vacío, obligatorio 461 00:17:48,779 --> 00:17:51,319 y ahora dices, yo soy vehículo 462 00:17:51,319 --> 00:17:52,720 y además 463 00:17:52,720 --> 00:17:54,619 implemento esta interfaz 464 00:17:54,619 --> 00:17:56,420 y además la implemento 465 00:17:56,420 --> 00:17:57,799 entonces 466 00:17:57,799 --> 00:18:01,160 desde el momento en que tú pones aquí 467 00:18:01,160 --> 00:18:02,859 que implementas una interfaz 468 00:18:02,859 --> 00:18:05,200 de nuevo el compilador te va 469 00:18:05,200 --> 00:18:07,059 a obligar, como pasaba con las clases 470 00:18:07,059 --> 00:18:09,000 abstractas, te va a obligar a decir, vale 471 00:18:09,000 --> 00:18:11,240 muy bien, tú implementas vendible 472 00:18:11,240 --> 00:18:13,299 pues por favor 473 00:18:13,299 --> 00:18:15,420 dame código a esto 474 00:18:15,420 --> 00:18:17,380 vale, tú le das 475 00:18:17,380 --> 00:18:18,500 código a eso y ya está 476 00:18:18,500 --> 00:18:25,619 esto es lo que en términos de desarrollo 477 00:18:25,619 --> 00:18:27,299 de programación, esto es como si 478 00:18:27,299 --> 00:18:29,099 fueran los términos de un contrato 479 00:18:29,099 --> 00:18:31,740 aquí está, en la interfaz está el contrato 480 00:18:31,740 --> 00:18:32,759 que es 481 00:18:32,759 --> 00:18:35,640 esto es lo que tienes que hacer 482 00:18:35,640 --> 00:18:36,900 el contrato 483 00:18:36,900 --> 00:18:40,079 en general te compromete 484 00:18:40,079 --> 00:18:41,299 a unos servicios 485 00:18:41,299 --> 00:18:43,779 ¿vale? pues eso es una interfaz 486 00:18:43,779 --> 00:18:46,359 un contrato que te compromete 487 00:18:46,359 --> 00:18:47,460 a que hagas esto 488 00:18:47,460 --> 00:18:49,539 si tú 489 00:18:49,539 --> 00:18:51,160 firmas ese contrato 490 00:18:51,160 --> 00:18:52,819 y firmarlo es poniendo 491 00:18:52,819 --> 00:18:54,799 implements la interfaz que sea 492 00:18:54,799 --> 00:18:57,240 automáticamente tienes 493 00:18:57,240 --> 00:18:59,640 que dar cuerpo, implementar 494 00:18:59,640 --> 00:19:00,839 tú dentro de ti 495 00:19:00,839 --> 00:19:03,019 esos métodos 496 00:19:03,019 --> 00:19:05,039 a tu manera, como a ti te dé la gana 497 00:19:05,039 --> 00:19:07,400 ¿y esa interfaz 498 00:19:07,400 --> 00:19:09,160 iría dentro de la clase vehículo? 499 00:19:09,519 --> 00:19:11,160 no, es una clase aparte 500 00:19:11,160 --> 00:19:12,700 o sea, solamente es que 501 00:19:12,700 --> 00:19:14,319 claro, es otra clase más 502 00:19:14,319 --> 00:19:14,920 vale, vale 503 00:19:14,920 --> 00:19:17,940 tampoco puede ser 504 00:19:17,940 --> 00:19:19,680 a lo largo de dos interfaces 505 00:19:19,680 --> 00:19:27,859 Sí, entonces, la diferencia es que una clase puede implementar todas las interfaces que le den la gana. 506 00:19:29,640 --> 00:19:36,160 Imaginaos que este taller mecánico mío, con los vehículos, con algunos sí, con otros no, 507 00:19:36,279 --> 00:19:42,160 pues hay una actividad muy concreta que es la actividad de ir a exposición, exponible, llamémosla exponible. 508 00:19:42,160 --> 00:19:44,779 Pues uno podría hacer aquí una interfaz 509 00:19:44,779 --> 00:19:45,880 ¿Vale? 510 00:19:48,200 --> 00:19:50,400 Uno podría hacer aquí una interfaz que fuera 511 00:19:50,400 --> 00:19:52,460 Exponible 512 00:19:52,460 --> 00:19:56,589 Y en esa interfaz 513 00:19:56,589 --> 00:19:58,170 Poner ahí dentro los métodos 514 00:19:58,170 --> 00:20:00,490 Poner caseta 515 00:20:00,490 --> 00:20:02,809 O yo que sé 516 00:20:02,809 --> 00:20:04,289 O mostrar mensaje 517 00:20:04,289 --> 00:20:04,809 Lo que fuera 518 00:20:04,809 --> 00:20:08,250 ¿Vale? Ese sería el contrato 519 00:20:08,250 --> 00:20:10,490 Que tú tienes que satisfacer, que garantizar 520 00:20:10,490 --> 00:20:11,630 Lo que tú tienes que hacer 521 00:20:11,630 --> 00:20:13,089 Si eres exponible 522 00:20:13,089 --> 00:20:15,309 ¿vale? pues entonces 523 00:20:15,309 --> 00:20:17,069 a lo mejor el coche 524 00:20:17,069 --> 00:20:19,309 es vendible y además exponible 525 00:20:19,309 --> 00:20:21,069 pues el coche tendría 526 00:20:21,069 --> 00:20:22,869 implements vendible 527 00:20:22,869 --> 00:20:24,470 coma exponible 528 00:20:24,470 --> 00:20:26,829 como se implementa 200.000 529 00:20:26,829 --> 00:20:30,799 heredar solo de una 530 00:20:30,799 --> 00:20:32,200 tú solo eres una cosa 531 00:20:32,200 --> 00:20:35,299 en Java solo eres una cosa, no puede ser más 532 00:20:35,299 --> 00:20:37,160 tu esencia es una 533 00:20:37,160 --> 00:20:39,339 pero lo que tú haces 534 00:20:39,339 --> 00:20:43,599 los roles que tú tienes en una aplicación 535 00:20:43,599 --> 00:20:46,079 como alumno, como coche 536 00:20:46,079 --> 00:20:47,819 como pueden ser miles 537 00:20:47,819 --> 00:20:49,940 ¿vale? tú puedes implementar 538 00:20:49,940 --> 00:20:51,200 200.000 interfaces 539 00:20:51,200 --> 00:20:54,420 tantas como roles identifique tu aplicación 540 00:20:54,420 --> 00:20:55,240 que tienen sentido 541 00:20:55,240 --> 00:20:57,700 entonces pues triciclo 542 00:20:57,700 --> 00:20:59,940 heredaría de vehículo pero a lo mejor implementaría 543 00:20:59,940 --> 00:21:01,079 vendible, pero 544 00:21:01,079 --> 00:21:03,200 fonible pues no la implementaría 545 00:21:03,200 --> 00:21:06,160 ¿vale? pues moto igual no implementa 546 00:21:06,160 --> 00:21:07,019 ninguna de las dos 547 00:21:07,019 --> 00:21:09,279 entonces de nuevo 548 00:21:09,279 --> 00:21:11,960 es otra herramienta de diseño más 549 00:21:11,960 --> 00:21:14,220 que facilita muchísimo 550 00:21:14,220 --> 00:21:16,279 las cosas cuando el diseño 551 00:21:16,279 --> 00:21:17,519 se ha planteado desde el principio 552 00:21:17,519 --> 00:21:19,880 diseño horrible 553 00:21:19,880 --> 00:21:22,380 todas mis clases son clases 554 00:21:22,380 --> 00:21:24,460 separadas y ninguna relación entre ellas 555 00:21:24,460 --> 00:21:26,500 ahí no hay polimorfismo 556 00:21:26,500 --> 00:21:28,279 no hay nada, me complica mucho la vida 557 00:21:28,279 --> 00:21:30,240 cada clase la hago todo lo suyo 558 00:21:30,240 --> 00:21:32,019 ahí dentro, no puedo 559 00:21:32,019 --> 00:21:33,619 meterlas juntas en colecciones 560 00:21:33,619 --> 00:21:36,059 de cada clase tengo que 561 00:21:36,059 --> 00:21:37,980 enterarme que métodos tiene 562 00:21:37,980 --> 00:21:40,119 aquí si 563 00:21:40,119 --> 00:21:43,180 yo tengo varias clases que implementan 564 00:21:43,180 --> 00:21:45,059 vendible y ahora soy otra clase 565 00:21:45,059 --> 00:21:47,299 de otro método, ah, me están pasando 566 00:21:47,299 --> 00:21:49,000 un vendible, vale, me da igual 567 00:21:49,000 --> 00:21:51,059 lo que me están pasando, me da igual que sea un coche, que sea una moto 568 00:21:51,059 --> 00:21:52,940 me pasan un vendible, yo llamo a vender 569 00:21:52,940 --> 00:21:53,660 y ya está 570 00:21:53,660 --> 00:21:57,079 vale, si no, tendríamos que 571 00:21:57,079 --> 00:21:59,039 hacer el método para versión 572 00:21:59,039 --> 00:22:01,119 pásame coche, versión pásame triciclo 573 00:22:01,119 --> 00:22:02,440 versión pásame no sé qué 574 00:22:02,440 --> 00:22:04,859 así no, haces versión 575 00:22:04,859 --> 00:22:07,000 pásame vendible, se acabó, como yo sé 576 00:22:07,000 --> 00:22:08,039 que tiene un método vender 577 00:22:08,039 --> 00:22:09,720 pues llamó a vender 578 00:22:09,720 --> 00:22:11,279 y se acabó 579 00:22:11,279 --> 00:22:14,720 ¿no haría falta hacerle casting 580 00:22:14,720 --> 00:22:15,940 a la hora de llamar a la empresa? 581 00:22:16,640 --> 00:22:18,700 no, porque está aquí, es como si tú lo pones 582 00:22:18,700 --> 00:22:19,700 en una clase abstracta 583 00:22:19,700 --> 00:22:22,160 si está en la superclase 584 00:22:22,160 --> 00:22:24,799 esta es como si fuera una superclase 585 00:22:24,799 --> 00:22:26,700 abstracta, abstracta pura 586 00:22:28,359 --> 00:22:28,740 ¿vale? 587 00:22:30,119 --> 00:22:30,940 entonces luego ya hay 588 00:22:30,940 --> 00:22:32,759 detalles ya concretos de sintaxis 589 00:22:32,759 --> 00:22:34,559 que ya son detallitos, pues como que 590 00:22:34,559 --> 00:22:36,079 por defecto 591 00:22:36,079 --> 00:22:38,480 los métodos son siempre 592 00:22:38,480 --> 00:22:40,420 public, porque esto siempre está pensado 593 00:22:40,420 --> 00:22:42,559 para un empaquetamiento, son diseños de paquetes 594 00:22:42,559 --> 00:22:44,640 donde lógicamente las interfaces 595 00:22:44,640 --> 00:22:46,519 se ponen en un paquete, las clases en 596 00:22:46,519 --> 00:22:47,980 otras, entonces 597 00:22:47,980 --> 00:22:49,859 los métodos 598 00:22:49,859 --> 00:22:52,359 no se pone el public, porque 599 00:22:52,359 --> 00:22:54,380 por defecto son siempre public, aquí no hace 600 00:22:54,380 --> 00:22:56,299 falta ponerlo, no es como las clases abstractas 601 00:22:56,299 --> 00:22:57,799 que la clase abstracta es como una clase 602 00:22:57,799 --> 00:23:00,140 raruna, entonces ahí sí que lo 603 00:23:00,140 --> 00:23:02,259 sigue todas las reglas, en la interfaz 604 00:23:02,259 --> 00:23:03,680 aquí no pones nada 605 00:23:03,680 --> 00:23:11,440 Ese método vender lo tenéis que meter en la subclase 606 00:23:11,440 --> 00:23:13,880 En la subclase lo tienes que implementar 607 00:23:13,880 --> 00:23:14,680 Obligatoriamente 608 00:23:14,680 --> 00:23:18,859 Desde el momento en que tú pongas 609 00:23:18,859 --> 00:23:20,279 Implements esto 610 00:23:20,279 --> 00:23:23,160 Tienes que hacer esto de aquí 611 00:23:23,160 --> 00:23:24,619 Porque yo estaba pensando que 612 00:23:24,619 --> 00:23:26,680 Lo que hacía Interface 613 00:23:26,680 --> 00:23:28,980 Era que tú hacías un método 614 00:23:28,980 --> 00:23:29,880 En vehículo 615 00:23:29,880 --> 00:23:32,799 Y luego lo podías meter en coche pero luego en motor 616 00:23:32,799 --> 00:23:35,119 O sea el método ese vender 617 00:23:35,119 --> 00:23:36,160 Yo lo podría hacer en vehículo 618 00:23:36,160 --> 00:23:40,500 A ver 619 00:23:40,500 --> 00:23:43,400 Si lo haces aquí en vehículo 620 00:23:43,400 --> 00:23:45,099 Como abstracto, lo puedes, pero es que entonces 621 00:23:45,099 --> 00:23:47,579 Bueno, como sea 622 00:23:47,579 --> 00:23:49,519 Ya, pero el problema es que entonces lo va a tener alguien 623 00:23:49,519 --> 00:23:50,160 Que no lo quiere 624 00:23:50,160 --> 00:23:52,420 Cualquiera que herede de vehículo 625 00:23:52,420 --> 00:23:54,779 Aquí el tema es dar flexibilidad 626 00:23:54,779 --> 00:23:57,480 Hay muchas cosas que son vehículo 627 00:23:57,480 --> 00:23:58,900 Y tienen que estar ahí 628 00:23:58,900 --> 00:24:00,619 Porque hacen cosas de vehículo 629 00:24:00,619 --> 00:24:03,619 Como pintarse, lo que sea 630 00:24:03,619 --> 00:24:05,279 Pero claro 631 00:24:05,279 --> 00:24:06,920 si pones aquí vender 632 00:24:06,920 --> 00:24:09,079 también te queda aquí un vender 633 00:24:09,079 --> 00:24:11,240 y eso no, eso solo 634 00:24:11,240 --> 00:24:12,940 los que sean vendibles 635 00:24:12,940 --> 00:24:15,319 ¿vale? entonces al final 636 00:24:15,319 --> 00:24:17,140 realmente las clases se relacionan 637 00:24:17,140 --> 00:24:19,539 de una manera, de una jerarquía muy rara 638 00:24:19,539 --> 00:24:21,160 tú heredas de algo pero luego 639 00:24:21,160 --> 00:24:22,980 implementas un montón de cosas que a su vez 640 00:24:22,980 --> 00:24:25,180 implementan otras cosas que no heredan de ti 641 00:24:25,180 --> 00:24:26,619 porque en esta aplicación 642 00:24:26,619 --> 00:24:29,200 podría haber otra jerarquía que no fueran vehículos 643 00:24:29,200 --> 00:24:31,039 que fueran 644 00:24:31,039 --> 00:24:33,359 empleados, y los empleados 645 00:24:33,359 --> 00:24:35,460 pues aquí tratamos 646 00:24:35,460 --> 00:24:37,380 con los empleados una trata de esclavos 647 00:24:37,380 --> 00:24:39,839 y tú los puedes vender también, entonces el empleado 648 00:24:39,839 --> 00:24:41,200 crearía de empleado 649 00:24:41,200 --> 00:24:43,359 podría implementar vendible también 650 00:24:43,359 --> 00:24:45,400 entonces pueden implementar 651 00:24:45,400 --> 00:24:47,339 la interfaz, clases que 652 00:24:47,339 --> 00:24:49,579 a su vez no heredan de la misma superclase 653 00:24:49,579 --> 00:24:52,980 por supuesto, vale 654 00:24:52,980 --> 00:24:58,210 y luego bueno 655 00:24:58,210 --> 00:25:00,130 hay pequeños detalles ya de 656 00:25:00,130 --> 00:25:01,950 sintaxis 657 00:25:01,950 --> 00:25:03,069 ya de que son detalles 658 00:25:03,069 --> 00:25:05,450 lo que nos importa es la idea 659 00:25:05,450 --> 00:25:07,529 que bueno, que menciono un poco 660 00:25:07,529 --> 00:25:31,529 Pues, por ejemplo, en las interfaces, por supuesto, no se pueden declarar propiedades porque la interfaz no es algo que se pueda instanciar. O sea, la interfaz no refleja un estado, no describe a nada. La interfaz está pensada solo para describir un comportamiento, un rol. Luego, aquí propiedades nunca se pueden poner. 661 00:25:31,529 --> 00:25:34,470 Pues vendible 662 00:25:34,470 --> 00:25:36,309 Int, vendedor 663 00:25:36,309 --> 00:25:38,490 Propiedades como de cualquier 664 00:25:38,490 --> 00:25:39,950 Como haces en cualquier otra clase 665 00:25:39,950 --> 00:25:44,450 No, parámelos 666 00:25:44,450 --> 00:25:46,549 Propiedades, campos, variables 667 00:25:46,549 --> 00:25:48,769 Como quieras llamarlo, hemos llamado propiedades normalmente 668 00:25:48,769 --> 00:25:50,730 Claro, solo métodos 669 00:25:50,730 --> 00:25:52,089 ¿Vale? Salvo 670 00:25:52,089 --> 00:25:53,509 Contenido estático, sí 671 00:25:53,509 --> 00:25:55,990 El contenido estático, sí 672 00:25:55,990 --> 00:25:58,369 Algo estático, sí, porque el estático es como si fuera 673 00:25:58,369 --> 00:25:59,329 Una variable global 674 00:25:59,329 --> 00:26:02,569 entonces si tú quieres reflejar 675 00:26:02,569 --> 00:26:04,849 una información asociada 676 00:26:04,849 --> 00:26:05,910 al rol de vender 677 00:26:05,910 --> 00:26:09,009 siempre y cuando sea común para todo el mundo 678 00:26:09,009 --> 00:26:10,670 para todos los vendedores 679 00:26:10,670 --> 00:26:12,170 para todas las cosas vendibles 680 00:26:12,170 --> 00:26:14,190 que no te sea cada una lo suya 681 00:26:14,190 --> 00:26:16,829 pues entonces lo puedes poner aquí como variable 682 00:26:16,829 --> 00:26:17,490 estática 683 00:26:17,490 --> 00:26:20,690 pero solo estático 684 00:26:20,690 --> 00:26:22,569 admite esto y es una información 685 00:26:22,569 --> 00:26:25,150 común que está ahí recogida 686 00:26:25,150 --> 00:26:26,910 por si alguien no sabe dónde poner 687 00:26:26,910 --> 00:26:28,250 una información común general 688 00:26:28,250 --> 00:26:29,990 pues a lo mejor le pega ponerla aquí 689 00:26:29,990 --> 00:26:32,690 pero no sería nada que describiera 690 00:26:32,690 --> 00:26:34,730 específicamente a cada una 691 00:26:34,730 --> 00:26:36,450 de las cosas vendibles, eso no 692 00:26:36,450 --> 00:26:38,950 ¿vale? entonces puede aparecer 693 00:26:38,950 --> 00:26:40,849 ahí algo estático 694 00:26:40,849 --> 00:26:42,230 que se llamaría con el nombre de la interfaz 695 00:26:42,230 --> 00:26:44,349 vendible punto lo que fuera, pues por meter ahí 696 00:26:44,349 --> 00:26:45,769 información, eso sí se puede 697 00:26:45,769 --> 00:26:48,609 lo estático no se hereda, o sea cuando 698 00:26:48,609 --> 00:26:49,829 uno pone implements 699 00:26:49,829 --> 00:26:52,690 lo estático no se lo 700 00:26:52,690 --> 00:26:52,970 queda 701 00:26:52,970 --> 00:26:56,690 el que implementa, lo estático no se 702 00:26:56,690 --> 00:26:58,670 queda, entonces imaginaos que hay una 703 00:26:58,670 --> 00:27:00,150 variable estática x 704 00:27:00,150 --> 00:27:02,269 aunque coche 705 00:27:02,269 --> 00:27:04,710 implement vendible, yo no puedo 706 00:27:04,710 --> 00:27:06,170 decir coche punto x 707 00:27:06,170 --> 00:27:08,650 tendría que decir vendible punto 708 00:27:08,650 --> 00:27:11,130 x, vale, lo estático 709 00:27:11,130 --> 00:27:12,990 pertenece a la interfaz 710 00:27:12,990 --> 00:27:14,250 solamente, no se hereda 711 00:27:14,250 --> 00:27:16,750 y al igual que hay variables 712 00:27:16,750 --> 00:27:18,569 estáticas puede haber propiedad 713 00:27:18,569 --> 00:27:19,990 métodos estáticos 714 00:27:19,990 --> 00:27:22,670 que trabajen con esas propiedades por si por 715 00:27:22,670 --> 00:27:24,410 alguna razón, yo que sé, hay una utilidad 716 00:27:24,410 --> 00:27:26,710 una utilidad general 717 00:27:26,710 --> 00:27:28,809 con esta variable 718 00:27:28,809 --> 00:27:30,750 una utilidad que a mí me interesa usar 719 00:27:30,750 --> 00:27:33,349 que es absolutamente independiente 720 00:27:33,349 --> 00:27:34,150 de los objetos 721 00:27:34,150 --> 00:27:37,069 que está relacionada con este rol 722 00:27:37,069 --> 00:27:39,089 pues yo que sé, pero no tiene que ver 723 00:27:39,089 --> 00:27:40,750 con los objetos, pues la puedo meter ahí 724 00:27:40,750 --> 00:27:42,690 y la llamaría con el nombre de la interfaz 725 00:27:42,690 --> 00:27:44,349 vendible punto, la utilidad que fue 726 00:27:44,349 --> 00:27:46,630 pero esa ni se le da ni nada 727 00:27:46,630 --> 00:27:49,250 bueno, pues que lo sepáis, que puede haber contenido estático 728 00:27:49,250 --> 00:27:49,470 ahí 729 00:27:49,470 --> 00:27:53,309 que bueno, normalmente, salvo alguna constante 730 00:27:53,309 --> 00:27:55,470 que me interese 731 00:27:55,470 --> 00:27:57,009 a mí en toda la aplicación, es raro 732 00:27:57,009 --> 00:27:58,950 que las interfaces tengan, usen 733 00:27:58,950 --> 00:28:00,650 eso estático 734 00:28:00,650 --> 00:28:06,460 ¿Para los métodos? 735 00:28:08,119 --> 00:28:09,559 ¿A los métodos? Sí, claro 736 00:28:09,559 --> 00:28:11,500 Sí, yo aquí los he puesto en vacío por 737 00:28:11,500 --> 00:28:13,900 parámetros, devolver lo que sea 738 00:28:13,900 --> 00:28:15,380 el método puede tener la cabecera que sea 739 00:28:15,380 --> 00:28:18,240 vender podría tener aquí un objeto vendedor 740 00:28:18,240 --> 00:28:20,200 lo que fuera, y devolver a lo mejor 741 00:28:20,200 --> 00:28:22,059 dabble, que fuera el precio que te han dado 742 00:28:22,059 --> 00:28:23,920 claro, claro, la cabecera puede ser cualquiera 743 00:28:23,920 --> 00:28:26,000 ¿Vale? El public es 744 00:28:26,000 --> 00:28:27,940 lo que no aparece porque se asume por defecto 745 00:28:27,940 --> 00:28:32,650 siempre. Una casi 746 00:28:32,650 --> 00:28:34,490 última cosa, digo casi porque luego de 747 00:28:34,490 --> 00:28:36,309 interfaces lo interesantísimo 748 00:28:36,309 --> 00:28:38,509 viene cuando las convertimos en 749 00:28:38,509 --> 00:28:40,210 interfaces funcionales. 750 00:28:40,930 --> 00:28:42,690 Pero eso ya es una cosa muy complicada 751 00:28:42,690 --> 00:28:44,529 pero maravillosa 752 00:28:44,529 --> 00:28:46,769 que incorporamos un poco más adelante. 753 00:28:47,569 --> 00:28:48,849 Por eso digo casi lo último 754 00:28:48,849 --> 00:28:50,170 que os quiero decir de interfaces. 755 00:28:51,150 --> 00:28:52,750 Es que desde no sé qué versión 756 00:28:52,750 --> 00:28:54,609 se admite 757 00:28:54,609 --> 00:28:56,670 meter aquí 758 00:28:56,670 --> 00:28:58,309 una versión por defecto. 759 00:28:58,650 --> 00:29:00,450 de los métodos 760 00:29:00,450 --> 00:29:02,430 entonces si uno pone un default delante 761 00:29:02,430 --> 00:29:03,730 de alguno de estos métodos 762 00:29:03,730 --> 00:29:06,410 entonces le puede poner un cuerpo 763 00:29:06,410 --> 00:29:08,509 y ahora esa es una 764 00:29:08,509 --> 00:29:10,190 como si fuera una versión por defecto 765 00:29:10,190 --> 00:29:12,569 entonces las subclases 766 00:29:12,569 --> 00:29:14,690 si no implementan 767 00:29:14,690 --> 00:29:16,130 ese método que 768 00:29:16,130 --> 00:29:18,730 tenga versión por defecto, no están obligadas 769 00:29:18,730 --> 00:29:20,650 se quedan con la versión por defecto 770 00:29:21,670 --> 00:29:22,230 ¿vale? 771 00:29:23,829 --> 00:29:24,789 y las que 772 00:29:24,789 --> 00:29:26,430 no estén implementadas 773 00:29:26,430 --> 00:29:28,130 pues esas tienes que implementarlas sí o sí 774 00:29:28,130 --> 00:29:31,549 entonces los default no se usan 775 00:29:31,549 --> 00:29:33,210 mucho porque tienen 776 00:29:33,210 --> 00:29:35,069 cierto peligro, porque si tú haces aquí una versión 777 00:29:35,069 --> 00:29:35,809 por defecto 778 00:29:35,809 --> 00:29:38,369 todas se lo quedan 779 00:29:38,369 --> 00:29:41,049 y ni el compilador ni nadie te avisa 780 00:29:41,049 --> 00:29:42,970 de que hay un método ahí que tienes que sobreescribir 781 00:29:42,970 --> 00:29:45,130 entonces a lo mejor te estás quedando 782 00:29:45,130 --> 00:29:46,710 con una versión por defecto 783 00:29:46,710 --> 00:29:48,910 que luego alguien en otra clase 784 00:29:48,910 --> 00:29:50,410 está llamando a ese método 785 00:29:50,410 --> 00:29:53,210 y no hace exactamente lo que tú querrías 786 00:29:53,210 --> 00:29:54,690 entonces tiene ese peligro 787 00:29:54,690 --> 00:29:56,970 pero a cambio, ¿por qué se incorporó? 788 00:29:56,970 --> 00:29:58,750 porque tiene una ventaja clarísima 789 00:29:58,750 --> 00:30:00,650 y es que 790 00:30:00,650 --> 00:30:03,190 te permite ampliar 791 00:30:03,190 --> 00:30:04,509 código, escalar código 792 00:30:04,509 --> 00:30:06,349 sin tocarte mucho las pelotas 793 00:30:06,349 --> 00:30:08,609 porque yo empiezo aquí a añadir entidades 794 00:30:08,609 --> 00:30:10,509 que todas van a ser vendibles 795 00:30:10,509 --> 00:30:12,009 pero hombre 796 00:30:12,009 --> 00:30:14,630 a lo mejor en algunas de ellas 797 00:30:14,630 --> 00:30:16,190 hay métodos que no 798 00:30:16,190 --> 00:30:18,769 que no quiero sobreescribir todavía 799 00:30:18,769 --> 00:30:20,230 porque no lo sé o porque 800 00:30:20,230 --> 00:30:22,750 pues hombre, si no hay versiones 801 00:30:22,750 --> 00:30:23,869 por defecto en ninguno 802 00:30:23,869 --> 00:30:26,809 cada uno que, pum, implemente 803 00:30:26,809 --> 00:30:28,569 vendible, que se adhiera aquí 804 00:30:28,569 --> 00:30:31,029 todos tienen que implementar el método 805 00:30:31,029 --> 00:30:32,490 vender, todos, todos, todos 806 00:30:32,490 --> 00:30:33,990 entonces el default 807 00:30:33,990 --> 00:30:36,670 me permite que no 808 00:30:36,670 --> 00:30:38,769 tengan que estar todas las clases 809 00:30:38,769 --> 00:30:40,630 que implementan eso, pues poniéndolo 810 00:30:40,630 --> 00:30:42,869 se quedan con su versión por defecto y ya está 811 00:30:42,869 --> 00:30:44,269 pero hay que usarlo con cuidado 812 00:30:44,269 --> 00:30:46,890 hay que tener cuidado en que todo 813 00:30:46,890 --> 00:30:48,809 no genere 814 00:30:48,809 --> 00:30:49,869 efectos extraños 815 00:30:49,869 --> 00:30:53,029 que luego uno ejecuta 816 00:30:53,029 --> 00:30:54,890 la aplicación, la aplicación no da ningún error 817 00:30:54,890 --> 00:30:56,109 de ejecución, todo bien 818 00:30:56,109 --> 00:30:58,250 pero los resultados no 819 00:30:58,250 --> 00:31:00,390 uy, esto no tiene ninguna coherencia 820 00:31:00,390 --> 00:31:02,950 ese es el problema más grave 821 00:31:02,950 --> 00:31:05,990 pues eso se evita 822 00:31:05,990 --> 00:31:09,130 con un diseño cuidadoso 823 00:31:09,130 --> 00:31:12,890 bueno, pues esta es la idea 824 00:31:12,890 --> 00:31:14,329 de interfaces 825 00:31:14,329 --> 00:31:17,140 está claro, ¿no? 826 00:31:19,089 --> 00:31:21,710 tienen la misma ventaja que tienen las superclases 827 00:31:22,230 --> 00:31:23,630 que si algo 828 00:31:23,630 --> 00:31:25,109 implementa una interfaz 829 00:31:25,109 --> 00:31:26,890 lo puedes declarar 830 00:31:26,890 --> 00:31:27,930 como 831 00:31:27,930 --> 00:31:32,170 referencia de esa interfaz 832 00:31:32,170 --> 00:31:33,369 pero bueno, eso vamos a verlo mejor 833 00:31:33,369 --> 00:31:35,109 con un ejemplo 834 00:31:35,109 --> 00:31:35,950 antes de 835 00:31:35,950 --> 00:31:38,150 que nos 836 00:31:38,150 --> 00:31:40,329 volvamos muy locos