1 00:00:00,180 --> 00:00:06,740 Voy a grabar esta clase, por lo tanto si habláis me dais consentimiento para poder grabarlo, ¿vale? 2 00:00:06,740 --> 00:00:10,919 Entonces estamos viendo clases abstractas, polimorfismo, interfaces y lo que sea, ¿vale? 3 00:00:11,140 --> 00:00:15,859 Entonces las clases abstractas hemos entendido que son, hemos empezado a trabajar con ellos, 4 00:00:16,039 --> 00:00:20,480 hemos visto el concepto de que puedo tener el mismo método en clases distintas 5 00:00:20,480 --> 00:00:28,000 y que Java en automático selecciona cuál es la mejor implementación de ese método 6 00:00:28,000 --> 00:00:31,079 en base a la instancia del objeto mismo 7 00:00:31,079 --> 00:00:32,380 no en base a la referencia 8 00:00:32,380 --> 00:00:35,380 hemos visto que yo puedo hacer un downcasting 9 00:00:35,380 --> 00:00:41,520 para utilizar métodos de un hijo 10 00:00:41,520 --> 00:00:47,420 desde una referencia que es de tipo padre 11 00:00:47,420 --> 00:00:49,280 pero la instancia de tipo hijo 12 00:00:49,280 --> 00:00:52,920 y para saber si esta referencia de tipo padre 13 00:00:52,920 --> 00:00:56,000 eso no es una instancia de tipo hijo 14 00:00:56,000 --> 00:00:57,740 siempre tengo la posibilidad de usar el 15 00:00:57,740 --> 00:00:58,359 instance of 16 00:00:58,359 --> 00:01:01,500 y hoy vamos a ver 17 00:01:01,500 --> 00:01:03,820 la última parte de esto 18 00:01:03,820 --> 00:01:05,939 que son las interfaces 19 00:01:05,939 --> 00:01:07,780 hemos dicho que 20 00:01:07,780 --> 00:01:08,379 en Java 21 00:01:08,379 --> 00:01:11,519 no existe la herencia 22 00:01:11,519 --> 00:01:13,680 múltiple, eso quiere decir que yo 23 00:01:13,680 --> 00:01:15,780 cuando heredo de otra clase 24 00:01:15,780 --> 00:01:17,519 tengo que decidir 25 00:01:17,519 --> 00:01:19,620 una sola clase y desde 26 00:01:19,620 --> 00:01:21,659 esa heredo, me importo todos los 27 00:01:21,659 --> 00:01:23,760 digamos que heredo todos los 28 00:01:23,760 --> 00:01:25,400 métodos, las variables, etc. 29 00:01:25,400 --> 00:01:40,900 Pero no puedo, en ningún caso, heredar desde dos clases a la vez. Puedo hacer una cadena, esto hereda de esto, que hereda de esto, que hereda de esto, pero no puedo una misma clase decir hereda de la clase A y hereda también de la clase B. 30 00:01:40,900 --> 00:01:45,879 pero hay veces en el que esto podría ser útil 31 00:01:45,879 --> 00:01:47,879 hay veces en el que yo digo 32 00:01:47,879 --> 00:01:50,840 sí, esta clase debería hacer cosas que hace la clase A 33 00:01:50,840 --> 00:01:54,739 y también debería poder ser capaz de hacer cosas 34 00:01:54,739 --> 00:01:56,959 que hace una clase B 35 00:01:56,959 --> 00:02:00,879 entonces para intentar solucionar esto 36 00:02:00,879 --> 00:02:03,739 en otros lenguajes de programación como C++ 37 00:02:03,739 --> 00:02:05,620 se puede hacer herencia múltiple 38 00:02:05,620 --> 00:02:07,120 pero Java como no lo permite 39 00:02:07,120 --> 00:02:31,939 Pues introduce otro mecanismo parecido, pero un poquito distinto, que son las interfaces, ¿vale? Es un concepto parecido a las clases abstractas, ¿vale? Es decir, defino una estructura formal de métodos, una serie de métodos, un conjunto de métodos, que mi clase seguramente va a tener. 40 00:02:31,939 --> 00:02:42,819 Voy a crear un contrato en el que digo, oye, mira, yo soy la interfaz algo 41 00:02:42,819 --> 00:02:50,000 Cualquier clase que diga que va a utilizar, ahora veremos cómo se dice técnicamente 42 00:02:50,000 --> 00:02:57,219 La interfaz algo, tendrá necesariamente que implementar este método, este método, este método 43 00:02:57,219 --> 00:03:02,259 De esa forma, si yo sé una clase cualquiera, esté donde esté 44 00:03:03,139 --> 00:03:14,800 Si usa, si hace algo, se implementa, se dice, la interfaz a algo, seguramente sobre esta clase puedo llamar estos tres métodos. 45 00:03:14,800 --> 00:03:24,280 ¿Por qué? Porque es un contrato. La interfaz me dice, si quieres implementar esta interfaz, necesitas haber implementado estos tres métodos. 46 00:03:24,280 --> 00:03:38,979 Es lo mismo que la clase abstracta en un cierto sentido, solo que la clase abstracta podía también tener una parte concreta y luego tener algunos métodos abstractos. En vez, en una interfaz es como si fuera una clase abstracta donde todos los métodos son abstractos. 47 00:03:38,979 --> 00:03:57,180 ¿Sí? Esto me permite que en una clase yo pueda extender, entonces heredar de una clase, pero implementar otras, otras interfaces. 48 00:03:57,560 --> 00:04:01,219 Yo puedo implementar cuantas interfaces me da la gana, ¿vale? 49 00:04:01,460 --> 00:04:05,819 Entonces, si yo tengo mi clase, le digo implementas esta interfaz, esta otra y esta otra, 50 00:04:05,819 --> 00:04:16,819 y yo sé que tendrá que tener los métodos de las tres interfaces, los métodos definidos como abstractos en las tres interfaces que yo voy a implementar. 51 00:04:19,240 --> 00:04:25,620 Se parecen a las clases abstractas, pero a diferencia de estas, todos sus métodos son obligatoriamente abstractos. 52 00:04:26,019 --> 00:04:30,819 Y como los métodos son obligatoriamente abstractos, no se pone abstracto. 53 00:04:30,819 --> 00:04:32,819 se da por hecho 54 00:04:32,819 --> 00:04:35,480 ¿vale? porque es la primera vez 55 00:04:35,480 --> 00:04:37,079 ahora lo veremos, que cuando yo defino 56 00:04:37,079 --> 00:04:39,300 una interfaz, no la defino 57 00:04:39,300 --> 00:04:40,800 como public class 58 00:04:40,800 --> 00:04:43,540 la defino como public interface 59 00:04:43,540 --> 00:04:47,319 entonces es una cosa distinta de las clases 60 00:04:47,319 --> 00:04:49,540 las clases son clases, estas son interfaces 61 00:04:49,540 --> 00:04:51,620 si yo estoy definiendo una interfaz 62 00:04:51,620 --> 00:04:53,319 en automático sé que 63 00:04:53,319 --> 00:04:55,259 todas las declaraciones de sus métodos 64 00:04:55,259 --> 00:04:56,699 van a ser abstractas 65 00:04:56,699 --> 00:04:58,819 y como sé que tienen que ser abstractas 66 00:04:58,819 --> 00:05:05,180 no hace falta poner que son abstractas, así como no hace falta poner que la interfaz es abstracta, ¿vale? 67 00:05:06,740 --> 00:05:13,680 Es una forma, digamos, de simplificar el concepto de la clase abstracta, de decir, en vez de ponerte abstracta por todo lado, 68 00:05:13,839 --> 00:05:20,959 pues te doy esta forma de hacerlo, que es con la interfaz, si tú estás haciendo una clase que sólo tendría métodos abstractos, 69 00:05:21,040 --> 00:05:26,459 en vez de hacerte la clase abstracta con todos los métodos abstractos, hazte una interfaz declarando los métodos, 70 00:05:26,459 --> 00:05:31,459 Y estos serán los métodos abstractos que se tendrán que implementar. 71 00:05:32,800 --> 00:05:39,439 Entonces está la clase concreta, está al lado opuesto la interfaz, donde todos los métodos son abstractos, 72 00:05:39,720 --> 00:05:42,720 y luego está la clase abstracta, que es una mezcla de los dos. 73 00:05:43,180 --> 00:05:47,560 Es una clase que puede tener una parte concreta y puede tener una parte abstracta. 74 00:05:47,779 --> 00:05:51,459 Entonces, dependiendo de lo que necesito yo, uso una cosa u otra. 75 00:05:52,220 --> 00:05:58,660 Si todos mis métodos son abstractos, ¿puedo hacer una clase abstracta cuyos métodos son todos abstractos? 76 00:05:59,540 --> 00:06:01,759 Sí. ¿Por qué no es una buena idea? 77 00:06:02,180 --> 00:06:08,300 Lo mismo en la interfaz. 78 00:06:09,959 --> 00:06:16,899 Porque si yo hago una clase abstracta, estoy bloqueando la clase que estoy creando, la esfuerzo a heredar de mí. 79 00:06:17,319 --> 00:06:18,800 Y entonces no puede heredar de otra. 80 00:06:19,439 --> 00:06:24,899 Y si mi clase no le proporciona nada porque todo es abstracto, es mejor hacer una interfaz. 81 00:06:24,899 --> 00:06:36,800 Así desbloqueo la herencia y mi clase puede heredar de otra clase si quiere o necesita y implementar mis métodos gracias a la implementación de la clase abstracta, de la interfaz. 82 00:06:38,759 --> 00:07:00,209 Hay una pregunta, si y no, porque si tú defines que está la variable número de lados, que nosotros pusimos, entonces no es una interfaz, porque has concretizado algo. 83 00:07:00,209 --> 00:07:02,470 y si tú le pones en 84 00:07:02,470 --> 00:07:03,949 figura geométrica un 85 00:07:03,949 --> 00:07:06,470 descripción que 86 00:07:06,470 --> 00:07:08,110 implementa con 87 00:07:08,110 --> 00:07:10,730 soy una figura de enhelados 88 00:07:10,730 --> 00:07:12,990 ¿vale? pues entonces 89 00:07:12,990 --> 00:07:14,189 ya no es un interfaz 90 00:07:14,189 --> 00:07:16,870 si tú lo consideras 91 00:07:16,870 --> 00:07:18,529 como le quitas a ese ahí 92 00:07:18,529 --> 00:07:20,889 y le pones solo calcular área, calcular perímetro 93 00:07:20,889 --> 00:07:22,149 calcular no sé qué 94 00:07:22,149 --> 00:07:24,689 que vale para todas las cosas, pues sí, podría ser 95 00:07:24,689 --> 00:07:25,170 un interfaz 96 00:07:25,170 --> 00:07:26,050 ¿sí? 97 00:07:26,949 --> 00:07:27,430 entonces 98 00:07:27,430 --> 00:07:32,589 Entonces, tres niveles de abstracción, entre comillas 99 00:07:32,589 --> 00:07:34,769 La clase es todo concreto 100 00:07:34,769 --> 00:07:37,850 La clase abstrata, algo concreto y algo abstrato 101 00:07:37,850 --> 00:07:39,889 La interfaz, todo abstrato 102 00:07:39,889 --> 00:07:47,029 En Java se declaran utilizando la palabra interface en lugar de class 103 00:07:47,029 --> 00:07:49,629 O sea, en vez de public class hago public interface 104 00:07:49,629 --> 00:07:53,949 Para crear una clase que escriba código para los métodos 105 00:07:53,949 --> 00:07:57,470 indefinidos aún, porque son abstractos 106 00:07:57,470 --> 00:08:00,209 de una interfaz, pues lo que hago 107 00:08:00,209 --> 00:08:02,769 es usar la palabra reservada implements 108 00:08:02,769 --> 00:08:04,589 en vez que extends 109 00:08:04,589 --> 00:08:09,990 entonces public class mi clase 110 00:08:09,990 --> 00:08:13,769 implements mi interfaz 111 00:08:13,769 --> 00:08:20,779 se pueden declarar referencias a objetos 112 00:08:20,779 --> 00:08:23,879 cuyos tipo sea una interfaz en lugar de una clase 113 00:08:23,879 --> 00:08:26,000 o sea, como antes yo podía hacer 114 00:08:26,000 --> 00:08:29,379 una variable de tipo clase abstracta, 115 00:08:29,899 --> 00:08:31,740 ahora puedo hacer una variable 116 00:08:31,740 --> 00:08:34,200 que como tipo tenga una interfaz. 117 00:08:35,500 --> 00:08:35,620 ¿Sí? 118 00:08:36,019 --> 00:08:38,200 Estoy hablando de la referencia, de la variable. 119 00:08:38,659 --> 00:08:40,840 No puedo hacer un new de una interfaz. 120 00:08:41,480 --> 00:08:42,980 ¿Por qué no puedo hacer un new de una interfaz? 121 00:08:44,080 --> 00:08:45,960 Porque todos sus métodos son abstractos 122 00:08:45,960 --> 00:08:48,019 y mientras que no haya una concretización de esos, 123 00:08:48,480 --> 00:08:49,139 no puedo hacerlo. 124 00:08:49,620 --> 00:08:52,620 Pero sí puedo hacer mi interfaz x 125 00:08:52,620 --> 00:08:54,980 es igual a new 126 00:08:54,980 --> 00:08:57,039 mi clase, asumiendo 127 00:08:57,039 --> 00:08:59,159 que mi clase implements 128 00:08:59,159 --> 00:09:00,200 mi interfaz 129 00:09:00,200 --> 00:09:02,279 ¿si? 130 00:09:03,039 --> 00:09:04,960 entonces, la interfaz 131 00:09:04,960 --> 00:09:06,080 se vuelve un comodín 132 00:09:06,080 --> 00:09:08,659 para decir, oye mira, cualquier 133 00:09:08,659 --> 00:09:10,600 objeto de tipo mi interfaz 134 00:09:10,600 --> 00:09:12,860 puede ser referenciado 135 00:09:12,860 --> 00:09:14,200 o sea, puede hacer una referencia 136 00:09:14,200 --> 00:09:16,779 de tipo mi interfaz a cualquier 137 00:09:16,779 --> 00:09:18,679 objeto que implemente esta 138 00:09:18,679 --> 00:09:20,659 interfaz, entonces sé que allí 139 00:09:20,659 --> 00:09:22,580 dentro tendrá los métodos abstractos 140 00:09:22,580 --> 00:09:30,500 que yo he definido en mi interfaz. Si mi interfaz definía los métodos dibuja y escribe, pues 141 00:09:30,500 --> 00:09:36,340 cualquier objeto de tipo interfaz tendrá dibuja y escribe. Si no, no habría implementado 142 00:09:36,340 --> 00:09:43,080 la interfaz. Esta forma de proceder tiene sentido para definir un objeto en función 143 00:09:43,080 --> 00:09:48,440 del tipo más genérico para utilizar mecanismos como el polimorfismo. Aquí también estamos 144 00:09:48,440 --> 00:09:53,519 utilizando polimorfismo, de ello te declaro que hay el método calcularia como interfaz 145 00:09:53,519 --> 00:10:02,720 y luego todos los que implementan la interfaz que se llama se puede calcular área, pues tendrán que tener el método calcular área. 146 00:10:04,440 --> 00:10:14,720 Su principal función es establecer y estabilizar las interfaces como prototipo de métodos de una clase para poder desarrollar y así coordinar varios equipos de trabajo. 147 00:10:15,259 --> 00:10:16,600 ¿Qué quiere decir esto? 148 00:10:17,200 --> 00:10:23,019 Yo puedo, por un lado, crear una interfaz y decir, oye, mira, 149 00:10:23,940 --> 00:10:28,139 estas clases, la clase que implementa esta interfaz tendrán que tener estos métodos. 150 00:10:29,139 --> 00:10:34,019 Una vez que he definido esta interfaz, yo puedo dividir el trabajo entre 151 00:10:34,019 --> 00:10:40,179 personas que implementarán la clase A que implementa esta interfaz. 152 00:10:40,179 --> 00:10:44,379 Entonces, ¿dónde se dará el cuerpo de estos métodos? 153 00:10:44,720 --> 00:11:05,659 Pero al mismo tiempo, yo puedo decir a otro grupo de trabajo, oye, mira, tú tendrás en un futuro una clase que implementa esta interfaz. Ahora, tú puedes ya desarrollar utilizando objetos de tipo esta interfaz y usar sus métodos como si ya estuvieran implementados. 154 00:11:05,659 --> 00:11:11,039 Luego en un futuro se implementarán con el trabajo que ha hecho el otro equipo 155 00:11:11,039 --> 00:11:13,879 Pero ya tú puedes seguir trabajando 156 00:11:13,879 --> 00:11:17,500 Asumiendo que el método calcular área, por ejemplo 157 00:11:17,500 --> 00:11:19,980 De la interfaz se pueden calcular áreas 158 00:11:19,980 --> 00:11:22,899 Pues calculará el área, funcionará 159 00:11:22,899 --> 00:11:26,019 Ahora tú lo puedes ya utilizar en tu código 160 00:11:26,019 --> 00:11:28,879 Después hacemos un ejemplo para entender lo que estamos diciendo 161 00:11:28,879 --> 00:11:30,559 Pero tú ya lo puedes utilizar 162 00:11:30,559 --> 00:11:35,559 Luego cómo lo hará y qué funcionará lo veremos más adelante 163 00:11:35,559 --> 00:11:55,299 Cuando ya estará lista el otra clase. Y si tú necesitas sí o sí un objeto de la otra clase por algún lado, pues te puedes crear un objeto mock, un objeto falso, un objeto ficticio que usarás en tu programa por ahora, que da un resultado siempre fijo sin saber qué hace. 164 00:11:55,299 --> 00:12:00,299 y cuando en un futuro ya estará listo el trabajo del otro equipo, pues lo integramos y funciona. 165 00:12:01,259 --> 00:12:06,220 Ahora luego probamos a hacer un pequeño ejemplo sobre este tema para que entendáis qué quiero decir. 166 00:12:08,799 --> 00:12:12,059 Veamos un poco. El equipo que debe utilizar... Bueno, esta es la explicación misma. 167 00:12:12,279 --> 00:12:19,779 El equipo que debe utilizar objetos que implementan dicha interfaz, basta con que declaren en su código una referencia a dicha interfaz, 168 00:12:20,799 --> 00:12:25,080 aunque no esté todavía compilada ninguna clase que la implemente. 169 00:12:25,080 --> 00:12:37,899 Yo tengo una referencia de tipo esta interfaz, pero no tengo una implementación de esta interfaz. La tendré en un futuro. Y aquí en mi código yo puedo usar tranquilamente esta interfaz haciendo lo que me haga gana con esa interfaz. 170 00:12:37,899 --> 00:12:41,360 los equipos que creen clases que implementan 171 00:12:41,360 --> 00:12:43,500 esta interfaz están a su vez 172 00:12:43,500 --> 00:12:45,360 desacoplado de los equipos 173 00:12:45,360 --> 00:12:47,179 que la utilizan, esto es para que 174 00:12:47,179 --> 00:12:49,580 me permita trabajar 175 00:12:49,580 --> 00:12:53,500 en paralelo entre grupos 176 00:12:53,500 --> 00:12:54,120 de trabajo 177 00:12:54,120 --> 00:12:57,620 en términos técnicos es desacoplado 178 00:12:57,620 --> 00:12:59,500 yo no dependo de ti y tú no dependes 179 00:12:59,500 --> 00:13:01,039 de mí, en un futuro 180 00:13:01,039 --> 00:13:03,559 podremos funcionar juntos 181 00:13:03,559 --> 00:13:05,620 porque hemos definido esta interfaz 182 00:13:05,620 --> 00:13:07,519 este punto de contacto, los métodos 183 00:13:07,519 --> 00:13:09,299 que se pueden utilizar, están definidos aquí 184 00:13:09,299 --> 00:13:10,820 y yo los utilizo 185 00:13:10,820 --> 00:13:12,120 sin saber 186 00:13:12,120 --> 00:13:15,460 qué harán adentro y al mismo tiempo 187 00:13:15,460 --> 00:13:16,779 por otro lado 188 00:13:16,779 --> 00:13:19,179 tú lo estás implementando 189 00:13:19,179 --> 00:13:20,980 sin saber quién los utilizará 190 00:13:20,980 --> 00:13:24,620 y cuándo lo utilizará 191 00:13:24,620 --> 00:13:27,779 los equipos 192 00:13:27,779 --> 00:13:28,779 que creen 193 00:13:28,779 --> 00:13:31,759 este es el concepto 194 00:13:31,759 --> 00:13:33,460 de mock, si en algún 195 00:13:33,460 --> 00:13:35,039 momento, pero yo necesito 196 00:13:35,039 --> 00:13:37,299 por alguna razón, necesito 197 00:13:37,299 --> 00:13:39,159 una implementación, necesito hacer un new 198 00:13:39,159 --> 00:13:41,039 para hacer algo 199 00:13:41,039 --> 00:13:43,320 pues lo que puede hacer es crearme un objeto 200 00:13:43,320 --> 00:13:44,879 falso, un objeto mock 201 00:13:44,879 --> 00:13:47,000 ¿vale? que es una clase donde 202 00:13:47,000 --> 00:13:49,139 los métodos, los implementos, pero que hagan 203 00:13:49,139 --> 00:13:50,899 nada, si es un método que tiene que calcular el área 204 00:13:50,899 --> 00:13:53,220 y yo lo implemento con return a 3 205 00:13:53,220 --> 00:13:54,960 cada vez que calcularé el área 206 00:13:54,960 --> 00:13:56,259 pues me devolverá 3 207 00:13:56,259 --> 00:13:59,340 pero lo puedo utilizar, puedo crear objetos de esos 208 00:13:59,340 --> 00:14:01,419 pero claramente serán inútiles 209 00:14:01,419 --> 00:14:02,879 ¿sí? 210 00:14:05,620 --> 00:14:06,679 ejemplo, ¿vale? 211 00:14:06,740 --> 00:14:08,379 para que entendamos un poquito 212 00:14:08,379 --> 00:14:10,779 esta, por ejemplo, existe 213 00:14:10,779 --> 00:14:12,559 la interfaz comparable 214 00:14:12,559 --> 00:14:14,720 la interfaz comparable 215 00:14:14,720 --> 00:14:16,799 me transforma mi 216 00:14:16,799 --> 00:14:18,899 objeto en un objeto 217 00:14:18,899 --> 00:14:19,759 comparable 218 00:14:19,759 --> 00:14:22,940 ¿qué quiere decir? cuando yo 219 00:14:22,940 --> 00:14:24,860 tengo un objeto, el objeto 220 00:14:24,860 --> 00:14:25,320 gato 221 00:14:25,320 --> 00:14:28,259 y quiero saber 222 00:14:28,259 --> 00:14:31,019 y quiero implementar la interfaz comparable 223 00:14:31,019 --> 00:14:32,940 entonces gato implements 224 00:14:32,940 --> 00:14:35,220 comparable, la comparable 225 00:14:35,220 --> 00:14:37,200 me dice que obligatoriamente 226 00:14:37,200 --> 00:14:39,039 tengo que implementar el método 227 00:14:39,039 --> 00:14:40,720 int compareTo 228 00:14:40,720 --> 00:14:48,220 objeto, está este método que yo tengo que implementar. ¿Y qué me dice? Pues si yo 229 00:14:48,220 --> 00:14:55,759 implemento este objeto, implemento este método, tengo que hacer que si mi objeto, el gato 230 00:14:55,759 --> 00:15:05,700 dice, es más grande que el objeto pasado por aquí, pues yo te tengo que devolver un 231 00:15:05,700 --> 00:15:12,139 número positivo. Si es más pequeño, te tengo que devolver un número negativo. Y si son 232 00:15:12,139 --> 00:15:19,220 iguales, pues te tengo que devolver cero. O sea que este es un método general. Yo no 233 00:15:19,220 --> 00:15:24,320 sé cómo se comparan dos gatos. Se podrían comparar por edad, se podrían comparar por 234 00:15:24,320 --> 00:15:31,220 tamaño, se podrían comparar por, no lo sé, por color, qué sé yo. Pero yo estoy diciendo 235 00:15:31,220 --> 00:15:33,340 quiero poder comparar gatos 236 00:15:33,340 --> 00:15:35,700 para poder comparar gatos 237 00:15:35,700 --> 00:15:37,139 yo lo que voy a hacer es 238 00:15:37,139 --> 00:15:39,000 implementar la interfaz comparable 239 00:15:39,000 --> 00:15:42,000 y la interfaz comparable me obliga 240 00:15:42,000 --> 00:15:43,779 a implementar este método 241 00:15:43,779 --> 00:15:46,100 a partir de ahora 242 00:15:46,100 --> 00:15:47,399 ¿vale? 243 00:15:47,899 --> 00:15:49,659 yo, mis objetos 244 00:15:49,659 --> 00:15:51,039 gato en este caso 245 00:15:51,039 --> 00:15:53,679 pues son comparables entre ellos 246 00:15:53,679 --> 00:15:55,500 los puedo ordenar 247 00:15:55,500 --> 00:15:56,620 ¿sí? 248 00:15:57,059 --> 00:15:59,419 entonces, esto me permite 249 00:15:59,419 --> 00:16:09,759 por otro lado, utilizar otra clase que pilla objetos, sean cual sean, pueden ser gatos, 250 00:16:09,919 --> 00:16:16,879 pueden ser cocodrilos, me da igual, y los ordena de mayor a menor. ¿Qué tipo tendrán 251 00:16:16,879 --> 00:16:33,340 estos objetos? Repito la pregunta. Por un lado tengo mi clase gato, que implementa, 252 00:16:33,340 --> 00:16:37,299 Comparable, hemos dicho 253 00:16:37,299 --> 00:16:41,419 Entonces, eso quiere decir que la clase gato 254 00:16:41,419 --> 00:16:46,659 Por algún lado tendrá que implementar compare to 255 00:16:46,659 --> 00:16:53,769 Y a partir de que ha implementado este método 256 00:16:53,769 --> 00:16:57,149 Yo puedo comparar gatos 257 00:16:57,149 --> 00:16:59,090 Puedo decir si este gato es más grande que esto 258 00:16:59,090 --> 00:17:00,570 Si este gato es más pequeño que esto 259 00:17:00,570 --> 00:17:03,049 Si este gato es igual de... 260 00:17:03,049 --> 00:17:04,569 ¿En base a qué? 261 00:17:04,569 --> 00:17:20,930 En base a lo que yo sé de los gatos. Es un problema mío de yo estoy creando el objeto gato. Entonces, yo quiero poderlos comparar. Yo sé cuando un gato es mayor que otro gato o un gato es menor que otro gato. Lo defino aquí dentro. 262 00:17:21,710 --> 00:17:30,509 Si es por edad, pues diré, si el gato Dís tiene más años que el gato que me has pasado aquí como objeto, 263 00:17:31,769 --> 00:17:37,529 pues entonces devuelve, no lo sé, 30, que es un número positivo. 264 00:17:37,950 --> 00:17:40,430 Si tiene la misma edad, devuelve 0. 265 00:17:40,869 --> 00:17:47,289 Si el Dís tiene una edad menor que el gato que me has pasado aquí como parámetro, devuelve menos 30. 266 00:17:47,289 --> 00:17:53,059 he hecho las especificaciones que me pide aquí 267 00:17:53,059 --> 00:17:55,640 ahora, por otro lado 268 00:17:55,640 --> 00:17:59,240 completamente sin saber que el gato 269 00:17:59,240 --> 00:18:02,480 implementa el comparable, yo puedo hacer una clase 270 00:18:02,480 --> 00:18:04,880 que lo que hace es ordenar objetos 271 00:18:04,880 --> 00:18:08,519 entonces, si aquí tendré objetos 272 00:18:08,519 --> 00:18:11,119 y lo que quiero decir es 273 00:18:11,119 --> 00:18:13,500 ponme primero el menor, que por ejemplo es este aquí 274 00:18:13,500 --> 00:18:15,880 luego el siguiente menor, luego el siguiente menor 275 00:18:15,880 --> 00:18:36,519 ¿Vale? Para poder hacer esto yo tengo que comparar los objetos entre ellos. Y cuidado, no sé cómo se comparan los objetos. Porque no sé si estos objetos serán gatos, serán cocodrilos, serán personas. ¿Vale? No lo sé. 276 00:18:36,519 --> 00:18:38,859 yo quiero hacer una cosa tan genérica 277 00:18:38,859 --> 00:18:40,259 que me dice, tú dame objetos 278 00:18:40,259 --> 00:18:41,779 y yo te los ordeno 279 00:18:41,779 --> 00:18:44,720 ahora, estos objetos 280 00:18:44,720 --> 00:18:46,759 para que esto funcione 281 00:18:46,759 --> 00:18:48,839 ¿qué tipo tendrán que tener? 282 00:18:50,039 --> 00:18:51,079 tú me dices, tipo gato 283 00:18:51,079 --> 00:18:53,279 entonces me funcionaría solo como gato 284 00:18:53,279 --> 00:18:54,019 con gatos 285 00:18:54,019 --> 00:18:56,160 no me funcionaría con persona 286 00:18:56,160 --> 00:18:59,359 ¿qué tipo le doy a estos señores? 287 00:18:59,539 --> 00:19:00,460 ¿le doy object? 288 00:19:01,839 --> 00:19:02,400 no 289 00:19:02,400 --> 00:19:04,799 porque si yo hago perro 290 00:19:04,799 --> 00:19:06,500 que no implementa comparable 291 00:19:06,500 --> 00:19:08,779 no puedo comparar dos perros 292 00:19:08,779 --> 00:19:10,579 entre ellos, entonces object 293 00:19:10,579 --> 00:19:13,079 es demasiado genérico, ¿qué tipo le doy? 294 00:19:22,829 --> 00:19:23,589 ya, pero el método 295 00:19:23,589 --> 00:19:24,730 estará aquí 296 00:19:24,730 --> 00:19:27,730 esto es lo que me permite 297 00:19:27,730 --> 00:19:28,390 compararlo 298 00:19:28,390 --> 00:19:31,450 solo que si yo aquí le digo gatos 299 00:19:31,450 --> 00:19:33,490 o sea que estos son gatos, son 300 00:19:33,490 --> 00:19:35,789 objetos de tipo gato, pues entonces 301 00:19:35,789 --> 00:19:37,210 solo me funcionaría entre gatos 302 00:19:37,210 --> 00:19:39,250 no quiero, quiero que sea más genérico 303 00:19:39,250 --> 00:19:41,730 entonces le digo, le pongo object, así le puedo poner 304 00:19:41,730 --> 00:19:43,569 lo que me da la gana, pero el problema 305 00:19:43,569 --> 00:19:49,390 que vosotros, todos los objetos que habéis hecho hasta ahora, no tienen el método para compararlo. 306 00:19:50,029 --> 00:19:52,390 Las personas, vosotros no las podéis comparar. 307 00:19:54,150 --> 00:19:57,390 Los instrumentos musicales, vosotros no los podéis comparar. 308 00:19:57,789 --> 00:20:00,690 No podéis decir si un instrumento musical es mayor o menor que otro. 309 00:20:03,009 --> 00:20:10,309 Entonces, ¿cómo puedo estar seguro que estos objetos sean comparables? 310 00:20:10,309 --> 00:20:37,029 Es decir, que el tipo que uso para este objeto será tipo comparable. Esto. Estoy usando como tipo la interfaz. Esto me garantiza que, sea lo que sea, implementará comparable. Y si implementa comparable, tengo un método para compararlo. 311 00:20:37,029 --> 00:20:39,470 entonces son gatos, pues perfecto 312 00:20:39,470 --> 00:20:41,430 entonces podría hacer compare tú con este 313 00:20:41,430 --> 00:20:43,390 compare tú con este, compare tú con este 314 00:20:43,390 --> 00:20:44,210 y ordenarlos 315 00:20:44,210 --> 00:20:47,430 son barcos 316 00:20:47,430 --> 00:20:49,650 pero los barcos implementan 317 00:20:49,650 --> 00:20:51,589 compareable, por lo tanto lo puedo 318 00:20:51,589 --> 00:20:53,309 usar aquí, pues quiere decir que tendré un método 319 00:20:53,309 --> 00:20:55,630 para comprobar cuál de estos 320 00:20:55,630 --> 00:20:57,430 barcos es mejor, cuál de estos barcos es mejor 321 00:20:57,430 --> 00:20:59,250 cuál de estos barcos es mejor y ordenarlo 322 00:20:59,250 --> 00:21:02,799 se entiende la potencia de esto 323 00:21:02,799 --> 00:21:06,339 cualquier método 324 00:21:06,339 --> 00:21:13,299 que tú tengas con parable lo podrás usar con este método de ordenación que he creado que es genérico 325 00:21:13,299 --> 00:21:19,359 que no tendré que reescribir una vez para ordenar gato una vez para ordenar barco una vez para 326 00:21:19,359 --> 00:21:25,420 ordenar string una vez para ordenar todos los objetos que tengan comparable son ordenables 327 00:21:25,420 --> 00:21:34,960 entiende esta es la potencia de la interfaz yo me hago una interfaz luego hago programas que 328 00:21:34,960 --> 00:21:36,579 se basan sobre la interfaz 329 00:21:36,579 --> 00:21:38,960 y cualquier clase que implemente 330 00:21:38,960 --> 00:21:40,960 esta interfaz puede usar 331 00:21:40,960 --> 00:21:46,369 estos métodos 332 00:21:46,369 --> 00:21:48,269 ¿sí? ahora hacemos ejemplos 333 00:21:48,269 --> 00:21:48,890 con comparable 334 00:21:48,890 --> 00:21:50,150 ¿sí? 335 00:21:51,609 --> 00:21:54,369 nota, comparable es una clase que existe 336 00:21:54,369 --> 00:21:56,109 que es importante 337 00:21:56,109 --> 00:21:58,470 ¿vale? y que cuando vosotros 338 00:21:58,470 --> 00:22:00,430 implementáis comparable 339 00:22:00,430 --> 00:22:02,369 hay una parte que te dice 340 00:22:02,369 --> 00:22:03,789 que si son iguales 341 00:22:03,789 --> 00:22:05,289 tiene que dar cero 342 00:22:05,289 --> 00:22:08,210 ¿sí? esta cosa de aquí 343 00:22:08,210 --> 00:22:12,589 tiene que ser consistente con la implementación 344 00:22:12,589 --> 00:22:16,089 del equals. ¿Os acordáis del método de Equals? 345 00:22:16,970 --> 00:22:20,170 ¿Vale? El método de Equals te da true si dos objetos son 346 00:22:20,170 --> 00:22:23,970 cero. Y te da false, perdón, si dos objetos son iguales. 347 00:22:24,150 --> 00:22:28,210 Y te da false si dos objetos no son iguales. ¿Vale? Entonces, si dos 348 00:22:28,210 --> 00:22:32,289 objetos te dan equals true, te deberían 349 00:22:32,289 --> 00:22:37,509 dar compare to cero. Y si te dan 350 00:22:37,509 --> 00:22:39,450 un compare to que no es 0 351 00:22:39,450 --> 00:22:41,349 no te deberían dar 352 00:22:41,349 --> 00:22:44,839 equals true. Si tú has 353 00:22:44,839 --> 00:22:46,660 hecho una implementación de equals en una implementación 354 00:22:46,660 --> 00:22:48,799 de compare to que hacen estas cosas 355 00:22:48,799 --> 00:22:51,119 que acabo de decir, pues los has implementado 356 00:22:51,119 --> 00:22:52,920 mal. Porque estás 357 00:22:52,920 --> 00:22:54,779 diciendo que dos objetos son iguales pero 358 00:22:54,779 --> 00:22:56,759 este es mayor que esto. Entonces no son iguales. 359 00:23:16,279 --> 00:23:16,579 No. 360 00:23:17,460 --> 00:23:19,759 Si el método ya está implementado 361 00:23:19,759 --> 00:23:21,059 pues ya está implementado. 362 00:23:21,599 --> 00:23:23,779 O dicho de otra forma, si yo tengo 363 00:23:23,779 --> 00:23:25,819 si yo tengo la clase 364 00:23:25,819 --> 00:23:27,920 gato que implementa 365 00:23:27,920 --> 00:23:29,759 ya comparable y luego 366 00:23:29,759 --> 00:23:31,539 la extendo con la clase minino 367 00:23:31,539 --> 00:23:34,059 la clase minino implementa 368 00:23:34,059 --> 00:23:34,660 comparable 369 00:23:34,660 --> 00:23:37,700 si yo le pongo implements comparable me dirá 370 00:23:37,700 --> 00:23:39,140 ok 371 00:23:39,140 --> 00:23:41,519 pero normalmente 372 00:23:41,519 --> 00:23:43,559 se 373 00:23:43,559 --> 00:23:45,319 se tende a sobre escribirlo 374 00:23:45,319 --> 00:23:46,940 con los datos propios 375 00:23:46,940 --> 00:23:58,759 claro, clase padre 376 00:23:58,759 --> 00:24:00,900 es instrumentos musicales 377 00:24:00,900 --> 00:24:02,599 generales, entonces no los puedes 378 00:24:02,599 --> 00:24:04,480 comparar entre ellos porque no sabes como se 379 00:24:04,480 --> 00:24:06,039 comparen, pero luego 380 00:24:06,039 --> 00:24:08,460 entre pianos sí sabes cómo 381 00:24:08,460 --> 00:24:10,759 se comparan, entre guitarras sabes cómo se comparan 382 00:24:10,759 --> 00:24:12,799 por lo tanto, guitarra extends 383 00:24:12,799 --> 00:24:14,819 instrumentos 384 00:24:14,819 --> 00:24:16,299 musicales, implements 385 00:24:16,299 --> 00:24:18,039 comparable 386 00:24:18,039 --> 00:24:20,299 de hecho 387 00:24:20,299 --> 00:24:22,539 es más probable, cuando la clase 388 00:24:22,539 --> 00:24:24,220 se abstracta de esta forma 389 00:24:24,220 --> 00:24:26,380 es más probable que la clase 390 00:24:26,380 --> 00:24:28,039 abstracta no pueda implementar comparable 391 00:24:28,039 --> 00:24:29,460 porque no sabes cómo comparar 392 00:24:29,460 --> 00:24:32,180 por ejemplo, en figura 393 00:24:32,180 --> 00:24:33,920 tú puedes decir, mi comparación es 394 00:24:33,920 --> 00:24:35,579 Dependiendo de los números de lados 395 00:24:35,579 --> 00:24:38,359 Entonces ya la clase abstracta podría implementar 396 00:24:38,359 --> 00:24:38,980 Reconpervo 397 00:24:38,980 --> 00:24:43,759 Vale, entonces ejemplo de aquí 398 00:24:43,759 --> 00:24:46,160 Yo tengo una interfaz animal 399 00:24:46,160 --> 00:24:46,819 ¿Vale? 400 00:24:47,259 --> 00:24:50,559 La interfaz animal no puedo construir objetos de tipo animal 401 00:24:50,559 --> 00:24:52,819 Pero sé que cuando eres un animal 402 00:24:52,819 --> 00:24:54,339 Lo que puedes hacer es hablar 403 00:24:54,339 --> 00:24:56,559 Porque me estáis definiendo aquí 404 00:24:56,559 --> 00:24:58,339 Una public interface animal 405 00:24:58,339 --> 00:24:59,559 Con void habla 406 00:24:59,559 --> 00:25:02,839 ¿Sí? Fijaos que aquí no hay abstract por ningún lado 407 00:25:02,839 --> 00:25:04,400 Pero este es todo abstract 408 00:25:04,400 --> 00:25:07,740 Porque cuando es interfaz, este de aquí es considerado abstracto 409 00:25:07,740 --> 00:25:09,539 Y de hecho, está punto y coma 410 00:25:09,539 --> 00:25:12,119 ¿Sí? Vale 411 00:25:12,119 --> 00:25:16,279 Entonces, luego tengo la public class perro que implementa animal 412 00:25:16,279 --> 00:25:17,000 ¿Vale? 413 00:25:17,500 --> 00:25:20,259 Y entonces estoy forzado a sobreescribir habla 414 00:25:20,259 --> 00:25:21,460 Entonces hace guau 415 00:25:21,460 --> 00:25:24,819 Por otro lado está la clase gato que implementa animal 416 00:25:24,819 --> 00:25:26,500 Y habla hace miau 417 00:25:26,500 --> 00:25:29,019 ¿Están de acuerdo con esto? 418 00:25:29,859 --> 00:25:30,640 Vale, entonces 419 00:25:30,640 --> 00:25:32,299 ¿Cómo? 420 00:25:32,299 --> 00:25:39,299 Dímelo tú, ¿por qué pone implements en vez de extends? 421 00:25:42,140 --> 00:25:43,980 Porque se extenden clases 422 00:25:43,980 --> 00:25:45,539 Se implementan interfaces 423 00:25:45,539 --> 00:25:46,799 ¿Sí? 424 00:25:47,700 --> 00:25:50,119 Entonces, implements es el 425 00:25:50,119 --> 00:25:51,099 Lo dice aquí 426 00:25:51,099 --> 00:25:53,160 Aquí lo hemos dicho antes 427 00:25:53,160 --> 00:25:55,180 No, me he pasado 428 00:25:55,180 --> 00:25:56,500 Por algún lado aquí lo dice 429 00:25:56,500 --> 00:26:00,059 ¿Aquí? Sí, implements 430 00:26:00,059 --> 00:26:04,359 Entonces, esto me está diciendo 431 00:26:04,359 --> 00:26:06,579 Oye, cuidado, perro podría extender otra clase 432 00:26:06,579 --> 00:26:07,799 No está ahora bloqueado 433 00:26:07,799 --> 00:26:13,500 si está implementando animal por lo tanto puede extender otra cosa puede extender es 434 00:26:13,500 --> 00:26:21,059 ser vivos si quiere vale y puede implementar todas las heredar una sola implementar cuántas 435 00:26:21,059 --> 00:26:27,539 interfaces te da la gana 678 lo pondrías aquí implements animal coma no sé qué coma no sé 436 00:26:27,539 --> 00:26:34,900 cuánto entonces el main dentro del main yo puedo crear una referencia de tipo animal fijaos animal 437 00:26:34,900 --> 00:26:36,900 es una interfaz, ¿vale? Es como si estuviera 438 00:26:36,900 --> 00:26:38,680 creando una interfaz, una 439 00:26:38,680 --> 00:26:40,539 referencia a una clase abstracta 440 00:26:40,539 --> 00:26:42,819 donde todos los métodos son abstractos 441 00:26:42,819 --> 00:26:44,819 ¿sí? Pero cuando voy 442 00:26:44,819 --> 00:26:46,700 a hacer la new, no puedo hacer un new 443 00:26:46,700 --> 00:26:48,720 animal, porque la interfaz no se 444 00:26:48,720 --> 00:26:50,079 puede, porque no tendría 445 00:26:50,079 --> 00:26:52,660 las cosas implementadas, entonces dentro de 446 00:26:52,660 --> 00:26:54,819 animal pongo perro y dentro de animal pongo gato 447 00:26:54,819 --> 00:26:56,559 ¿vale? Y ahora puedo hacer 448 00:26:56,559 --> 00:26:58,539 dog.habla y cat.habla 449 00:26:58,539 --> 00:27:00,900 ¿existe habla dentro de animal? 450 00:27:00,900 --> 00:27:02,799 Sí, pero 451 00:27:02,799 --> 00:27:04,779 por polimorfismo, cuando 452 00:27:04,779 --> 00:27:06,940 hago dog.habla, estará 453 00:27:06,940 --> 00:27:08,980 haciendo esto, y cuando 454 00:27:08,980 --> 00:27:10,859 hago cat.habla, como es un 455 00:27:10,859 --> 00:27:12,220 gato, hará esto. 456 00:27:14,640 --> 00:27:16,480 ¿Sí? La misma cosa que 457 00:27:16,480 --> 00:27:19,019 hemos aprendido con las 458 00:27:19,019 --> 00:27:20,519 clases abstractas. 459 00:27:21,220 --> 00:27:21,579 ¿Dudas? 460 00:27:22,680 --> 00:27:24,380 Puedo crear una 461 00:27:24,380 --> 00:27:25,339 array de animales 462 00:27:25,339 --> 00:27:27,420 y luego 463 00:27:27,420 --> 00:27:29,839 poner dentro 464 00:27:29,839 --> 00:27:32,220 estos objetos de aquí, y luego 465 00:27:32,220 --> 00:27:34,319 hacer un método que hablen todos, que lo que 466 00:27:34,319 --> 00:27:36,220 hacen es recorrerme este 467 00:27:36,220 --> 00:27:38,240 Array de animales y decirle 468 00:27:38,240 --> 00:27:38,900 Habla 469 00:27:38,900 --> 00:27:42,299 Fijaos que aquí estoy usando solo animales 470 00:27:42,299 --> 00:27:44,539 Pero sé que 471 00:27:44,539 --> 00:27:45,359 Cualquier 472 00:27:45,359 --> 00:27:48,380 Clase que implemente animal 473 00:27:48,380 --> 00:27:49,140 Puede ir aquí 474 00:27:49,140 --> 00:27:52,720 Y si ahora me creo una clase 475 00:27:52,720 --> 00:27:59,480 Pájaro 476 00:27:59,480 --> 00:28:01,400 Que implementa animal 477 00:28:01,400 --> 00:28:03,119 Y que cuando habla 478 00:28:03,119 --> 00:28:04,380 Dice pío 479 00:28:04,380 --> 00:28:07,680 Las puedo 480 00:28:07,680 --> 00:28:09,380 Poner dentro de este array 481 00:28:09,380 --> 00:28:10,980 Y hacerlo trabajar 482 00:28:10,980 --> 00:28:14,039 Porque es un animal. Esto no cambiaría. 483 00:28:15,819 --> 00:28:19,039 Aquí he creado un método que trabaja sobre animales. 484 00:28:19,880 --> 00:28:23,480 Entonces, me da igual qué animales luego hay adentro. 485 00:28:23,559 --> 00:28:29,259 Yo sé que si eres un animal, si eres de tipo animal porque hay la interfaz animal, 486 00:28:29,880 --> 00:28:36,779 los objetos que andrán aquí dentro tendrán que implementar la clase animal. 487 00:28:36,779 --> 00:28:50,460 Y si implementan la clase animal, tienen que tener el método habla. Y por lo tanto, que sea un gato, un perro, un pájaro o un cocodrilo, pues tendrá su función habla, y yo lo puedo llamar. 488 00:28:53,980 --> 00:29:08,059 Entonces he creado un método muy abstracto que funciona para cualquier animal. A partir de ahora tú estás en tu sistema, puedes añadir los animales que te da la gana, y sin tocar esta clase aquí, yo los hago hablar. 489 00:29:10,740 --> 00:29:16,730 ¿Entiendes? ¿Dudas? Vale. 490 00:29:18,430 --> 00:29:19,869 Ahora, hasta aquí todo claro. 491 00:29:20,690 --> 00:29:27,670 Ahora, existe una forma, en mi experiencia relativamente poco utilizada, 492 00:29:28,309 --> 00:29:32,609 para que una interfaz que tiene todos los métodos abstractos, 493 00:29:33,509 --> 00:29:37,609 tenga algunos métodos implementados. 494 00:29:38,950 --> 00:29:44,009 O sea, una clase normal implementa todos los métodos. 495 00:29:44,069 --> 00:29:54,009 La clase abstracta es un pasito hacia el abstracto diciendo, implemento casi todo, pero dejo algunos métodos para implementar, ¿vale? 496 00:29:54,170 --> 00:30:07,569 La interfaz es el opuesto, todos los métodos son abstractos, pero te da, para tener flexibilidad, la posibilidad de decir, sí, pero un método, ¿vale? 497 00:30:07,569 --> 00:30:14,569 este método de aquí, que es abstracto, que no debería estar, pero te voy a dar una implementación por defecto. 498 00:30:16,289 --> 00:30:27,309 O sea, te voy a dar un consejo, una generalidad, que si luego tú implementas esta interfaz y no quieres implementar esto, 499 00:30:27,309 --> 00:30:49,269 pues es como se hace por defecto, ¿vale? Por ejemplo aquí, por defecto tengo un método corre, ¿vale? Dentro de la interfaz, que lo que hace es decir que el animal corre, no define nada de cómo corre, si corre veloz, corre lento, corre a cuatro patas, corre a dos patas, no lo sé, porque no sé qué animal es, 500 00:30:49,269 --> 00:31:05,670 Pero en general un animal corre, ¿vale? Tendrá que tener corre. Y si tú cuando implementas la interfaz animal no me defines como corre, pues tendrás esta implementación por defecto, la implementación por default. 501 00:31:05,670 --> 00:31:26,730 Y esto, en un cierto sentido, se solapa con las clases abstractas. Pero no os olvidéis, la clase abstracta es una clase y la interfaz es una interfaz. Y la clase abstracta hereda solo uno, o sea, se puede heredar solo uno, mientras la interfaz puede heredar desde donde le dé la gana. 502 00:31:26,730 --> 00:31:46,009 Entonces, sostancialmente aquí hacen un poco lo mismo, pero por un lado lo estoy haciendo con interfaces y por otro lado con clases. Y por lo tanto, es como una forma de decir, oye, mira, se puede hacer, si lo necesitas una vez, lo puedes hacer, si no lo quieres utilizar, no lo utilices. 503 00:31:46,009 --> 00:31:47,269 ¿sí? 504 00:31:48,289 --> 00:31:50,210 como solo usando clase 505 00:31:50,210 --> 00:31:52,289 puede hacer métodos concretos 506 00:31:52,289 --> 00:31:53,930 y abstractos, utilizando 507 00:31:53,930 --> 00:31:55,809 interfaces puede hacer métodos abstractos 508 00:31:55,809 --> 00:31:57,710 que es lo más común y lo más obvio 509 00:31:57,710 --> 00:32:00,109 pero en algunos casos concretos 510 00:32:00,109 --> 00:32:01,930 si me ocurre, pues puedo hacer 511 00:32:01,930 --> 00:32:04,450 un método por defecto, una implementación 512 00:32:04,450 --> 00:32:05,910 por defecto, esto es como decir 513 00:32:05,910 --> 00:32:07,690 corre, lo tienes que implementar 514 00:32:07,690 --> 00:32:10,250 pero si decides que no, esta será la implementación 515 00:32:10,250 --> 00:32:15,609 que usas, yes 516 00:32:15,609 --> 00:32:21,049 tiene que tenerlo todo abstracto 517 00:32:21,049 --> 00:32:22,930 Pero es exactamente el concepto. 518 00:32:25,079 --> 00:32:26,400 No, con todo el método que quieras. 519 00:32:28,160 --> 00:32:29,380 Pero estamos en interfaces. 520 00:32:30,259 --> 00:32:31,980 Es para no pillarse los dedos. 521 00:32:32,619 --> 00:32:35,420 Imagínate que tú tienes una clase que ya hereda de otra 522 00:32:35,420 --> 00:32:38,500 y ahora tiene que heredar de otra clase abstracta. 523 00:32:38,640 --> 00:32:39,880 ¿Lo puedes hacer? 524 00:32:40,380 --> 00:32:40,900 No. 525 00:32:41,880 --> 00:32:42,980 Entonces tendrías un problema. 526 00:32:43,900 --> 00:32:47,660 Pero yo quiero heredar de algo que tenga algunas cosas abstractas 527 00:32:47,660 --> 00:32:49,000 y algunas cosas concretas. 528 00:32:49,240 --> 00:32:51,099 Y no puedo heredar de otra clase. 529 00:32:51,099 --> 00:32:53,220 Pues tengo esta interfaz con los métodos por defecto 530 00:32:53,220 --> 00:32:55,240 Ya está, he encontrado una solución 531 00:32:55,240 --> 00:32:58,799 Tengo que poner, ah, sí 532 00:32:58,799 --> 00:33:01,099 Esto estoy definiendo un método 533 00:33:01,099 --> 00:33:02,779 Por defecto 534 00:33:02,779 --> 00:33:04,819 Una implementación por defecto de corre 535 00:33:04,819 --> 00:33:06,900 Entonces todos los animales 536 00:33:06,900 --> 00:33:07,700 Tendrán corre 537 00:33:07,700 --> 00:33:10,420 Con su implementación por defecto 538 00:33:10,420 --> 00:33:12,740 A menos que tú en emperro 539 00:33:12,740 --> 00:33:15,140 O en gato, por ejemplo 540 00:33:15,140 --> 00:33:16,720 Sobrescribas 541 00:33:16,720 --> 00:33:17,819 Corre 542 00:33:17,819 --> 00:33:20,779 Entonces en este caso se utilizaría la tuya 543 00:33:21,099 --> 00:33:25,480 Porque la soy escrita por polimorfismo, usaría esta. 544 00:33:25,599 --> 00:33:30,339 Pero perro que implementa animal, entonces necesita que haya habla y corre. 545 00:33:30,720 --> 00:33:34,660 Háblalo tiene que implementar sí o sí, porque es abstracto y si no daría error. 546 00:33:35,099 --> 00:33:39,640 Corre decidido no implementarlo y por lo tanto uso la implementación por defecto. 547 00:33:40,539 --> 00:33:42,720 Es muy parecido a lo que es la clase abstracta. 548 00:33:42,880 --> 00:33:45,460 Pero no estamos hablando de clases, aquí estamos en el mundo de las interfaces. 549 00:34:00,170 --> 00:34:00,650 Principalmente. 550 00:34:00,650 --> 00:34:03,529 es un contrato 551 00:34:03,529 --> 00:34:05,009 es 552 00:34:05,009 --> 00:34:06,150 oye mira 553 00:34:06,150 --> 00:34:08,110 haz lo que te da la gana 554 00:34:08,110 --> 00:34:11,090 pero yo te digo que tu objeto 555 00:34:11,090 --> 00:34:13,309 tiene que hacer estas cosas 556 00:34:13,309 --> 00:34:14,769 y te puedo decir 557 00:34:14,769 --> 00:34:17,170 tiene que hablar, correr, comer 558 00:34:17,170 --> 00:34:18,289 y saltar 559 00:34:18,289 --> 00:34:20,909 pues tú cuando implementes mi interfaz 560 00:34:20,909 --> 00:34:22,670 esto lo tiene que hacer, es un contrato 561 00:34:22,670 --> 00:34:23,429 si no, no funciona 562 00:34:23,429 --> 00:34:25,449 pero te puedo decir 563 00:34:25,449 --> 00:34:27,530 oye mira, tiene que hablar, correr 564 00:34:27,530 --> 00:34:29,869 y saltar 565 00:34:29,869 --> 00:34:39,650 pero correr te voy a dar yo una implementación por defecto que si tú no quieres implementarla 566 00:34:39,650 --> 00:34:46,929 es así pero si tiene sentido que en tu propio animal pues haga una cosa un poquito distinta 567 00:34:46,929 --> 00:34:54,989 pues entonces modifica me la tú lo puedes hacer pero si no lo haces ya lo tienes como un contrato 568 00:34:54,989 --> 00:35:04,949 pero opcional vale las que son así sin por defecto son vinculantes obligatorias esa la 569 00:35:04,949 --> 00:35:10,650 tiene que hacer la que te dado ya yo una vía de salida es opcional la puedes sobreescribir 1 570 00:35:13,590 --> 00:35:22,570 de acuerdo mal y por eso ahora la pregunta obvia es si vale muy bien muy bonita la casa 571 00:35:22,570 --> 00:35:26,570 abstracta, muy bonita las interfaces, pero ¿qué diferencia hay cuando uso 572 00:35:26,570 --> 00:35:30,389 una clase abstracta cuando uso una interfaz? Entonces aquí 573 00:35:30,389 --> 00:35:34,690 tenemos una comparativa de cosas entre 574 00:35:34,690 --> 00:35:38,570 clase abstracta e interfaz, que a lo mejor no son tan 575 00:35:38,570 --> 00:35:42,429 obvias al principio porque parecen mucho la misma cosa, pero 576 00:35:42,429 --> 00:35:46,610 la primera en absoluto es esta cosa de que yo puedo heredar solo de una clase 577 00:35:46,610 --> 00:35:50,190 pero puedo implementar cuantas interfaces me da la gana y por lo tanto ya 578 00:35:50,190 --> 00:35:56,829 Ya es suficiente como distinción para que existan las dos cosas, ¿vale? 579 00:35:56,869 --> 00:35:58,230 Pero vamos a ver otras cosillas. 580 00:35:59,849 --> 00:36:02,650 Si diferencian en propósito, ¿vale? 581 00:36:03,610 --> 00:36:10,690 Una clase abstracta se utiliza para proporcionar una estructura básica para una jerarquía de clases, 582 00:36:11,329 --> 00:36:17,389 mientras que una interfaz se utiliza para definir un contrato que debe cumplirse por una clase que implementa la interfaz. 583 00:36:17,389 --> 00:36:27,590 O sea, cuando yo hago una clase abstracta y implemento esa clase abstracta, la estoy metiendo en mi jerarquía de herencia. 584 00:36:28,489 --> 00:36:31,250 Es un anillo de mi jerarquía de herencia. 585 00:36:31,730 --> 00:36:36,650 La interfaz no tiene nada que ver con mi herencia. 586 00:36:37,429 --> 00:36:38,110 ¿En qué sentido? 587 00:36:38,789 --> 00:36:46,210 Yo puedo tener aquí mis instrumentos musicales y cosas por el estilo y puedo hacer que algunos de estos instrumentos musicales sean comparables. 588 00:36:47,389 --> 00:36:50,690 Aquellos que quiero que sean comparables, implementarán la interfaz comparable. 589 00:36:51,190 --> 00:36:54,730 Los que no tiene sentido que sean comparables, no la implementarán. 590 00:36:55,849 --> 00:36:58,630 Pero eso es fuera de la estructura. 591 00:36:58,630 --> 00:37:04,909 La estructura comparable no entra dentro de la jerarquía de herencia. 592 00:37:05,829 --> 00:37:07,670 Es fuera, es otra cosa. 593 00:37:08,889 --> 00:37:14,090 Entonces, la herencia me define la estructura de mis elementos, 594 00:37:14,250 --> 00:37:16,590 mis entidades dentro de mi programa. 595 00:37:16,590 --> 00:37:39,829 Entonces tengo persona, de persona heredada empleado, empleado tiene gerente, y de persona también alumno, y de empleado también profesor, qué sé yo. Y tengo mi estructura. Y luego, aparte, tendré mis, algunas de estas tendrán algunas interfaces, algunas de estas no, pero no son dentro de esta estructura jerárquica. 596 00:37:39,829 --> 00:37:42,409 ¿Sí? Cosa separada. 597 00:37:43,849 --> 00:37:45,010 Implementación de métodos. 598 00:37:45,269 --> 00:37:49,829 Una clase abstracta puede proporcionar una implementación para alguno de sus métodos, 599 00:37:49,909 --> 00:37:54,230 mientras que la clase que la hereda anda debe implementar los métodos restantes. 600 00:37:54,409 --> 00:37:58,869 Por otro lado, en una interfaz los métodos son solo declaraciones y no tienen una implementación, 601 00:37:59,230 --> 00:38:00,730 a menos que no sean métodos default. 602 00:38:00,949 --> 00:38:03,570 Esto es un poco tirar por los pelos. 603 00:38:03,570 --> 00:38:09,070 Pero en general, una clase abstracta es una mezcla de abstracto y concreto, 604 00:38:09,070 --> 00:38:11,230 una interfaz debería tender 605 00:38:11,230 --> 00:38:13,110 al más abstracto posible 606 00:38:13,110 --> 00:38:17,769 herencia 607 00:38:17,769 --> 00:38:20,429 una clase puede extender 608 00:38:20,429 --> 00:38:22,469 solo una clase abstracta mientras puedes hacer 609 00:38:22,469 --> 00:38:24,510 múltiples interfaces, esto es lo que 610 00:38:24,510 --> 00:38:26,389 hemos dicho al principio que es una de las cosas 611 00:38:26,389 --> 00:38:28,010 más importantes, puedo 612 00:38:28,010 --> 00:38:29,889 implementar cuantas interfaces quiero 613 00:38:29,889 --> 00:38:31,570 extender una sola clase 614 00:38:31,570 --> 00:38:34,489 y luego variables, esta es una cosa que no os he dicho 615 00:38:34,489 --> 00:38:36,329 pero está por allí, dentro de una clase 616 00:38:36,329 --> 00:38:38,250 abstracta yo puedo poner 617 00:38:38,250 --> 00:38:40,070 variables 618 00:38:40,070 --> 00:38:43,010 variables estáticas y no estáticas. 619 00:38:43,449 --> 00:38:46,690 O sea, yo podía hacer dentro de figura número lados, 620 00:38:47,130 --> 00:38:49,170 y luego número lados pertenece al objeto, 621 00:38:49,670 --> 00:38:56,190 y cuando creo cuadrado, él tiene el campo número lados propio de ese objeto, 622 00:38:56,349 --> 00:38:58,670 porque es un atributo del objeto, no de la clase. 623 00:38:59,070 --> 00:39:01,349 Es no estático, no es estático. 624 00:39:02,449 --> 00:39:02,590 ¿Sí? 625 00:39:02,590 --> 00:39:09,590 Sin embargo, en una interfaz no puedo poner variables no estáticas. 626 00:39:11,150 --> 00:39:17,590 En una interfaz estoy forzado a poner o variables estáticas o finales, o sea, constantes. 627 00:39:19,170 --> 00:39:23,610 En una interfaz no puede tener una variable del objeto. 628 00:39:25,570 --> 00:39:27,690 Esto es una diferencia bastante importante. 629 00:39:27,690 --> 00:39:30,550 si yo cuando creo, estoy pensando así 630 00:39:30,550 --> 00:39:32,769 en hacer algo abstracto, que tenga métodos abstractos 631 00:39:32,769 --> 00:39:35,010 y necesito ponerle un valor 632 00:39:35,010 --> 00:39:36,449 a este objeto 633 00:39:36,449 --> 00:39:38,530 que esté allí y que luego hereden 634 00:39:38,530 --> 00:39:40,750 todos sus objetos, no puedo utilizar 635 00:39:40,750 --> 00:39:42,750 una interfaz, tengo que utilizar una clase abstracta 636 00:39:44,289 --> 00:39:49,230 y luego están cosas 637 00:39:49,230 --> 00:39:51,090 malvadas 638 00:39:51,090 --> 00:39:54,710 y muy muy muy complejas 639 00:39:54,710 --> 00:39:57,969 ¿Cómo son las interfaces funcionales? 640 00:40:00,010 --> 00:40:02,929 Interfaz funcional es un monstruo de este tipo 641 00:40:02,929 --> 00:40:07,030 Que me dice que hay ejecutar 642 00:40:07,030 --> 00:40:11,809 Que hay una interfaz operación que tiene el método ejecutar 643 00:40:11,809 --> 00:40:16,230 Y yo lo que hago es que cuando hago una operación como por ejemplo suma 644 00:40:16,230 --> 00:40:22,269 Le paso aquí la definición de este ejecutar 645 00:40:22,269 --> 00:40:29,349 Y entonces, luego, cuando uso suma, hago suma, ¿dónde está? 646 00:40:29,849 --> 00:40:38,230 Suma punto ejecutar tres cinco, ejecutar tres cinco, aquí le he pasado la definición de qué tiene que hacer. 647 00:40:39,769 --> 00:40:44,949 Es decir, que no le estoy pasando un valor, me lo estoy pasando una función. 648 00:40:46,449 --> 00:40:48,570 Y esto gracias a mi amigo lambda cálculo. 649 00:40:55,300 --> 00:40:55,820 No. 650 00:40:59,210 --> 00:41:01,789 Es como si tú tuvieras un math.hazalgo 651 00:41:01,789 --> 00:41:04,849 y antes de utilizar el math.hazalgo 652 00:41:04,849 --> 00:41:06,329 le definas qué tiene que hacer. 653 00:41:07,750 --> 00:41:11,130 Le dices, recibirás dos parámetros, a y b, 654 00:41:11,449 --> 00:41:12,670 y lo que tienes que devolver, 655 00:41:12,849 --> 00:41:16,050 y aquí te haces tú el cálculo para calcular la potencia. 656 00:41:16,050 --> 00:41:18,329 Entonces te calcula la potencia cuando dices haz algo. 657 00:41:18,650 --> 00:41:20,389 Si en vez le defines la suma, 658 00:41:20,489 --> 00:41:22,210 cuando dice haz algo, pues te hará la suma. 659 00:41:22,269 --> 00:41:25,489 Si le pasas como definición. 660 00:41:25,489 --> 00:41:28,150 la función que tú quieras 661 00:41:28,150 --> 00:41:30,110 él en automático hará esa cosa 662 00:41:30,110 --> 00:41:32,369 pero son cosas 663 00:41:32,369 --> 00:41:33,230 complejas 664 00:41:33,230 --> 00:41:35,230 existen 665 00:41:35,230 --> 00:41:37,989 y si usáis chat GPT 666 00:41:37,989 --> 00:41:40,230 lo veis esta cosa aquí, la flecha 667 00:41:40,230 --> 00:41:42,130 cuando veis la flecha, tremblad 668 00:41:42,130 --> 00:41:48,500 ¿os acordáis al principio de clase 669 00:41:48,500 --> 00:41:49,780 de este curso 670 00:41:49,780 --> 00:41:51,739 cuando todavía erais pequeños 671 00:41:51,739 --> 00:41:54,800 y yo os hablaba 672 00:41:54,800 --> 00:41:56,500 de distintos 673 00:41:56,500 --> 00:41:58,159 tipos de lenguajes 674 00:41:58,159 --> 00:41:59,840 yo os decía que hay los lenguajes 675 00:41:59,840 --> 00:42:02,300 imperativos y nosotros vamos a trabajar 676 00:42:02,300 --> 00:42:04,340 con lenguajes imperativos y luego hay los 677 00:42:04,340 --> 00:42:06,400 lenguajes funcionales 678 00:42:06,400 --> 00:42:08,400 y los lenguajes lógicos 679 00:42:08,400 --> 00:42:09,679 ¿sí? 680 00:42:10,420 --> 00:42:11,800 como Prolog, Lisp 681 00:42:11,800 --> 00:42:15,690 pues esto 682 00:42:15,690 --> 00:42:17,210 es 683 00:42:17,210 --> 00:42:20,110 intento de hacer en Java 684 00:42:20,110 --> 00:42:21,550 que es imperativo 685 00:42:21,550 --> 00:42:24,090 cosas de lenguaje 686 00:42:24,090 --> 00:42:24,769 funcional 687 00:42:24,769 --> 00:42:34,489 Como los lenguajes funcionales algún tipo de problema lo solucionan mucho más rápidamente 688 00:42:34,489 --> 00:42:37,429 Mucho más eficientemente que la programación imperativa 689 00:42:37,429 --> 00:42:41,090 Pues lo que ha hecho Java en las últimas versiones 690 00:42:41,090 --> 00:42:47,730 Es introducir una posibilidad de usar un pseudo lenguaje funcional 691 00:42:47,730 --> 00:42:51,710 Dentro del marco del lenguaje imperativo que es Java 692 00:42:51,710 --> 00:42:58,989 En lenguaje funcional se basa sobre el concepto que tú puedes pasar como parámetros funciones 693 00:42:58,989 --> 00:43:16,369 Porque esto de aquí son directivas al precompilador 694 00:43:16,369 --> 00:43:20,489 Para que el precompilador sabe que esta no es una interfaz normal 695 00:43:20,489 --> 00:43:24,190 Es una interfaz que da dolor de cabeza a los estudiantes 696 00:43:24,190 --> 00:43:31,639 Y esto es todo lo que veremos de la interfaz funcional 697 00:43:31,639 --> 00:43:34,400 Claramente caerá en el examen porque somos malvados 698 00:43:34,400 --> 00:43:37,360 dudas