1 00:00:00,940 --> 00:00:08,480 Voy a grabar esta clase, por lo tanto, si habláis, me autorizáis a grabar vuestras voces, ¿vale? 2 00:00:09,339 --> 00:00:14,980 Nosotros hemos visto en episodios anteriores las clases abstractas. 3 00:00:14,980 --> 00:00:24,980 Hemos visto que son clases que pueden incluir algunos métodos del que yo indico el prototipo, 4 00:00:25,820 --> 00:00:29,539 pero sin indicar la implementación, sin indicar el cuerpo. 5 00:00:29,539 --> 00:00:42,479 Yo digo que estas clases van a tener este método, sé cómo se utilizará este método, sé qué parámetros tendrá y sé qué devolverá, pero no sé cómo se hará, ¿vale? 6 00:00:42,700 --> 00:00:54,520 Como es abstracto, la clase es abstracta y por lo tanto no es instanciable, no puedo crear un objeto de esa clase abstracta, no puedo hacer una new de esta clase abstracta, ¿vale? 7 00:00:54,520 --> 00:00:57,920 cualquier clase que herede 8 00:00:57,920 --> 00:01:01,439 que haga un extens de esta clase abstracta 9 00:01:01,439 --> 00:01:04,980 pues tendrá necesariamente que implementar 10 00:01:04,980 --> 00:01:09,579 todos los métodos abstractos de la clase padre 11 00:01:09,579 --> 00:01:13,159 o declararse abstracta a su vez 12 00:01:13,159 --> 00:01:13,879 ¿vale? 13 00:01:14,439 --> 00:01:17,040 yo podría extender una clase abstracta 14 00:01:17,040 --> 00:01:18,939 con otra clase abstracta 15 00:01:18,939 --> 00:01:21,140 donde añado más métodos abstractos 16 00:01:21,140 --> 00:01:22,000 voy a hacer 17 00:01:22,000 --> 00:01:28,719 Entonces el hijo de la segunda clase abstracta tendrá que implementar todos los métodos de la primera y todos los métodos de la segunda. 18 00:01:31,519 --> 00:01:40,000 Pero la clase abstracta sigue siendo una clase, o sea que una parte de ella puede ser concreta. 19 00:01:40,659 --> 00:01:47,000 Yo puedo poner algunos métodos que sí implemento allí, algunos constructores que sí implemento allí, 20 00:01:47,000 --> 00:01:57,000 Y algunos métodos que me dejo abstractos. Es un híbrido. Tiene partes implementadas y partes no implementadas. 21 00:01:57,939 --> 00:02:11,319 Cuando yo haré un hijo, cuando tengo una clase, una subclase, pues lo que tengo que hacer es implementar necesariamente los métodos abstractos y los métodos concretos los heredo. 22 00:02:11,319 --> 00:02:19,479 En ese punto puedo decidir si usar directamente esos, si sobreescribirlos, overwrite completamente, 23 00:02:20,259 --> 00:02:26,360 o hacer un overwrite, que es lo que se suele hacer, que como primera línea reúsa el método de mi padre, 24 00:02:26,560 --> 00:02:33,219 o sea, hace esa cosa como si fuera un padre, y luego añade más cosas propias del hijo. 25 00:02:33,219 --> 00:02:38,259 como por ejemplo un método de inscripción 26 00:02:38,259 --> 00:02:39,900 un toString es 27 00:02:39,900 --> 00:02:42,180 asumible que lo que haga 28 00:02:42,180 --> 00:02:43,840 es un toString del padre 29 00:02:43,840 --> 00:02:45,379 super.toString 30 00:02:45,379 --> 00:02:48,139 entonces escribe toda la situación del padre 31 00:02:48,139 --> 00:02:50,319 y a eso le añade 32 00:02:50,319 --> 00:02:51,960 lo propio del hijo 33 00:02:51,960 --> 00:02:54,319 los parámetros propios del hijo 34 00:02:54,319 --> 00:02:55,500 ¿dudas? 35 00:02:56,240 --> 00:02:57,719 vale, ahora 36 00:02:57,719 --> 00:03:00,419 puede ser 37 00:03:00,419 --> 00:03:02,259 que haya situaciones 38 00:03:02,259 --> 00:03:04,379 extremas en el 39 00:03:04,379 --> 00:03:12,979 mi clase abstracta solo tenga métodos abstractos, ¿vale? Nosotros hemos visto clases que no 40 00:03:12,979 --> 00:03:16,560 tienen ningún método abstracto, hemos visto clases que tienen algún método abstracto 41 00:03:16,560 --> 00:03:22,879 y alguno no, ¿vale? Podría ser que haya una situación en la que yo defino solo métodos 42 00:03:22,879 --> 00:03:27,460 abstractos. No te digo en ningún caso, oye, mira, este método es así y se hace de esta 43 00:03:27,460 --> 00:03:33,020 forma, porque todos los métodos que estoy haciendo, sustancialmente, tendrán que ser 44 00:03:33,020 --> 00:03:42,900 implementado por mis hijos, no por mí. En ese caso, lo que estoy definiendo no es una propia clase, 45 00:03:43,900 --> 00:03:55,020 pero es un contrato, es un esquema en el que yo te digo, te informo de cuáles tienen que ser los métodos 46 00:03:55,020 --> 00:04:02,860 métodos que va a implementar la clase hija. Te voy a decir, mira, cualquier clase que 47 00:04:02,860 --> 00:04:09,699 implemente mi clase, que extienda mi clase, que herede de mi clase, tendrá necesariamente 48 00:04:09,699 --> 00:04:15,419 que tener el método calcula área que le paso este parámetro, el método calcula perímetro 49 00:04:15,419 --> 00:04:19,160 que no le paso parámetro, el método no sé qué, no sé cuánto. Te estoy haciendo un 50 00:04:19,160 --> 00:04:27,399 listado de lo que podrá hacer cualquiera de las clases que heredan de estas clases abstractas. 51 00:04:29,660 --> 00:04:39,959 Al darse cuenta de eso, Java dice, vale, vamos a hacer así. Ponemos, las clases abstractas tal y 52 00:04:39,959 --> 00:04:46,319 como hemos visto hasta ahora siguen existiendo y son las clases donde yo tengo un poco de clase 53 00:04:46,319 --> 00:04:48,379 desarrollada y un poco de clase 54 00:04:48,379 --> 00:04:50,560 que se me queda así abstracta 55 00:04:50,560 --> 00:04:51,959 y que implementaré en mis hijos. 56 00:04:52,439 --> 00:04:54,660 Pero en el caso en el que quiera 57 00:04:54,660 --> 00:04:56,720 hacer uno de estos contratos, 58 00:04:56,839 --> 00:04:57,860 quiero decir, oye, mirad, 59 00:04:58,379 --> 00:05:00,259 todos los hijos, entre comillas, 60 00:05:00,459 --> 00:05:01,680 que van a tener 61 00:05:01,680 --> 00:05:04,699 relación con este contrato 62 00:05:04,699 --> 00:05:06,439 tendrán que implementar todos estos 63 00:05:06,439 --> 00:05:08,120 métodos sin implementar ninguno. 64 00:05:09,120 --> 00:05:10,339 En vez de hacer 65 00:05:10,339 --> 00:05:12,459 una clase, la voy 66 00:05:12,459 --> 00:05:14,680 a llamar interfaz. 67 00:05:15,399 --> 00:05:15,600 ¿Vale? 68 00:05:15,600 --> 00:05:30,600 ¿Tenéis una idea de que es una interfaz, no necesariamente informática, aunque se usa mucho en informática, en general, una interfaz de usuario, una interfaz de la televisión? 69 00:05:30,600 --> 00:05:32,600 ¿Qué es una interfaz? 70 00:05:32,600 --> 00:05:42,600 Algo como muy visual para el humano, en el que es accesible para el público. 71 00:05:42,600 --> 00:05:43,959 ¿Pero para qué sirve? 72 00:05:48,100 --> 00:05:58,740 Es, digamos, una estructura, un mecanismo que permite a alguien interactuar con otro alguien. 73 00:05:59,500 --> 00:06:04,180 La interfaz de la televisión, hago para decir, o del móvil, o qué sé yo, 74 00:06:04,560 --> 00:06:07,980 pues a los infinites son una serie de puntos, de botones, 75 00:06:07,980 --> 00:06:11,500 que permiten a un usuario interactuar con el sistema operativo. 76 00:06:11,500 --> 00:06:18,060 Tú me das una serie de opciones que yo puedo pinchar o puedo seleccionar para que tú hagas algo. 77 00:06:18,819 --> 00:06:22,100 Si algo está en la interfaz, lo puedo hacer. 78 00:06:22,439 --> 00:06:26,459 Si algo no está en la interfaz, no. 79 00:06:27,959 --> 00:06:35,779 Si vosotros pensáis al Windows, el Windows tiene una serie de botoncitos, el botón de inicio, el botón de icono, el botón de no sé qué. 80 00:06:35,779 --> 00:06:37,839 y esos son los comandos 81 00:06:37,839 --> 00:06:39,660 que os permite hacer por debajo 82 00:06:39,660 --> 00:06:41,459 Linux transformará 83 00:06:41,459 --> 00:06:43,300 esta interfaz de Windows 84 00:06:43,300 --> 00:06:44,779 esta interfaz de usuarios 85 00:06:44,779 --> 00:06:47,240 en comandos para el kernel 86 00:06:47,240 --> 00:06:49,199 del sistema operativo para que haga lo que 87 00:06:49,199 --> 00:06:50,620 tiene que hacer 88 00:06:50,620 --> 00:06:53,000 entonces tengo una interfaz de usuario 89 00:06:53,000 --> 00:06:54,240 los botoncitos es bonito 90 00:06:54,240 --> 00:06:57,439 en Linux esta interfaz 91 00:06:57,439 --> 00:06:58,839 de usuario existe 92 00:06:58,839 --> 00:07:01,259 pero muchas veces luego te la saltas 93 00:07:01,259 --> 00:07:03,180 y te vas directamente a la interfaz 94 00:07:03,180 --> 00:07:03,980 textual 95 00:07:03,980 --> 00:07:08,699 que es el CMD, el PowerShell, ¿vale? 96 00:07:08,779 --> 00:07:11,399 De Windows, pues en Linux se usa mucho más 97 00:07:11,399 --> 00:07:14,480 y allí lo que haces es otra forma de interactuar, 98 00:07:14,579 --> 00:07:17,040 es otra interfaz que en vez de botoncitos 99 00:07:17,040 --> 00:07:19,379 tienes comandos largos así, 100 00:07:20,379 --> 00:07:22,600 que tanto gustan a los frígidos de Linux, 101 00:07:23,540 --> 00:07:25,439 pero a pocos a los que les gusta Windows, 102 00:07:25,800 --> 00:07:27,079 porque es más fácil darle a un botón 103 00:07:27,079 --> 00:07:28,839 que escribir un comando así, ¿vale? 104 00:07:28,839 --> 00:07:30,579 Pero son interfaces iguales. 105 00:07:30,879 --> 00:07:32,079 Una es una interfaz gráfica, 106 00:07:32,079 --> 00:07:56,300 Una es una interfaz textual. Es siempre un puente entre alguien que quiere usar algo más y usa esto. ¿Qué será una interfaz aquí? Pues lo mismo. Es crear un puente, un menú de, oye, mira, la clase que implementará esta interfaz, pues podrá hacer estas cosas. 107 00:07:57,139 --> 00:08:00,240 Cualquier clase que tú me digas que implementa esta interfaz, 108 00:08:00,600 --> 00:08:03,279 tendrá estos métodos y tú los vas a utilizar. 109 00:08:03,660 --> 00:08:05,360 ¿Cómo? Pues está escrito aquí. 110 00:08:05,720 --> 00:08:10,540 Está el menú, están los prototipos de los métodos que vas a poder utilizar. 111 00:08:11,040 --> 00:08:14,459 Entonces, con los prototipos de los métodos, tú sabes cómo utilizarlo. 112 00:08:14,560 --> 00:08:17,439 Está la cálcula área que te va a dar un double, tú sabes cómo usarlo. 113 00:08:18,279 --> 00:08:21,959 Está la cálcula perímetro que te va a dar un int, pues tú sabes cómo utilizarlo. 114 00:08:21,959 --> 00:08:31,180 ¿Vale? Cualquier clase que implemente esta interfaz tendrá que implementarlo y por lo tanto tú podrás llamar estos métodos sobre esta interfaz. 115 00:08:31,540 --> 00:08:35,720 Te estoy definiendo cómo se usa la clase. 116 00:08:36,899 --> 00:08:44,879 Estoy haciendo un contrato que dice cualquier clase que cumpla con este contrato podrá hacer estas cosas, tendrá estos comportamientos. 117 00:08:44,879 --> 00:08:47,139 pero en abstracto 118 00:08:47,139 --> 00:08:49,679 porque no sé cómo se hace 119 00:08:49,679 --> 00:08:52,019 no sé cómo lo va a hacer 120 00:08:52,019 --> 00:08:54,259 yo sé que va a calcular su perímetro 121 00:08:54,259 --> 00:08:55,620 triángulo 122 00:08:55,620 --> 00:08:57,320 cuando implementará la interfaz 123 00:08:57,320 --> 00:08:59,740 geometría 124 00:08:59,740 --> 00:09:01,860 pues seguramente tendrá 125 00:09:01,860 --> 00:09:03,419 cálculo a perímetro y cálculo a área 126 00:09:03,419 --> 00:09:04,860 ¿cómo se hace? no lo sé 127 00:09:04,860 --> 00:09:07,480 quien implemente triángulo lo tendrá que implementar 128 00:09:07,480 --> 00:09:09,240 pero sé que tendrá estas dos opciones 129 00:09:09,240 --> 00:09:12,299 ¿se entiende? 130 00:09:13,580 --> 00:09:15,179 es una clase abstracta 131 00:09:15,179 --> 00:09:18,019 pero con todo abstracto, ¿vale? 132 00:09:18,320 --> 00:09:21,019 Y entonces deja de ser una clase, entre comillas, 133 00:09:21,440 --> 00:09:23,700 y se transforma en una interfaz, ¿vale? 134 00:09:24,320 --> 00:09:26,659 Es un concepto similar a una clase abstracta, 135 00:09:26,799 --> 00:09:30,100 es decir, un molde que define una estructura formal de métodos 136 00:09:30,100 --> 00:09:35,259 para una clase, aunque no especifica su código, ¿vale? 137 00:09:35,659 --> 00:09:37,440 Se quedan siempre abstractos. 138 00:09:38,100 --> 00:09:41,200 Sirven para implementar un mecanismo similar a la herencia múltiple 139 00:09:41,200 --> 00:09:44,440 con otros lenguajes orientados a objetos en Java. 140 00:09:44,440 --> 00:09:50,500 Hemos dicho que Java hereda solo de una clase, de una clase, se abstracta uno. 141 00:09:51,100 --> 00:09:53,360 Puedo hacer extends de una sola clase. 142 00:09:54,000 --> 00:09:59,720 Sin embargo, de las interfaces, puedo implementar todas las interfaces que me da la gana. 143 00:10:00,960 --> 00:10:05,440 Entonces, si yo siempre podré tener un clase no sé qué, extend no sé cuánto, 144 00:10:06,299 --> 00:10:12,820 implements, que es la palabra que sirve para implementar las interfaces, 145 00:10:12,820 --> 00:10:15,259 y cuántas interfaces me da la gana. 146 00:10:15,419 --> 00:10:17,899 No sé qué, coma no sé cuánto, coma no sé cuánto. 147 00:10:18,399 --> 00:10:22,620 De esta forma yo, heredar como tal y heredar métodos E, 148 00:10:22,679 --> 00:10:24,419 pues lo haré de una sola clase. 149 00:10:24,580 --> 00:10:26,000 Si no digo nada, lo haré de objeto. 150 00:10:26,740 --> 00:10:31,779 Pero luego, firmar contratos diciendo que mi clase va a implementar 151 00:10:31,779 --> 00:10:33,080 este método, este método, este método, 152 00:10:33,179 --> 00:10:34,960 podrá hacer estas cosas, esta cosa, esta cosa, 153 00:10:34,960 --> 00:10:39,379 crear la interfaz de mi clase, crear lo que pueda hacer mi clase, 154 00:10:39,379 --> 00:10:44,379 Pues eso de allí lo puedo hacer con cuantos contratos me da la gana. 155 00:10:44,379 --> 00:10:46,379 Puedo firmar cuantos contratos me da la gana. 156 00:10:46,379 --> 00:10:51,379 Puedo implementar tantas interfaces cuanto me dé la gana. 157 00:10:51,379 --> 00:10:53,379 ¿Dudas? 158 00:10:53,379 --> 00:10:55,379 Ok. 159 00:10:55,379 --> 00:11:01,379 Se parecen al caso de Stata, pero a diferencia de estas, todos sus métodos son obligatoriamente abstractos. 160 00:11:01,379 --> 00:11:04,379 Y como todos son abstractos, no ponemos el abstracto. 161 00:11:04,379 --> 00:11:07,379 ¿Vale? Cuando yo declaro una interfaz, 162 00:11:07,379 --> 00:11:11,500 hace falta que ponga este método de abstracto, este método de abstracto, lo sé que son abstractos, son todos 163 00:11:11,500 --> 00:11:15,200 abstractos. ¿Vale? Mientras en una clase normal 164 00:11:15,200 --> 00:11:19,340 los métodos por defecto son concretos 165 00:11:19,340 --> 00:11:23,220 y si lo quiero abstracto lo indico, en una interfaz 166 00:11:23,220 --> 00:11:27,440 todos los métodos por defecto son abstractos. Por lo tanto, no lo indico. 167 00:11:28,419 --> 00:11:33,330 ¿Sí? Por lo tanto, no hay que escribir abstracto 168 00:11:33,330 --> 00:11:36,809 en ningún sitio porque se sobreentiende que todos lo son. 169 00:11:36,809 --> 00:11:48,169 dudas, entonces declaran utilizando la palabra interface en lugar de class, o sea public interface 170 00:11:48,169 --> 00:11:57,889 nombre de mi interfaz, vale, abro llave, pongo todos los prototipos abstractos pero sin poner abstract 171 00:11:57,889 --> 00:12:06,269 de los métodos que implementa esta interfaz, cierro y ya, lista la interfaz, cuando otra clase 172 00:12:06,269 --> 00:12:08,870 implements la interfaz 173 00:12:08,870 --> 00:12:10,570 que he creado, pues tendrá 174 00:12:10,570 --> 00:12:12,409 que implementar todos los 175 00:12:12,409 --> 00:12:14,429 métodos que yo he declarado dentro 176 00:12:14,429 --> 00:12:15,090 de mi interfaz. 177 00:12:16,610 --> 00:12:16,970 ¿Dudas? 178 00:12:18,250 --> 00:12:18,450 Sí. 179 00:12:19,549 --> 00:12:22,470 ¿Con esto conseguimos 180 00:12:22,470 --> 00:12:24,350 que cuando acercamos el programa 181 00:12:24,350 --> 00:12:26,309 nos salga como una pantallita para 182 00:12:26,309 --> 00:12:28,090 interactuar con botones o no tiene nada que ver? 183 00:12:28,090 --> 00:12:28,870 No tiene nada que ver. 184 00:12:29,389 --> 00:12:31,710 El ejemplo que he hecho antes de interfaz es para que 185 00:12:31,710 --> 00:12:33,809 entendáis el concepto de interfaz que estoy 186 00:12:33,809 --> 00:12:36,230 creando. Pero esta no es una interfaz gráfica. 187 00:12:36,269 --> 00:12:42,490 es una interfaz entre objetos vale como la televisión te proporciona a ti una 188 00:12:42,490 --> 00:12:46,509 serie de opciones para que tú interactúe con ellas pues mi objeto proporcionará 189 00:12:46,509 --> 00:12:50,710 una serie de métodos para que otros objetos interaccionen con él vale pero 190 00:12:50,710 --> 00:12:56,509 estos métodos no son visuales la cuadra botoncitos y cosas y lo veremos en tercer 191 00:12:56,509 --> 00:13:00,710 trimestre en gráfica de user interface 192 00:13:00,710 --> 00:13:09,490 Entonces, para crear una clase que escriba código para los métodos de una interfaz, 193 00:13:09,490 --> 00:13:12,889 se usa la palabra implements en vez de extends. 194 00:13:12,889 --> 00:13:18,950 Entonces, yo puedo crear una interfaz poniendo public interface, nombre de la interfaz, bla 195 00:13:18,950 --> 00:13:19,950 bla bla. 196 00:13:19,950 --> 00:13:24,149 Si otra persona crea una clase que quiere implementar esa interfaz, pues lo que hago 197 00:13:24,149 --> 00:13:26,450 es public class 198 00:13:26,450 --> 00:13:28,610 cocodrilo 199 00:13:28,610 --> 00:13:30,190 implements 200 00:13:30,190 --> 00:13:31,470 animal. 201 00:13:32,649 --> 00:13:34,250 Si la interfaz se llama animal. 202 00:13:35,690 --> 00:13:35,889 ¿Sí? 203 00:13:36,590 --> 00:13:38,110 Entonces, se extiende 204 00:13:38,110 --> 00:13:40,409 en otra clase, abstractas o no, 205 00:13:40,690 --> 00:13:41,830 se implementan 206 00:13:41,830 --> 00:13:42,970 interfaces. 207 00:13:44,549 --> 00:13:44,909 ¿Tú das? 208 00:13:47,659 --> 00:13:49,240 ¿Qué quería decir yo? 209 00:13:49,240 --> 00:13:49,960 ¿Qué se me ha quedado? 210 00:13:51,940 --> 00:13:52,580 Ah. 211 00:13:53,019 --> 00:13:54,639 Muchas interfaces 212 00:13:54,639 --> 00:13:56,720 tienen un nombre 213 00:13:56,720 --> 00:13:58,840 que acaba en able. 214 00:13:59,820 --> 00:14:00,700 Comparable. 215 00:14:03,480 --> 00:14:04,419 Serializable. 216 00:14:05,419 --> 00:14:07,019 ¿Vale? Porque sustancialmente 217 00:14:07,019 --> 00:14:09,299 es como decir, si tú implementas 218 00:14:09,299 --> 00:14:09,940 esta 219 00:14:09,940 --> 00:14:13,299 interfaz, adquieres 220 00:14:13,299 --> 00:14:15,080 la posibilidad de compararte 221 00:14:15,080 --> 00:14:16,399 con otro. Comparable. 222 00:14:17,100 --> 00:14:19,039 Adquieres la posibilidad de 223 00:14:19,039 --> 00:14:21,259 serializarte, mandarte por internet. 224 00:14:21,580 --> 00:14:22,299 Serializable. 225 00:14:22,299 --> 00:14:33,679 Entonces, no es normal, hay otras distintas, pero veremos muchos, veremos que existe la 226 00:14:33,679 --> 00:14:38,899 posibilidad de decir que cuando tú creas una interfaz o implementas una interfaz de 227 00:14:38,899 --> 00:14:45,080 las bien conocidas, pues éstas serán interfaz que acaban en able. 228 00:14:45,080 --> 00:14:50,299 También si ves un nombre de una clase o interfaz que acaba en able, pues planteas la posibilidad 229 00:14:50,299 --> 00:14:55,600 que probablemente es una interfaz. Pero bueno, no es una regla escrita en la pieza. 230 00:14:56,259 --> 00:15:03,100 Se pueden declarar referencias a objetos cuyo tipo sea una interfaz en lugar de una clase. 231 00:15:05,350 --> 00:15:18,899 ¿Qué quiere decir? Si yo tengo la interfaz animal, que ya hemos llamado, animal, animal, animal, ¿vale? 232 00:15:18,899 --> 00:15:21,080 puedo hacer 233 00:15:21,080 --> 00:15:22,840 animal x 234 00:15:22,840 --> 00:15:25,419 es igual a new cocodrilo 235 00:15:25,419 --> 00:15:30,039 tengo 236 00:15:30,039 --> 00:15:32,279 class cocodrilo 237 00:15:32,279 --> 00:15:33,679 implement animal 238 00:15:33,679 --> 00:15:36,440 puedo hacer animal x 239 00:15:36,440 --> 00:15:37,799 es igual a new cocodrilo 240 00:15:37,799 --> 00:15:41,600 si, es lo que dice aquí 241 00:15:41,600 --> 00:15:44,679 puedo crear una referencia 242 00:15:44,679 --> 00:15:46,360 a un objeto cuyo tipo sea 243 00:15:46,360 --> 00:15:49,100 un interfaz, o sea animal x 244 00:15:49,100 --> 00:15:50,659 vale, pero luego 245 00:15:50,659 --> 00:15:52,659 dentro tendré que poner un new cocodrilo 246 00:15:52,659 --> 00:15:54,220 puedo poner new animal 247 00:15:54,220 --> 00:15:57,500 hacer animal 248 00:15:57,500 --> 00:15:58,919 x es igual a new animal 249 00:15:58,919 --> 00:16:00,519 ¿por qué no? 250 00:16:05,570 --> 00:16:06,950 porque como no podía hacerlo 251 00:16:06,950 --> 00:16:09,230 con la clase abstracta, tampoco lo puedo hacer con la interfaz 252 00:16:09,230 --> 00:16:11,230 ¿por qué? porque todos sus métodos son abstractos 253 00:16:11,230 --> 00:16:12,750 no puedo crear 254 00:16:12,750 --> 00:16:14,509 una instancia de una interfaz 255 00:16:14,509 --> 00:16:17,070 puedo crear referencias 256 00:16:17,070 --> 00:16:18,190 de tipo interfaz 257 00:16:18,190 --> 00:16:20,350 pero no puedo crear 258 00:16:20,350 --> 00:16:22,789 no puedo crear 259 00:16:22,789 --> 00:16:23,509 objetos 260 00:16:23,509 --> 00:16:25,309 con interfaz 261 00:16:25,309 --> 00:16:36,429 Y, a partir de allí, todo lo que sabemos del polimorfismo de la parte de clases de estratos se aplica también a la interfaz. 262 00:16:36,429 --> 00:17:00,809 Aquí yo puedo hacer un array de animales y poner dentro cocodrilos y gatos y perros y luego recorrer animales y hacerlos todos hacer su sonido, porque está en animal está el método hacer sonido, pero el perro, el gato lo habrá implementado como miau, 263 00:17:00,809 --> 00:17:08,009 El perro lo habrá implementado claramente como bau, porque es italiano, ¿vale? 264 00:17:08,430 --> 00:17:11,809 Y el cocodrilo lo habrá implementado como... 265 00:17:13,470 --> 00:17:19,690 Es una grande pregunta, en que en italiano hasta tenemos una canción, 266 00:17:20,289 --> 00:17:22,869 que os cantaría, pero no, porque eso no ha grabado. 267 00:17:23,829 --> 00:17:26,650 Pero podéis buscarla, el cocodrilo come fa, ¿eh? 268 00:17:26,849 --> 00:17:28,210 Mucho en eso no que lo sabe. 269 00:17:28,210 --> 00:17:30,630 Muy bien 270 00:17:30,630 --> 00:17:33,569 Esta forma de proceder 271 00:17:33,569 --> 00:17:35,309 Tiene sentido para definir un objeto 272 00:17:35,309 --> 00:17:37,769 En función de un tipo más genérico 273 00:17:37,769 --> 00:17:40,190 Para utilizar mecanismos como el polimorfismo 274 00:17:40,190 --> 00:17:43,329 Su principal función es establecer 275 00:17:43,329 --> 00:17:45,269 Y estabilizar las interfaces 276 00:17:45,269 --> 00:17:47,210 Prototipos de métodos de una clase 277 00:17:47,210 --> 00:17:50,250 Que está por desarrollar 278 00:17:50,250 --> 00:17:52,369 Y así coordinar varios equipos de trabajo 279 00:17:52,369 --> 00:17:53,390 ¿Qué quiere decir esta frase? 280 00:17:53,430 --> 00:17:54,309 Una cosa importante 281 00:17:54,309 --> 00:17:56,470 Con esto de la interfaz 282 00:17:56,470 --> 00:18:06,329 Yo puedo organizar equipos de trabajo sin tener listo lo que voy a tener listo en un futuro, 283 00:18:06,950 --> 00:18:12,150 pero sin bloquear los equipos de trabajo, no puedo seguir adelante. 284 00:18:12,150 --> 00:18:18,509 O sea, si yo pillo una interfaz, la interfaz animal, y se la doy tanto a los desarrolladores de animales 285 00:18:18,509 --> 00:18:20,769 como al desarrollador 286 00:18:20,769 --> 00:18:22,609 de parque natural 287 00:18:22,609 --> 00:18:23,390 ¿vale? 288 00:18:23,890 --> 00:18:25,950 el desarrollador de parque natural 289 00:18:25,950 --> 00:18:28,450 interactuará con los animales 290 00:18:28,450 --> 00:18:30,730 usando su interfaz 291 00:18:30,730 --> 00:18:32,589 podrá hacer con los animales 292 00:18:32,589 --> 00:18:34,490 lo que la interfaz dice 293 00:18:34,490 --> 00:18:35,809 que pueden hacer los animales 294 00:18:35,809 --> 00:18:38,430 sin saber luego cómo lo hacen 295 00:18:38,430 --> 00:18:40,690 no se han implementado todavía los métodos 296 00:18:40,690 --> 00:18:42,529 pero yo sé que puedo hacer 297 00:18:42,529 --> 00:18:44,549 un array de animales y pedirle 298 00:18:44,549 --> 00:18:46,309 que coman, pedirle que corran 299 00:18:46,309 --> 00:18:55,710 pedirle que hagan su sonido. ¿Vale? Cuando luego el otro equipo de trabajo habrá generado cocodrilo 300 00:18:55,710 --> 00:19:01,430 que implementa animal, gato que implementa animal y perro que implementa animal, yo dentro de mi 301 00:19:01,430 --> 00:19:09,170 parque natural podré utilizar gato, perros y cocodrilos metidos en arrays utilizándolos con 302 00:19:09,170 --> 00:19:14,990 referencias de animal. Está claro que no podré hacer lo que hace un gato de verdad, pero podré 303 00:19:14,990 --> 00:19:16,910 Podré utilizar los datos como anual. 304 00:19:18,289 --> 00:19:18,690 ¿Se entiende? 305 00:19:19,630 --> 00:19:20,849 Eso es muy importante. 306 00:19:21,369 --> 00:19:26,470 Porque si lo hago bien, estoy definiendo los puntos de contacto entre módulos, 307 00:19:26,990 --> 00:19:30,150 los puntos de contacto, las interfaces entre objetos, 308 00:19:30,609 --> 00:19:32,829 los mensajes que se pueden mandar los objetos, 309 00:19:32,990 --> 00:19:34,690 las acciones que pueden hacer los objetos, 310 00:19:35,069 --> 00:19:37,069 o que un objeto puede pedir a otro objeto. 311 00:19:37,789 --> 00:19:40,789 Las defino sin implementar cómo se hace, 312 00:19:40,789 --> 00:19:44,750 pero defino qué se hace en una interfaz 313 00:19:44,750 --> 00:19:48,829 Y a este punto puedo paralelizar el desarrollo en varios equipos de trabajo. 314 00:19:51,230 --> 00:19:51,589 ¿Dudas? 315 00:19:52,009 --> 00:19:57,400 Yo lo que entiendo de interfaz es como que estás separando las clases abstractas 316 00:19:57,960 --> 00:20:02,500 para no mezclar los métodos abstractos dentro de una clase abstracta. 317 00:20:02,799 --> 00:20:08,680 Y los pones en una interfaz y no sé si en una práctica ya vas a usar ambas cosas 318 00:20:08,680 --> 00:20:10,200 o separas los métodos. 319 00:20:10,200 --> 00:20:10,920 Sí y no. 320 00:20:11,980 --> 00:20:13,180 ¿Vale? No necesariamente. 321 00:20:14,019 --> 00:20:16,880 O sea, el concepto de clase abstracta sigue existiendo. 322 00:20:16,880 --> 00:20:29,259 A lo mejor tú, cuando nosotros hacemos el vehículo, a lo mejor moverse es abstracto porque cada vehículo se mueve distinto. 323 00:20:29,799 --> 00:20:34,759 Pero velocidad máxima o, no sé, calcula velocidad máxima, imagínate. 324 00:20:35,500 --> 00:20:39,819 Pues eso a lo mejor lo puedes calcular independientemente de qué vehículo sea. 325 00:20:40,039 --> 00:20:42,200 Porque hay una velocidad máxima que es la constante de la luz. 326 00:20:42,200 --> 00:20:42,859 No sé. 327 00:20:44,160 --> 00:20:44,900 Me voy por la rama. 328 00:20:44,900 --> 00:20:49,559 Pero a lo mejor hay cosas que se aplican a todos los vehículos y eso lo implementas ahí. 329 00:20:49,640 --> 00:20:58,779 Hemos hecho algunos ejemplos que hemos desarrollado la cosa allí directamente en la clase abstracta y otras cosas en vez que no. 330 00:20:59,019 --> 00:21:04,519 Pero esas cosas van juntas y yo quiero que estén en el mismo bloque, en la misma clase. 331 00:21:05,019 --> 00:21:07,720 Entonces necesito una clase abstracta, no lo puedo hacer con una interfaz. 332 00:21:08,900 --> 00:21:11,880 Lo digo porque podrías separarlo e igualmente tendrías el mismo resultado. 333 00:21:11,880 --> 00:21:12,980 Lo puede hacer, pero no. 334 00:21:13,720 --> 00:21:18,119 Porque a lo mejor yo no quiero que se pueda crear clases 335 00:21:18,119 --> 00:21:24,660 que tengan la parte de la interfaz sin tener lo que he hecho en la clase abstracta. 336 00:21:25,599 --> 00:21:28,339 Si yo te creo una clase abstracta, cuando tú la extendes, 337 00:21:28,720 --> 00:21:31,640 te traes la parte abstracta que tendrás que implementar, 338 00:21:31,640 --> 00:21:34,420 pero te estás también heredando lo concreto. 339 00:21:35,359 --> 00:21:37,140 Si yo lo he separado en una interfaz, 340 00:21:37,420 --> 00:21:41,400 tú podrías implementar la interfaz sin extender la otra clase. 341 00:21:41,880 --> 00:21:49,880 Entonces, te he dado la posibilidad de implementar lo que tenías que implementar sin haberte llevado el extra. 342 00:21:49,880 --> 00:21:54,880 Pero si yo no quiero que eso pueda pasar, si yo quiero que todo lo que implementen estos métodos abstractos 343 00:21:54,880 --> 00:21:59,880 también tenga este método concreto que se hace así, como por ejemplo el constructor, 344 00:21:59,880 --> 00:22:06,880 para que conte cuántos animales he creado, pues entonces no lo puedo hacer en el extra. 345 00:22:06,880 --> 00:22:09,259 no es que son 346 00:22:09,259 --> 00:22:10,500 o esto o esto 347 00:22:10,500 --> 00:22:13,900 son dos mecanismos 348 00:22:13,900 --> 00:22:15,539 tres, clases concretas 349 00:22:15,539 --> 00:22:16,920 clases abstractas e interfaces 350 00:22:16,920 --> 00:22:18,299 que son 351 00:22:18,299 --> 00:22:21,319 parecidos, son similares 352 00:22:21,319 --> 00:22:22,940 se pueden, cooperan 353 00:22:22,940 --> 00:22:25,460 y hay algunos casos en que necesito una cosa 354 00:22:25,460 --> 00:22:27,359 o una cosa no, las clases abstractas 355 00:22:27,359 --> 00:22:29,779 son más raras que las interfaces 356 00:22:29,779 --> 00:22:31,299 es más probable 357 00:22:31,299 --> 00:22:33,259 encontrar interfaces y hacer lo que dices tú 358 00:22:33,259 --> 00:22:34,160 que me lo separe 359 00:22:34,160 --> 00:22:36,759 cuando quiero añadir un cierto comportamiento 360 00:22:36,759 --> 00:22:38,859 implemento una interfaz y cosas así 361 00:22:38,859 --> 00:22:40,440 que las clases abstractas 362 00:22:40,440 --> 00:22:41,259 pero no es que 363 00:22:41,259 --> 00:22:44,380 las clases abstractas te dan esta posibilidad 364 00:22:44,380 --> 00:22:46,079 de decir en paquete 365 00:22:46,079 --> 00:22:48,680 porque estoy hablando por objetos, cuando modelizo el objeto 366 00:22:48,680 --> 00:22:50,500 pues quiero que todo lo que 367 00:22:50,500 --> 00:22:52,559 representa el objeto y todo lo que esté 368 00:22:52,559 --> 00:22:55,160 relacionado con el objeto esté en la misma clase 369 00:22:55,160 --> 00:22:56,619 entonces le estoy midiendo 370 00:22:56,619 --> 00:22:58,779 cosas concretas que se hace así 371 00:22:58,779 --> 00:23:00,640 con cosas abstractas que dime tú 372 00:23:00,640 --> 00:23:02,079 cómo se hace 373 00:23:02,079 --> 00:23:03,839 entonces es una 374 00:23:03,839 --> 00:23:05,980 filosofía distinta 375 00:23:05,980 --> 00:23:10,099 Estos son términos, más que de programación pura, de diseño. 376 00:23:10,859 --> 00:23:14,539 Entonces, es lo que yo quiero poder hacer con estas clases. 377 00:23:14,700 --> 00:23:20,420 Lo que yo quiero que las clases hijas, las subclases, 378 00:23:20,839 --> 00:23:23,599 quieran hacer con respecto a las otras. 379 00:23:25,039 --> 00:23:27,039 En el constructor también hay mucha diferencia. 380 00:23:31,099 --> 00:23:35,500 En el constructor de una clase de una interfaz, creo que no se puede hacer. 381 00:23:35,500 --> 00:23:38,460 creo que no se puede 382 00:23:38,460 --> 00:23:40,359 implementar un constructor 383 00:23:40,359 --> 00:23:41,480 en un encendido, ahora 384 00:23:41,480 --> 00:23:44,160 lo debería comprobar, pero diría que no 385 00:23:44,160 --> 00:23:46,279 ¿vale? ahora de todas formas 386 00:23:46,279 --> 00:23:48,359 al final de esto hay un par de transparencias 387 00:23:48,359 --> 00:23:50,180 de que diferencia hay entre interfaz 388 00:23:50,180 --> 00:23:52,200 de clases abstractas y a lo mejor 389 00:23:52,200 --> 00:23:53,380 allí descubrimos algo 390 00:23:53,380 --> 00:23:54,240 ¿vale? 391 00:23:59,910 --> 00:24:01,509 vale, esto es siempre sobre este tema 392 00:24:01,509 --> 00:24:03,329 aquí ¿vale? el equipo que tiene que 393 00:24:03,329 --> 00:24:05,410 utilizar objetos que 394 00:24:05,410 --> 00:24:07,289 implementen dicha interfaz, basta con que 395 00:24:07,289 --> 00:24:09,470 declara en su código una referencia 396 00:24:09,470 --> 00:24:11,309 dicha interface, ¿vale? 397 00:24:12,009 --> 00:24:12,529 O interfaz. 398 00:24:13,430 --> 00:24:15,250 Aunque no está todavía compilada, 399 00:24:15,430 --> 00:24:16,950 ninguna de las clases que la implementa. 400 00:24:17,170 --> 00:24:18,650 O sea, yo trabajo 401 00:24:18,650 --> 00:24:21,170 con la interfaz, cuando 402 00:24:21,170 --> 00:24:23,349 trabajo en mi código, lo que hago 403 00:24:23,349 --> 00:24:25,349 es crear referencias a esta interfaz, 404 00:24:25,690 --> 00:24:27,430 me da igual qué clase esté dentro. 405 00:24:28,269 --> 00:24:29,250 ¿Ok? Entonces puedo 406 00:24:29,250 --> 00:24:31,230 trabajar en paralelo 407 00:24:31,230 --> 00:24:33,049 mientras otro está implementando 408 00:24:33,049 --> 00:24:35,250 clases que implementan 409 00:24:35,250 --> 00:24:35,829 estas 410 00:24:35,829 --> 00:24:38,490 interfaces que luego 411 00:24:38,490 --> 00:24:39,990 serán las que utilizaré de verdad 412 00:24:39,990 --> 00:24:42,250 yo en mi parque 413 00:24:42,250 --> 00:24:44,950 natural estoy trabajando con animales 414 00:24:44,950 --> 00:24:47,089 en un futuro 415 00:24:47,089 --> 00:24:48,710 alguien implementará perro 416 00:24:48,710 --> 00:24:50,650 y entonces cuando llamo cosas 417 00:24:50,650 --> 00:24:53,009 sobre animales pues lo ejecutará este perro 418 00:24:53,009 --> 00:24:54,970 creará gatos 419 00:24:54,970 --> 00:24:56,250 y entonces trabajará con gatos 420 00:24:56,250 --> 00:24:58,690 creará lince pues trabajaré también con las lince 421 00:24:58,690 --> 00:25:00,769 pero desde mi 422 00:25:00,769 --> 00:25:02,130 programa, desde la perspectiva 423 00:25:02,130 --> 00:25:04,930 del parque natural estoy trabajando con animales 424 00:25:04,930 --> 00:25:10,450 los equipos que creen clases 425 00:25:10,450 --> 00:25:12,390 que implementan dicha interfaz están a su vez 426 00:25:12,390 --> 00:25:14,529 desacoplados de los 427 00:25:14,529 --> 00:25:16,650 equipos que la utilizan y pueden escribir 428 00:25:16,650 --> 00:25:18,089 sus códigos independientemente 429 00:25:18,089 --> 00:25:20,190 tengo una independencia 430 00:25:20,190 --> 00:25:22,470 un desacoplamiento que es interesante 431 00:25:22,470 --> 00:25:24,369 dentro del mundo de la informática 432 00:25:24,369 --> 00:25:26,589 porque me evita 433 00:25:26,589 --> 00:25:28,769 vínculos, me evita dependencias 434 00:25:28,769 --> 00:25:30,289 y por lo tanto puedo paralelizar 435 00:25:30,289 --> 00:25:32,569 cuanto más paralelizo, más puedo avanzar 436 00:25:32,569 --> 00:25:33,130 rápidamente 437 00:25:33,130 --> 00:25:43,130 Cuanta más codependencia tengo entre dos módulos o dos bloques, peor es el desarrollo porque hasta que él no ha hecho esta parte no puedo seguir adelante. 438 00:25:43,130 --> 00:25:55,130 Si fuera necesario que exista un objeto real detrás de una referencia o una interfaz que todavía no se ha programado el otro equipo, se podría utilizar un objeto mock. 439 00:25:55,130 --> 00:25:57,589 mock es como falso 440 00:25:57,589 --> 00:25:57,950 es como 441 00:25:57,950 --> 00:26:02,349 de mentira 442 00:26:02,349 --> 00:26:04,930 y es una técnica que se hace 443 00:26:04,930 --> 00:26:07,170 a lo mejor yo tengo que probar mi mecanismo 444 00:26:07,170 --> 00:26:09,589 pero no lo puedo probar porque tengo solo referencias 445 00:26:09,589 --> 00:26:11,329 animal y necesito 446 00:26:11,329 --> 00:26:13,069 un objeto que haga algo 447 00:26:13,069 --> 00:26:15,369 pues me implemento una clase 448 00:26:15,369 --> 00:26:17,210 yo que implementa 449 00:26:17,210 --> 00:26:19,230 animal pero que hace solo 450 00:26:19,230 --> 00:26:20,390 métodos mock 451 00:26:20,390 --> 00:26:22,970 que dice el animal 452 00:26:22,970 --> 00:26:24,890 está hablando cuando hace su sonido 453 00:26:24,890 --> 00:26:26,750 el animal se está moviendo cuando 454 00:26:26,750 --> 00:26:28,769 podamos mover. No está haciendo 455 00:26:28,769 --> 00:26:30,589 de verdad las cosas, pero me está 456 00:26:30,589 --> 00:26:32,589 mandando mensajes para ver 457 00:26:32,589 --> 00:26:34,750 si esto funciona. Cuando yo llamo las cosas 458 00:26:34,750 --> 00:26:36,349 pues me da un retorno de 459 00:26:36,349 --> 00:26:38,789 un son básico falso 460 00:26:38,789 --> 00:26:40,750 que no es real. A lo mejor 461 00:26:40,750 --> 00:26:42,869 hay un método que debería 462 00:26:42,869 --> 00:26:44,769 acceder a una base de datos. Si todavía no está 463 00:26:44,769 --> 00:26:46,589 lista toda esa parte allí, pues simplemente 464 00:26:46,589 --> 00:26:48,910 me devuelve datos falsos como si lo hubiese 465 00:26:48,910 --> 00:26:50,109 pillado de una base de datos. 466 00:26:50,569 --> 00:26:52,769 Pero me devuelve siempre los mismos métodos en vez 467 00:26:52,769 --> 00:26:54,710 de ir a acceder a un 468 00:26:54,710 --> 00:27:01,529 acceso a la base de datos. ¿Entiendes? Son todos mecanismos para poder programar en equipos 469 00:27:01,529 --> 00:27:10,730 desacoplados y poder ir en paralelo. Un ejemplo concreto de una interfaz que será vuestro íncubo 470 00:27:10,730 --> 00:27:20,210 en los próximos días es la interfaz Comparable. Sirve para dotar de un orden natural a los 471 00:27:20,210 --> 00:27:24,309 objetos de una clase determinada. Por ejemplo, imaginaos que yo tengo 472 00:27:24,309 --> 00:27:28,029 la clase gato, muchos gatitos, con dentro sus propios 473 00:27:28,029 --> 00:27:31,849 atributos de gato, ¿vale? El nombre del gato, 474 00:27:32,069 --> 00:27:35,849 la raza del gato, la guapura del gato, que siempre es 10, 475 00:27:35,990 --> 00:27:39,210 porque son los animales más bonitos, pues, ¿qué se le va a hacer? 476 00:27:40,069 --> 00:27:43,789 Ahora, imaginaos que yo quiera ordenar los gatos, 477 00:27:44,730 --> 00:27:48,210 ¿vale? Como es una cosa que creo yo, 478 00:27:48,210 --> 00:27:52,630 yo tengo que definir cuál es el concepto 479 00:27:52,630 --> 00:27:55,609 de orden de gato. ¿Cómo se ordenan los gatos? 480 00:27:55,930 --> 00:28:00,730 ¿Se ordenan por nombres? ¿Se ordenan por guapura? ¿Se ordenan por raza? 481 00:28:00,730 --> 00:28:04,730 No lo sé. No tienes que decir tú. Como yo he creado 482 00:28:04,730 --> 00:28:08,849 este objeto, que puede ser gato, puede ser otra cosa, puede ser coche. 483 00:28:08,970 --> 00:28:12,650 ¿Cómo ordeno los coches? ¿Vale? Pues tengo que 484 00:28:12,650 --> 00:28:15,970 definir cómo se ordenan los coches. Para eso 485 00:28:15,970 --> 00:28:17,950 pues implemento 486 00:28:17,950 --> 00:28:20,150 la clase, la interfaz 487 00:28:20,150 --> 00:28:21,869 comparable. Todas 488 00:28:21,869 --> 00:28:23,869 aquellas clases que implementan 489 00:28:23,869 --> 00:28:25,269 la interfaz comparable 490 00:28:25,269 --> 00:28:28,049 adquieren la capacidad 491 00:28:28,049 --> 00:28:29,869 de poder comparar 492 00:28:29,869 --> 00:28:31,910 dos objetos de esa clase 493 00:28:31,910 --> 00:28:33,789 y decir, este viene antes 494 00:28:33,789 --> 00:28:34,329 que este. 495 00:28:35,789 --> 00:28:38,230 ¿En base a qué? En base a la definición 496 00:28:38,230 --> 00:28:40,269 de orden que yo definiré 497 00:28:40,269 --> 00:28:41,710 en comparable. 498 00:28:42,849 --> 00:28:43,190 ¿Está claro? 499 00:28:44,250 --> 00:28:45,910 O sea, si yo digo los números 500 00:28:45,910 --> 00:28:48,430 pensad en la clase number que existe 501 00:28:48,430 --> 00:28:50,670 o la clase integer 502 00:28:50,670 --> 00:28:52,630 la hemos usado, integer.parts.int 503 00:28:52,630 --> 00:28:55,470 que representa los enteros 504 00:28:55,470 --> 00:28:56,630 vosotros me sabéis ordenar 505 00:28:56,630 --> 00:28:59,410 el integer o el objeto integer 3 506 00:28:59,410 --> 00:29:01,250 y el objeto integer 5 507 00:29:01,250 --> 00:29:02,109 ¿cuál viene antes? 508 00:29:02,990 --> 00:29:04,309 3, ¿por qué? 509 00:29:04,450 --> 00:29:07,150 porque el orden de los números los tenemos aquí 510 00:29:07,150 --> 00:29:09,970 pero cuando voy a comparar 511 00:29:09,970 --> 00:29:11,309 dos mochilas 512 00:29:11,309 --> 00:29:13,349 ¿viene antes esta mochila de aquí 513 00:29:13,349 --> 00:29:14,250 o esta mochila de aquí? 514 00:29:14,250 --> 00:29:42,559 No sé. Hay dos opciones. O no hay un orden y entonces no implemento comparable y no puedo establecer cuál viene antes. O implemento comparable, me dirá que tengo que implementar el método compareTo, que es el método que está dentro de comparable, solo como productivo. 515 00:29:42,559 --> 00:29:47,519 es abstracto, lo tengo que implementar yo, y dentro de la implementación de este de aquí, 516 00:29:47,519 --> 00:29:52,940 tengo que pillar estas dos mochilas y decidir cuál viene primera y cuál viene segunda, 517 00:29:52,940 --> 00:30:02,240 en base a lo que yo he decidido que es el orden. Para mí el orden puede ser el color. Lo paso a 518 00:30:02,240 --> 00:30:10,880 hexadecimal, miro cuál es el que viene antes, en base a eso, pues si viene antes o una otra. 519 00:30:10,880 --> 00:30:17,400 si pillo negro, que es 0, 0, 0, 0, 0 520 00:30:17,400 --> 00:30:19,099 y otra mochila que es blanca, que es 521 00:30:19,099 --> 00:30:21,839 negro viene antes que blanco 522 00:30:21,839 --> 00:30:24,460 porque es un número hexadecimal más bajo 523 00:30:24,460 --> 00:30:27,339 lenguaje de marcas 524 00:30:27,339 --> 00:30:33,180 pero no, digo, no 525 00:30:33,180 --> 00:30:35,000 lo quiero ordenar por 526 00:30:35,000 --> 00:30:36,720 capacidad 527 00:30:36,720 --> 00:30:40,259 pues capacidad 528 00:30:40,259 --> 00:30:42,819 entonces miro esto de aquí, esto tiene 529 00:30:42,819 --> 00:30:44,980 13 litros, este tiene 12 litros, pues 530 00:30:44,980 --> 00:30:46,200 este viene antes que este. 531 00:30:49,119 --> 00:30:51,019 Lo quiero ordenar por 532 00:30:51,019 --> 00:30:53,079 nombre de la marca. Pues esta aquí es 533 00:30:53,079 --> 00:30:54,980 marca, no tengo ni idea. Esa es marca 534 00:30:54,980 --> 00:30:57,220 otra marca, pues 535 00:30:57,220 --> 00:30:58,099 N 536 00:30:58,099 --> 00:31:01,099 viene antes que O, por lo 537 00:31:01,099 --> 00:31:02,940 tanto viene antes el de, no sé su 538 00:31:02,940 --> 00:31:04,599 marca, que el de otra marca. 539 00:31:06,039 --> 00:31:06,400 ¿Se entiende? 540 00:31:06,960 --> 00:31:08,920 ¿Quién define esto? Yo. ¿Por qué? 541 00:31:09,019 --> 00:31:10,519 Porque soy yo el que crea esa clase. 542 00:31:11,299 --> 00:31:13,099 He creado esta clase, he definido 543 00:31:13,099 --> 00:31:15,059 que va a poder ser comparable, 544 00:31:15,720 --> 00:31:17,220 o sea, que yo puedo pillar dos objetos 545 00:31:17,220 --> 00:31:18,980 entre ellos y puedo comparar quién viene 546 00:31:18,980 --> 00:31:20,900 antes y quién viene después, porque luego 547 00:31:20,900 --> 00:31:23,259 los quiero ordenar, dame una definición 548 00:31:23,259 --> 00:31:23,619 de orden. 549 00:31:24,900 --> 00:31:26,420 Es parecido este problema 550 00:31:26,420 --> 00:31:29,000 a cuando veíamos el equals. 551 00:31:29,779 --> 00:31:30,940 ¿Verdad? Que nosotros decíamos, tengo 552 00:31:30,940 --> 00:31:33,160 dos objetos, pues tengo que definir 553 00:31:33,160 --> 00:31:35,000 la relación de identidad. ¿Cuándo estos 554 00:31:35,000 --> 00:31:36,859 dos objetos son iguales? ¿Cuando tengan el mismo 555 00:31:36,859 --> 00:31:38,839 DNI? ¿Cuando tengan el mismo DNI 556 00:31:38,839 --> 00:31:41,000 en nombre? ¿Cuando tengan el mismo...? 557 00:31:41,799 --> 00:31:43,039 ¿Sí? Pues aquí es lo mismo. 558 00:31:43,099 --> 00:31:47,099 Cuando comparo dos objetos, ¿cómo se comparan estos señores? 559 00:31:47,380 --> 00:31:52,240 Se comparan en base a su nombre, su color, su... 560 00:31:52,240 --> 00:31:56,500 Pero el concepto fundamental es que cuando yo quiero comparar, 561 00:31:56,619 --> 00:31:59,519 quiero que mis objetos sean comparables, 562 00:32:00,039 --> 00:32:04,539 lo que hago es implementar, public class, ya habíamos dicho, 563 00:32:04,819 --> 00:32:06,700 implements comparable. 564 00:32:07,240 --> 00:32:11,559 Esto me fuerza a implementar el método compareTo. 565 00:32:11,559 --> 00:32:19,160 Compertur necesita dos elementos 566 00:32:19,160 --> 00:32:22,299 Por un lado, el objeto 567 00:32:22,299 --> 00:32:27,859 Que es un objeto de los dos que voy a comparar 568 00:32:27,859 --> 00:32:28,380 ¿Vale? 569 00:32:28,559 --> 00:32:32,640 Tú me pasas, me dices, compáralo a este señor 570 00:32:32,640 --> 00:32:33,960 Vale, ok, perfecto 571 00:32:33,960 --> 00:32:35,579 Lo voy a comparar con este objeto de aquí 572 00:32:35,579 --> 00:32:36,099 ¿Vale? 573 00:32:36,599 --> 00:32:37,779 Es el segundo objeto 574 00:32:37,779 --> 00:32:38,799 ¿Cuál es el primero? 575 00:32:43,019 --> 00:32:44,160 Sobre el que se llama método 576 00:32:44,160 --> 00:32:58,420 es decir? No, ese es el segundo. ¿Cómo hago referencia al objeto sobre el que se ha llamado 577 00:32:58,420 --> 00:33:04,759 el método? This. O sea, que este método de aquí está haciendo una comparación entre 578 00:33:04,759 --> 00:33:15,380 this y el objeto. Entonces, aquí dentro, en la implementación del compareTo, yo tendré 579 00:33:15,380 --> 00:33:24,500 dos opciones. Acceder a this.nombre y a objectO, ¿no? O.nombre para comparar los nombres. 580 00:33:24,819 --> 00:33:31,339 o a dis.color y a o.color para comparar los colores, o a las dos cosas. 581 00:33:32,920 --> 00:33:36,160 Aquí tengo que compararlo solo según un factor. 582 00:33:36,400 --> 00:33:40,440 Yo podría decir que se ordenan como primer factor según el color, 583 00:33:40,640 --> 00:33:42,680 y si dos tienen el mismo color, según la capacidad. 584 00:33:44,200 --> 00:33:46,720 Lo codifico. 585 00:33:47,819 --> 00:33:53,579 Tened en cuenta, pero, que aquí yo estoy comparando un dis, 586 00:33:53,579 --> 00:33:55,420 que en mi ejemplo era un gato 587 00:33:55,420 --> 00:33:57,059 con un objeto. 588 00:33:58,019 --> 00:33:59,740 El gato tiene nombre 589 00:33:59,740 --> 00:34:01,259 y tiene raza y tiene 590 00:34:01,259 --> 00:34:02,519 guapura, ¿no? 591 00:34:03,859 --> 00:34:04,859 Pero objeto no. 592 00:34:05,380 --> 00:34:07,240 Objeto no tiene nombre. Si yo hago 593 00:34:07,240 --> 00:34:08,619 o.nombre no me funciona. 594 00:34:09,960 --> 00:34:10,880 Entonces, ¿qué tendré que hacer? 595 00:34:19,480 --> 00:34:20,460 Pero yo tengo 596 00:34:20,460 --> 00:34:22,440 un disk que seguramente es un gato, porque estoy 597 00:34:22,440 --> 00:34:24,039 dentro de gato. Y un objeto. 598 00:34:24,539 --> 00:34:25,780 ¿Qué hago con este objeto? 599 00:34:26,400 --> 00:34:37,989 Os lo mimo si queréis. 600 00:34:40,840 --> 00:34:41,239 Downcasting. 601 00:34:42,420 --> 00:34:46,420 Eso ha sido porque lo han animado muy bien, ¿verdad? 602 00:34:46,420 --> 00:34:51,420 Downcast. Lanzar casting. 603 00:34:51,420 --> 00:34:55,420 Muy bien. Tengo que hacer un downcasting, o sea, pillar... 604 00:34:55,420 --> 00:34:57,420 Por un lado tengo el disc que es un gato. 605 00:34:57,420 --> 00:34:59,420 Ahora tengo un objeto O. 606 00:34:59,420 --> 00:35:04,420 Este objeto O tendré que hacer un downcasting a gato, si puedo. 607 00:35:04,420 --> 00:35:07,420 ¿Vale? Y a este punto... 608 00:35:07,420 --> 00:35:14,260 Tened en cuenta que si yo intento comparar un gato y le paso como parámetro aquí un cocodrilo, 609 00:35:15,119 --> 00:35:20,119 pues tiene que explotar algo, porque gatos y cocodrilos no se pueden comparar. 610 00:35:20,199 --> 00:35:21,920 ¿Qué viene antes? ¿3 o K? 611 00:35:24,590 --> 00:35:29,349 ¿3 como entero o K como letra? 612 00:35:33,030 --> 00:35:38,670 Vale, entonces, además, la interfaz comparable me dice, 613 00:35:38,670 --> 00:35:44,429 oye mira, tengo este método, lo tienes que implementar así, no es que hay que ponerle gato, 614 00:35:44,429 --> 00:35:58,269 no, tiene que ser int compareObject.Dentro harás un, si yo, una, como se dice, un instance of gato, 615 00:35:58,269 --> 00:36:05,849 pues entonces da un cast a gato y haz lo que tienes que hacer, si no explota. Vale, y además 616 00:36:05,849 --> 00:36:13,829 de decirme el método que tengo que implementar, me describe cómo se implementa. O sea, cuando yo 617 00:36:13,829 --> 00:36:21,329 implemento con Parable y tengo que implementar este método, tengo que cumplir esta regla. Tengo 618 00:36:21,329 --> 00:36:34,179 que dar un número negativo si this es menor que o. Si en el orden viene antes this y luego o, 619 00:36:34,179 --> 00:36:36,639 el resultado tiene que ser negativo 620 00:36:36,639 --> 00:36:40,320 si son iguales 621 00:36:40,320 --> 00:36:42,719 a nivel de orden 622 00:36:42,719 --> 00:36:44,940 por ejemplo tienen el mismo color entonces son iguales 623 00:36:44,940 --> 00:36:46,519 hasta si son objetos distintos pero 624 00:36:46,519 --> 00:36:48,699 a nivel de ordenación da igual si viene 625 00:36:48,699 --> 00:36:50,760 uno antes, pues tendré que devolver 626 00:36:50,760 --> 00:36:51,199 cero 627 00:36:51,199 --> 00:36:54,980 y si this viene después 628 00:36:54,980 --> 00:36:56,519 de o 629 00:36:56,519 --> 00:36:58,599 pues entonces tengo que dar 630 00:36:58,599 --> 00:36:59,559 un número positivo 631 00:36:59,559 --> 00:37:02,079 este número positivo puede ser 632 00:37:02,079 --> 00:37:03,980 o simplemente menos uno cero 633 00:37:03,980 --> 00:37:05,639 y 1. Suficiente. 634 00:37:06,400 --> 00:37:07,980 Pero si yo devuelvo siempre 635 00:37:07,980 --> 00:37:09,420 menos 1, 0 y 1, 636 00:37:09,760 --> 00:37:11,980 no sé cuánto distintos son. 637 00:37:14,480 --> 00:37:15,440 Imaginaos siempre 638 00:37:15,440 --> 00:37:17,320 con los colores. Si yo tengo 639 00:37:17,320 --> 00:37:19,420 negro y blanco estando al extremo, 640 00:37:19,880 --> 00:37:20,860 son muy distintos. 641 00:37:21,800 --> 00:37:23,559 Pues, y imaginamos que 642 00:37:23,559 --> 00:37:25,480 this sea negro y o 643 00:37:25,480 --> 00:37:27,239 sea blanco, pues entonces 644 00:37:27,239 --> 00:37:29,019 como this viene antes que o, 645 00:37:29,380 --> 00:37:30,739 me devolvería menos 1. 646 00:37:31,880 --> 00:37:32,679 Y ahora tengo 647 00:37:32,679 --> 00:37:35,280 this que es negro y 1 648 00:37:35,280 --> 00:37:38,300 que es gris, ¿qué me devolvería? 649 00:37:41,849 --> 00:37:44,110 Siempre menos uno. Porque dices 650 00:37:44,110 --> 00:37:47,110 negro, viene antes que el gris. Por lo tanto, siempre 651 00:37:47,110 --> 00:37:49,829 menos uno. O sea, que sea muy cerca, 652 00:37:50,030 --> 00:37:52,789 que sea un gris muy oscuro, sea un gris muy claro, o sea 653 00:37:52,789 --> 00:37:55,949 blanco, siempre me devuelve menos uno. No sé a qué distancia 654 00:37:55,949 --> 00:37:58,170 están. No sé cuánto distinto son. 655 00:37:58,550 --> 00:38:01,469 ¿Lo sé ordenar? Sé que negro viene antes que gris, 656 00:38:02,070 --> 00:38:03,550 pero no sé cuánto antes. 657 00:38:04,690 --> 00:38:07,710 Si en vez me busco otra forma, por ejemplo, hago 658 00:38:07,710 --> 00:38:09,730 una resta entre 659 00:38:09,730 --> 00:38:10,989 el número 660 00:38:10,989 --> 00:38:13,929 en esta decimal 661 00:38:13,929 --> 00:38:15,789 y el otro número en esta decimal. 662 00:38:16,309 --> 00:38:16,889 Los restos. 663 00:38:17,750 --> 00:38:19,789 Entonces, cuando hago 0, 0, 0 664 00:38:19,789 --> 00:38:21,590 que es negro menos un gris, 665 00:38:21,969 --> 00:38:23,590 me dará un valor negativo, 666 00:38:24,469 --> 00:38:25,590 pero más pequeño, 667 00:38:25,809 --> 00:38:26,650 o sea, más grande, 668 00:38:26,969 --> 00:38:29,789 que si hago 0 669 00:38:29,789 --> 00:38:32,010 menos el blanco, 670 00:38:32,010 --> 00:38:33,510 que es el máximo número que tengo que hacer. 671 00:38:33,969 --> 00:38:35,449 O sea, 0 menos gris 672 00:38:35,449 --> 00:38:37,570 me dará menos 50 673 00:38:37,570 --> 00:38:39,710 hago para decir, y 0 menos 674 00:38:39,710 --> 00:38:41,469 blanco me dará menos 675 00:38:41,469 --> 00:38:43,590 5.000. Entonces sé que hay una 676 00:38:43,590 --> 00:38:45,550 diferencia. Los dos son negativos, sé 677 00:38:45,550 --> 00:38:47,510 quién viene antes y quién después, pero además 678 00:38:47,510 --> 00:38:49,650 me da una indicación de cuánto antes 679 00:38:49,650 --> 00:38:51,650 o después llega. ¿Se entiende? 680 00:38:53,170 --> 00:38:53,969 Esto depende 681 00:38:53,969 --> 00:38:55,690 de cómo lo hago. No me lo dice aquí. 682 00:38:55,989 --> 00:38:57,550 No me dice, oye, mira, tienes que 683 00:38:57,550 --> 00:38:59,409 decir cuánto antes y cuánto después. 684 00:38:59,550 --> 00:39:01,530 No. A mí lo importante es que siga 685 00:39:01,530 --> 00:39:03,690 esta regla. Lo que está diciendo 686 00:39:03,690 --> 00:39:05,389 es que dependiendo de cómo lo digo, 687 00:39:05,389 --> 00:39:07,150 de cómo lo hago, puede tener 688 00:39:07,150 --> 00:39:08,489 más o menos información 689 00:39:08,489 --> 00:39:09,530 este número negativo. 690 00:39:11,010 --> 00:39:11,849 O positivo. 691 00:39:13,250 --> 00:39:13,550 ¿Vale? 692 00:39:13,969 --> 00:39:15,570 Es muy recomendable 693 00:39:15,570 --> 00:39:16,670 que con perturbe 694 00:39:16,670 --> 00:39:17,710 sea consistente 695 00:39:17,710 --> 00:39:18,250 con igual. 696 00:39:20,849 --> 00:39:21,289 O sea, 697 00:39:21,449 --> 00:39:22,309 si yo tengo 698 00:39:22,309 --> 00:39:24,369 dos objetos 699 00:39:24,369 --> 00:39:24,730 o, 700 00:39:25,210 --> 00:39:25,889 pero me está de vez, 701 00:39:26,190 --> 00:39:27,269 si tengo dos objetos 702 00:39:27,269 --> 00:39:28,969 que igual 703 00:39:28,969 --> 00:39:30,070 se me dice true, 704 00:39:31,550 --> 00:39:32,869 pues también 705 00:39:32,869 --> 00:39:33,750 con perturbe 706 00:39:33,750 --> 00:39:34,690 tiene que estar cero. 707 00:39:37,480 --> 00:39:37,739 ¿Ves? 708 00:39:37,880 --> 00:39:37,980 No. 709 00:39:38,699 --> 00:39:39,599 No es necesario. 710 00:39:40,860 --> 00:39:48,119 Pero si dos objetos son el mismo objeto, su comparable, o sea, su convertu, tiene que dar cero. 711 00:39:49,119 --> 00:39:51,519 Si son el mismo objeto, no puede ir uno antes que otro. 712 00:39:52,840 --> 00:39:59,260 Ahora, si dos objetos como convertu dan cero, podrían no ser iguales. 713 00:39:59,659 --> 00:40:01,219 Por ejemplo, mis mochilas negras. 714 00:40:01,619 --> 00:40:10,739 Tengo dos objetos que son mochilas negras, son distintas, pues a nivel de convertu no hay uno que viene antes que otro, pero no son el mismo objeto. 715 00:40:10,860 --> 00:40:13,579 Por lo tanto, equals daría false. 716 00:40:15,849 --> 00:40:16,289 ¿Entiendes? 717 00:40:17,150 --> 00:40:18,849 Esto es una cosa que tenéis que considerar. 718 00:40:18,949 --> 00:40:23,030 Si implementáis comparable, tenéis que toquetear también equals. 719 00:40:23,030 --> 00:40:32,329 Y definir que si dos objetos son equals, cuando dos objetos son equals, pues comparable tiene que devolverse. 720 00:40:33,590 --> 00:40:33,949 Ejemplo. 721 00:40:39,289 --> 00:40:40,050 ¡Ejemplo! 722 00:40:40,989 --> 00:40:42,050 ¡Uy, ejemplo animal! 723 00:40:42,050 --> 00:40:44,730 Fíjate tú, no me acordaba que aquí era un ejemplo de un animal. 724 00:40:45,230 --> 00:40:49,030 Pues, public interface animal, ¿vale? Convoida habla, ¿cómo no? 725 00:40:49,909 --> 00:40:53,369 Public class perro, implementa animal, ¿vale? 726 00:40:53,449 --> 00:40:55,289 Fijaos que es una interfaz, ¿vale? 727 00:40:55,349 --> 00:40:59,429 Entonces, esto quiere decir que tengo que implementar necesariamente habla. 728 00:40:59,570 --> 00:41:00,989 Entonces, hago guau, ¿vale? 729 00:41:01,030 --> 00:41:03,610 Este es español. 730 00:41:04,210 --> 00:41:07,289 Y luego tengo gato, que como animal hace miau, ¿sí? 731 00:41:07,989 --> 00:41:09,110 Entonces, ¿cómo lo uso? 732 00:41:09,110 --> 00:41:19,960 Puedo crear un animal con dentro un perro, un animal con dentro un gato y hacer dog.habla cat.habla. 733 00:41:19,960 --> 00:41:27,320 Puedo crear un array de animales con dentro ponerle un gato y perro tranquilamente. Luego 734 00:41:27,320 --> 00:41:32,800 hago que hablan todos y le paso el array de animales. Entonces este es un método que hablen 735 00:41:32,800 --> 00:41:40,559 todos con un array de animales. Lo que hace es recorrer el array y llamar el habla. Aquí no 736 00:41:40,559 --> 00:41:42,800 necesita hacer downcasting ni nada por 737 00:41:42,800 --> 00:41:45,940 porque usa 738 00:41:45,940 --> 00:41:47,980 polimorfismo 739 00:41:47,980 --> 00:41:50,199 y entonces cuando yo lo llamaré 740 00:41:50,199 --> 00:41:52,400 sobre un animal.habla 741 00:41:52,400 --> 00:41:54,599 aun si un animal es de tipo animal 742 00:41:54,599 --> 00:41:56,320 se usará el habla 743 00:41:56,320 --> 00:41:58,360 de la instancia 744 00:41:58,360 --> 00:42:00,320 de ese objeto, no de la 745 00:42:00,320 --> 00:42:02,199 referencia a ese objeto, entonces 746 00:42:02,199 --> 00:42:04,039 usará o gato o perro 747 00:42:04,039 --> 00:42:06,000 si es un gato o si es un perro 748 00:42:06,000 --> 00:42:07,519 si lo he definido como un gato 749 00:42:07,519 --> 00:42:17,530 dudas, para complicar 750 00:42:17,530 --> 00:42:18,449 un poco las cosas 751 00:42:18,449 --> 00:42:20,989 existen los métodos 752 00:42:20,989 --> 00:42:23,030 default en una interfaz 753 00:42:23,030 --> 00:42:24,449 que es un método default 754 00:42:24,449 --> 00:42:27,090 como en una clase abstracta 755 00:42:27,090 --> 00:42:28,989 los métodos son 756 00:42:28,989 --> 00:42:31,150 normales, pero puedo definir 757 00:42:31,150 --> 00:42:32,469 algunos abstractos 758 00:42:32,469 --> 00:42:34,969 en una interfaz los métodos son 759 00:42:34,969 --> 00:42:36,869 abstractos, pero puedo definir 760 00:42:36,869 --> 00:42:37,989 algunos concretos 761 00:42:37,989 --> 00:42:42,210 entonces 762 00:42:42,210 --> 00:42:44,010 si esta es una interfaz animal 763 00:42:44,010 --> 00:42:47,090 que tiene void habla, este es un método abstracto 764 00:42:47,090 --> 00:42:48,670 ¿vale? pero puedo definir 765 00:42:48,670 --> 00:42:52,329 un default void correr, ¿qué me está diciendo? Mira, oye, 766 00:42:52,889 --> 00:42:55,090 todos los animales pueden hablar y correr. 767 00:42:56,349 --> 00:43:00,329 Todos. Porque cuando implementan un animal, estos son los métodos que tiene. 768 00:43:00,789 --> 00:43:05,010 Te voy a dar una implementación 769 00:43:05,010 --> 00:43:07,730 por defecto que tú puedes usar o no. 770 00:43:09,369 --> 00:43:12,070 Si quieres, esta ya la tienes, 771 00:43:12,070 --> 00:43:16,030 pero si luego la quieres especificar 772 00:43:16,030 --> 00:43:17,829 en tu animal, pues lo puedes hacer. 773 00:43:18,289 --> 00:43:19,969 Entonces, por ejemplo, puedo tener un perro 774 00:43:19,969 --> 00:43:21,690 que solo implementa habla 775 00:43:21,690 --> 00:43:24,309 y tiene corre por defecto 776 00:43:24,309 --> 00:43:25,489 pasada, 777 00:43:25,949 --> 00:43:27,789 y puedo implementar un gato que 778 00:43:27,789 --> 00:43:29,750 implementa habla y que 779 00:43:29,750 --> 00:43:31,409 sobreescribe en un cierto sentido 780 00:43:31,409 --> 00:43:33,949 corre. Entonces, cuando luego 781 00:43:33,949 --> 00:43:35,869 lo llamaré sobre un perro, 782 00:43:36,429 --> 00:43:38,429 usará la implementación 783 00:43:38,429 --> 00:43:39,269 por defecto. 784 00:43:40,269 --> 00:43:42,250 Cuando lo llamo sobre el gato, 785 00:43:42,750 --> 00:43:44,449 usará la del gato. 786 00:43:46,030 --> 00:43:52,969 ¿La interfaz animal no sería posible en una clase abstracta porque está combinando o es lo mismo? 787 00:43:52,969 --> 00:43:53,510 Es lo mismo. 788 00:43:54,510 --> 00:43:56,130 Pero es lo que decía antes. 789 00:43:56,530 --> 00:44:02,110 Mientras una clase abstracta es una clase que deja abstracto algún método, 790 00:44:02,969 --> 00:44:08,550 la interfaz es, defino todo abstracto y puedo concretar alguno. 791 00:44:08,989 --> 00:44:10,650 Es filosofía un poquito distinta. 792 00:44:10,650 --> 00:44:15,849 La diferencia fundamental es que una clase abstracta solo puede heredar una, 793 00:44:16,030 --> 00:44:24,579 Mientras la interfaz, puedes implementar cuanto sea la gana. 794 00:44:24,579 --> 00:44:29,579 Y acordaos que está también el concepto de ISEP. 795 00:44:29,579 --> 00:44:36,579 Cuando tú creas, cuando tú extendes otro elemento, otra clase, tú eres una diversa clase. 796 00:44:36,579 --> 00:44:39,579 Para crear jerarquía como tú quieras. 797 00:44:39,579 --> 00:44:42,579 Tienes las dos herramientas, al fin y al cabo son muy parecidas. 798 00:44:42,579 --> 00:44:45,579 Y ahora llegamos a ver posibles diferencias. 799 00:44:45,579 --> 00:44:52,639 Pero la esencia fundamental, básica e importante, es que de clases abstractas puedes extender una sola, 800 00:44:53,280 --> 00:44:57,860 de clases de interfaces puedes implementar cuantas quieras. 801 00:44:58,619 --> 00:45:03,820 Es una forma de hacer algo parecido a la herencia múltiple en Java. 802 00:45:03,820 --> 00:45:15,599 No. Es parecido a una clase abstracta. 803 00:45:22,980 --> 00:45:35,900 Sí, no sé si formalmente lo es, debería ser, ¿vale? 804 00:45:39,900 --> 00:45:44,900 No te pide que te lo sacore porque usará su implementación por defecto. 805 00:45:46,059 --> 00:45:52,880 Que, repito, vispa sí, es muy parecido a hacer una clase abstracta donde esto es un método normal, esto es un método abstracto. 806 00:45:52,980 --> 00:46:08,679 ¿Sí? El problema es que si tú eres gato y quieres extender felino, ahora tienes un problema si esta es una clase strata, porque no puedes extender también animal, ¿sí? 807 00:46:09,699 --> 00:46:16,099 Y entonces puedes hacer esta trampa de aquí y haces extendo felino e implementa animal. 808 00:46:17,460 --> 00:46:21,190 ¿Listo? ¿Dudas? 809 00:46:24,639 --> 00:46:28,139 Clases, estas son las interfaces, ¿vale? 810 00:46:28,139 --> 00:46:39,119 ¿Qué problemas, o sea, qué aspectos tenemos que tener en cuenta cuando vamos a mirar clases abstractas y interfaces y qué relaciones tienen? 811 00:46:40,800 --> 00:46:50,340 Juegan en la misma liga, porque son muy parecidas, tienen cosas que no es fácil decir, uso esto, uso otro, cosas por el estilo. 812 00:46:50,340 --> 00:47:01,079 La cosa principal y importante que penséis es que si tengo que extender, si estoy obligado a extender ya una, pues todas las demás tienen que ser interfaces. 813 00:47:01,519 --> 00:47:02,900 Eso es una cosa que me... 814 00:47:02,900 --> 00:47:09,179 Cuando yo tengo que decir, quiero hacer algo de ese estilo, ¿qué hago? ¿Una clase abstracta o una clase interfaz? 815 00:47:11,119 --> 00:47:18,300 En base a eso, tendría que pensar, oye, mira, la clase que luego he heredado aquí, ¿ya he heredado de otras clases o no? 816 00:47:18,300 --> 00:47:21,340 Porque si quiero ir a otra clase, tengo que ir por interfaz de seguro. 817 00:47:22,239 --> 00:47:23,619 Si no, no lo puedo pensar. 818 00:47:24,920 --> 00:47:31,900 Entonces, ¿qué puntos tengo en mente cuando tengo que comparar o pensar si usar una clase abstracta o una interfaz? 819 00:47:32,159 --> 00:47:33,380 Primero, el propósito. 820 00:47:34,659 --> 00:47:42,840 Una clase abstracta se utiliza para proporcionar una estructura básica para una jerarquía de clases. 821 00:47:42,840 --> 00:47:49,840 Mientras que una interfaz se utiliza para definir un contrato que debe cumplirse por una clase que implementa la interfaz. 822 00:47:51,159 --> 00:47:51,699 ¿Qué quiere decir? 823 00:47:52,380 --> 00:47:58,500 Cuando se usan clases y clases abstractas y conceptos de herencia, yo estoy creando un árbol de herencia. 824 00:47:58,679 --> 00:48:02,699 Estoy creando clases que tienen que ver una con otra. 825 00:48:03,260 --> 00:48:07,639 Las interfaces suelen ser algo un poco más independiente. 826 00:48:07,639 --> 00:48:15,519 Las interfaces no entran en esta construcción jerárquica que me estoy creando para mi contexto de mi problema, ¿vale? 827 00:48:15,900 --> 00:48:24,880 Yo creo las personas, luego los alumnos, los profesores, todas estas son clases que entran dentro del problema escuela que estoy gestionando, ¿vale? 828 00:48:24,880 --> 00:48:32,800 Entonces, persona la hago abstracta y luego uso solo profesores y alumnos como concretizaciones de esta clase abstracta, 829 00:48:33,059 --> 00:48:39,280 pero están relacionadas entre ellos de esta jerarquía que tienen, etcétera, etcétera, ¿vale? 830 00:48:39,280 --> 00:48:43,119 O empleado, o profesor, o lo que sea, ¿vale? 831 00:48:43,679 --> 00:48:48,639 La clase, la interfaz, no está en esta construcción. 832 00:48:49,539 --> 00:48:51,699 Está un poco más al margen. 833 00:48:51,699 --> 00:49:02,139 Cuando tú dices comparable, ¿vale? La interfaz comparable que permite luego comparar alumnos o comparar profesores, ¿esto dónde la pondríais en esta jerarquía? 834 00:49:03,480 --> 00:49:13,300 A un lado, es como al lado, ¿vale? Un profesor puede implementar comparable, un alumno puede implementar comparable, una persona podría implementar comparable, no lo sé, ¿vale? 835 00:49:13,300 --> 00:49:16,079 si quisiera poder comparar estas cosas. 836 00:49:16,440 --> 00:49:18,440 Como una cosa un poquito al margen, 837 00:49:18,539 --> 00:49:22,960 no está en esta estructura de definición de problema, 838 00:49:23,139 --> 00:49:25,059 del contexto del problema que estoy creando. 839 00:49:25,579 --> 00:49:27,900 Entonces, cuando lo que quiero crear 840 00:49:27,900 --> 00:49:29,840 es un elemento de esta construcción, 841 00:49:29,940 --> 00:49:33,960 es algo que modeliza las entidades 842 00:49:33,960 --> 00:49:39,079 que están trabajando dentro de mi contexto del problema, 843 00:49:39,500 --> 00:49:41,619 pues posiblemente usaría una clase abstracta. 844 00:49:41,619 --> 00:49:47,860 Si en vez de ser algo que puedas reutilizar en otros contextos o en contextos distintos, pues es más intérprete. 845 00:49:48,460 --> 00:49:54,300 ¿Sí? Entonces, ¿qué propósito tiene esta nueva cosa que voy creando? 846 00:49:54,699 --> 00:49:56,820 Vaya esto, pues, clases abstractas e intérpretes. 847 00:49:58,059 --> 00:49:59,239 Implementación de métodos. 848 00:49:59,239 --> 00:50:03,699 Una clase abstracta puede proporcionar una implementación para algunos de sus métodos, 849 00:50:03,739 --> 00:50:08,460 mientras que las clases que la heredan deben implementar los métodos restantes. 850 00:50:08,460 --> 00:50:15,340 Por otro lado, en una interfaz, los métodos son solo declaraciones y no tienen una implementación, a menos que no se utilice el método de Paul. 851 00:50:15,699 --> 00:50:18,760 Esto quizás es más débil, porque dice más o menos lo mismo. 852 00:50:19,280 --> 00:50:23,400 Pero tú lo piensas así y dices, ¿qué quiero hacer yo? 853 00:50:24,219 --> 00:50:33,880 ¿Me sale mejor pensar que esto es una clase con métodos implementados y alguno que no puedo implementar, que dejaré como abstracto? 854 00:50:33,880 --> 00:50:36,000 o es más bien un contrato 855 00:50:36,000 --> 00:50:37,940 un algo que yo digo, todos los que 856 00:50:37,940 --> 00:50:40,159 implementan esto tienen que cumplir 857 00:50:40,159 --> 00:50:42,139 con estas cosas y además como 858 00:50:42,139 --> 00:50:43,760 bonus 859 00:50:43,760 --> 00:50:45,539 alguno de estos te doy una 860 00:50:45,539 --> 00:50:48,320 definición estándar 861 00:50:48,320 --> 00:50:49,820 por defecto que normalmente 862 00:50:49,820 --> 00:50:52,239 se hace así, pero que si tú quieres 863 00:50:52,239 --> 00:50:53,760 lo haces como tú quieras y si no pillas 864 00:50:53,760 --> 00:50:55,320 la que tú quieras, ¿vale? 865 00:50:55,559 --> 00:50:57,800 como filosofía es un poquito distinta 866 00:50:57,800 --> 00:50:59,400 una es 867 00:50:59,400 --> 00:51:02,400 me centro en lo que puedo hacer 868 00:51:02,400 --> 00:51:04,460 y dejo para hacer lo que no puedo 869 00:51:04,460 --> 00:51:05,440 y otra es 870 00:51:05,440 --> 00:51:08,559 clarifico lo que se tiene que poder 871 00:51:08,559 --> 00:51:10,480 hacer y a lo mejor te doy 872 00:51:10,480 --> 00:51:12,119 alguna solución ya hecha. 873 00:51:13,340 --> 00:51:14,460 Filosóficamente es un poquito distinto. 874 00:51:15,239 --> 00:51:16,460 Como diseño es un poquito distinto. 875 00:51:20,239 --> 00:51:20,719 Herencia 876 00:51:20,719 --> 00:51:22,860 lo que es más importante y más clave. 877 00:51:23,719 --> 00:51:25,079 Una clase puede extender 878 00:51:25,079 --> 00:51:27,059 solo una clase abstracta pero puede implementar 879 00:51:27,059 --> 00:51:28,940 múltiples interfaces. Esto significa 880 00:51:28,940 --> 00:51:31,280 que una clase puede heredar la característica 881 00:51:31,280 --> 00:51:32,980 de varios contratos diferentes 882 00:51:32,980 --> 00:51:34,739 al implementar múltiples interfaces. 883 00:51:35,000 --> 00:51:50,320 Entonces, lo que decíamos antes, si yo ya estoy forzado a extender una cosa, si yo soy alumno y ya seguramente tengo que extender persona, si quiero darle más cosas, pues tengo que crear interfaces, no puedo crear una clase abstracta. 884 00:51:50,320 --> 00:52:16,280 Si quiero crear evaluable, que me permite, que tiene el método hacer un examen y que así puede, todos los objetos que sean evaluables pueden hacer un examen, pues no lo puede hacer como clase astrata, porque si alumno ya extiende personal, no podría extender también evaluable como clase astrata. 885 00:52:16,280 --> 00:52:19,460 Tendrá que ser una interfaz. 886 00:52:20,320 --> 00:52:40,219 Entonces, a veces tengo constricciones necesarias. Si tengo las dos posibilidades, porque alumnos todavía no heredan nada, pues lo pienso. Y si es posible, yo iría hacia... Si tenéis la posibilidad, si no está claro, iríais hacia clase astrata o interfaz. 887 00:52:40,219 --> 00:52:45,760 interfaz. Porque así no me pillo 888 00:52:45,760 --> 00:52:47,679 los dedos y mañana me doy cuenta que tengo 889 00:52:47,679 --> 00:52:48,199 que extender. 890 00:52:50,039 --> 00:52:53,099 Y también variables. 891 00:52:53,780 --> 00:52:55,659 Las variables en una clase abstracta 892 00:52:55,659 --> 00:52:57,940 pueden ser estáticas o no estáticas. 893 00:52:58,099 --> 00:52:59,960 Mientras que en una interfaz 894 00:52:59,960 --> 00:53:01,280 solo pueden ser 895 00:53:01,280 --> 00:53:03,800 estáticas o finales. 896 00:53:04,099 --> 00:53:04,820 O sea, constantes. 897 00:53:05,699 --> 00:53:07,219 Esto también es otra cosa importante. 898 00:53:08,139 --> 00:53:08,780 Cuando yo defino 899 00:53:08,780 --> 00:53:11,800 las variables en una clase abstracta 900 00:53:11,800 --> 00:53:13,320 son variables del propio objeto, 901 00:53:13,320 --> 00:53:16,000 que luego heredará quien estén de este objeto. 902 00:53:16,500 --> 00:53:20,800 Sin embargo, en una interfaz, las variables no son del objeto, 903 00:53:21,159 --> 00:53:24,340 solo son variables estáticas, o sea, de la clase. 904 00:53:26,460 --> 00:53:32,079 Entonces, allí también es una pista para ver si uso clase abstracta o no, o interfaz. 905 00:53:32,460 --> 00:53:35,320 La interfaz solo, sustantivamente, me trabaja sobre los métodos, 906 00:53:36,139 --> 00:53:39,980 mientras la clase abstracta, perdón, la interfaz solo sobre los métodos, 907 00:53:39,980 --> 00:53:50,099 Mientras se explota, me puede también jugar sobre algunas características propias de este objeto que no es técnico. 908 00:53:50,099 --> 00:53:56,429 Vamos a ver si está funcional, que no tengo la fuerza de algo. 909 00:53:56,429 --> 00:54:05,429 Entonces la vemos en luz o en base, porque esta cosa aquí os hace daño, ¿vale? 910 00:54:05,429 --> 00:54:08,010 ¡Duda!