Saltar navegación

Interfaces - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 31 de enero de 2023 por Stefano C.

16 visualizaciones

Descargar la transcripción

Estoy grabando, por lo tanto, si habláis me dais autorización a que se grabe vuestra voz. 00:00:00
Hoy vamos a ver un poquito más del tema de... 00:00:09
Hemos estado repasando, hemos visto las clases astratas, el concepto de polimorfismo, 00:00:13
y ahora vamos hacia otra pieza del puzzle, que son las interfaces. 00:00:19
El discurso es que hasta ahora, cuando hemos hablado de clases astratas, 00:00:25
La clase abstracta es una mezcla entre cosas concretas, ¿vale? 00:00:29
Métodos concretos que yo implemento y otros métodos que no puedo implementar 00:00:35
porque todavía estoy a un nivel demasiado genérico y por lo tanto lo dejo abstracto 00:00:41
y alguien que extenderá esta clase podrá implementarla, ¿vale? 00:00:48
Si llevamos esta cosa al extremo 00:00:53
¿Vale? 00:00:57
Es decir, si tengo una clase 00:00:58
Astrata 00:01:00
Que no tiene nada concreto 00:01:01
Que solo tiene métodos abstractos 00:01:03
Pues ese señor 00:01:06
Es un interfaz 00:01:07
¿Vale? 00:01:09
Entonces, un interfaz al fin y al cabo 00:01:10
Es como una clase abstracta 00:01:12
Donde, pero es talmente abstracta 00:01:13
Que yo no puedo concretar nada 00:01:16
Ni siquiera variable 00:01:18
Ahora veremos luego las variables 00:01:19
Que puedo concretar 00:01:20
Entonces llega un momento en que digo, vale, todos los métodos aquí que estoy declarando son abstractos 00:01:21
Al punto que, a este punto, no me compensa poner abstracto en todos los métodos 00:01:26
Asumo que son todos abstractos, ¿vale? 00:01:31
Entonces, en vez de declarar una clase, declaro una interfaz 00:01:33
Si yo declaro una interfaz, todos los métodos que declararé ahora mismo, que veremos 00:01:37
Pues, sustancialmente, serán prototipos de métodos y serán considerados todos abstractos 00:01:42
No se le pone el cuerpo del método 00:01:48
Una clase lo que podrá hacer es implementar una interfaz 00:01:52
Cuidado, las interfaces no se extenden 00:02:00
Se pueden extender para hacer otras interfaces 00:02:03
O sea, interfaces entre ellos se pueden extender 00:02:05
Pero el concepto es que si creo una clase 00:02:07
Que va a implementar los métodos de esta interfaz 00:02:10
No la extendo la interfaz, la implemento 00:02:14
Tengo una palabra clave que ahora veremos que es implement 00:02:18
La cosa interesante de Java es que tú puedes extender una sola clase 00:02:21
Pero puedes implementar todas las interfaces que quieres 00:02:28
Es un poco, digamos así, una forma de crear en Java una herencia múltiple 00:02:32
Es la forma de cómo en Java podría hacer una herencia múltiple 00:02:44
Hemos dicho que en Java podría dar una sola clase 00:02:51
Por lo tanto, si en un determinado momento debería importar varios conceptos distintos dentro de la misma clase 00:02:54
Lo que puede hacer es extender una clase e importar varias interfaces 00:03:01
Esto es un poquito en general para entender qué es la interfaz 00:03:07
Vamos a ver qué dice 00:03:12
Es un concepto similar a la clase astrata 00:03:13
¿Vale? 00:03:16
Es un molde que define 00:03:16
Una estructura formal de métodos 00:03:19
Para una clase 00:03:22
¿Vale? Es decir, me está diciendo 00:03:23
Mira, esta... 00:03:24
Si tú implementas esta interfaz 00:03:27
Quiere decir que tu clase 00:03:29
Necesariamente tiene que tener 00:03:30
Este método, este método, este método 00:03:33
¿Vale? 00:03:34
Que devuelva esto, que pille este parámetro 00:03:36
Que se llame así, etc, etc 00:03:38
Es un contrato 00:03:40
Que yo hago contigo 00:03:42
Diciendo en el momento en que implementas 00:03:44
Mi interfaz 00:03:46
Esta interfaz aquí concreta 00:03:49
Yo sé que tu clase tendrá este método 00:03:50
Y por lo tanto hasta si 00:03:53
Yo no sé como está implementado 00:03:54
Esto lo implementarás tú 00:03:56
Dependiendo de tus casos específicos 00:03:58
Pero yo podré utilizar 00:04:00
Tú has creado el método 00:04:01
Dentro de 00:04:05
Dentro de una interfaz 00:04:07
Yo no sé como está implementado 00:04:10
Pero sé que si tu clase 00:04:12
Implementa esta interfaz 00:04:14
Yo puedo llamar sobre tus objetos 00:04:15
Método X 00:04:17
Y que devolverá lo que te he dicho 00:04:18
Que devuelva 00:04:22
Claramente la idea es que el contrato 00:04:23
También explique 00:04:26
Que tiene que hacer este método 00:04:27
¿Vale? Entonces normalmente 00:04:29
Va asociado la interfaz 00:04:31
Con sus varios métodos 00:04:33
Que tiene que implementar y cada método 00:04:35
Una descripción de lo que se espera de este método 00:04:37
¿Vale? Haremos un ejemplo concreto 00:04:39
Con la interfaz comparable 00:04:41
Dentro de un rato 00:04:44
¿Sí? 00:04:45
Sirven para presentar un mecanismo 00:04:48
Similar a la herencia múltiple 00:04:50
De otros objetos 00:04:51
De lenguajes orientados a objetos 00:04:52
T++, por ejemplo 00:04:54
Que es otro lenguaje orientado a objetos 00:04:56
Sí que admite herencia múltiple 00:04:59
Puedes hacer una extend, entre comillas 00:05:01
De varias clases 00:05:03
Ellos lo permiten 00:05:04
Se parecen a clases abstractas 00:05:08
Pero la diferencia es que 00:05:10
sus métodos son obligatoriamente 00:05:12
abstractos, o sea, no puede 00:05:14
hacer métodos concretos, en realidad 00:05:16
sí, ahora lo veremos, pero 00:05:18
los métodos por defecto de una interfaz 00:05:19
se consideran 00:05:22
abstractos, y por lo tanto 00:05:23
no voy a escribir abstracto por 00:05:26
todo lado, porque sé que si lo 00:05:28
declaro así normalmente, pues 00:05:30
ese es abstracto 00:05:32
¿no? 00:05:35
En Java, en vez de utilizar 00:05:38
class para crear una interfaz 00:05:40
Utilizo la palabra interface 00:05:42
Si habéis notado 00:05:44
Si os habéis parado alguna vez a mirar 00:05:45
Cuando en Eclipse pinchamos botón derecho 00:05:47
Y normalmente elegimos 00:05:49
O project, o package, o class 00:05:51
Lo que hemos utilizado hasta ahora 00:05:54
Pues también da la opción 00:05:56
Interface 00:05:57
En ese caso si pincháis allí 00:05:59
En vez de salir un public class no se que 00:06:01
Os saldrá un public interface 00:06:04
No se que 00:06:06
Y para 00:06:08
Para enlazar una clase con otra, o con una interfaz, en vez de decir que la clase extiende la otra clase, que es lo que se usa para la herencia, se dice que la clase implements esa interfaz. 00:06:11
Y lo que hemos dicho es que se puede extender una sola, se puede implementar varias. 00:06:29
Se pueden declarar referencias a objetos cuyo tipo sea una interfaz. 00:06:36
¿Vale? En lugar de una clase 00:06:40
O sea que si yo tengo la interfaz 00:06:41
Comparable 00:06:44
¿Vale? Comparable 00:06:52
¿Vale? Yo puedo crear 00:06:53
Una 00:06:56
Una variable 00:06:56
Comparable, para hacer comparable 00:06:59
X es igual a new 00:07:01
Algo, este 00:07:04
New algo que hago, esta nueva clase 00:07:05
Que estoy creando, esta instancia 00:07:08
Tendrá que ser una instancia que 00:07:09
Implementa comparable 00:07:11
Si no, no lo puedo hacer 00:07:13
Entonces si yo tengo 00:07:14
Las clases A, B y C 00:07:17
Y las tres clases 00:07:19
Implementan comparables 00:07:21
La clase A, B y C 00:07:22
Y las tres implementan comparables 00:07:24
Yo puedo crear tranquilamente un comparable 00:07:26
X es igual a 00:07:29
New A 00:07:31
Por ejemplo 00:07:33
Porque como A implementa comparables 00:07:33
Pues lo puedo hacer 00:07:36
Es parecido al concepto 00:07:37
Que hemos visto de 00:07:40
Upcasting en 00:07:41
En las clases abstractas 00:07:43
Si yo esta la pienso como una clase abstracta 00:07:47
Pues esto es una cosa 00:07:49
Que se podría hacer 00:07:51
O sea, puedo crear un nuevo A 00:07:53
Que extienda comparables 00:07:55
Y puede comparar el poder abstracto 00:07:57
Como hemos dicho que esto de la interfaz 00:07:58
Es como un paso más hacia la abstracción 00:08:00
Con respecto a la clase abstracta 00:08:03
La clase abstracta puede tener todavía 00:08:05
Algunos métodos implementados 00:08:06
Mientras esta no 00:08:08
El concepto es el mismo 00:08:09
¿Sí? ¿Dudas? 00:08:13
00:08:16
Yo puedo hacer que A extenda de animal 00:08:16
Y implemente con parámetros 00:08:25
Su función principal 00:08:28
Es establecer 00:08:35
Y estabilizar 00:08:36
¿Qué quiere decir? 00:08:39
Las interfaces por tipo de métodos 00:08:39
¿Vale? 00:08:42
Es que una clase puede ser de la realidad 00:08:44
Y así coordinar varios equipos de trabajo 00:08:45
¿Para qué sirve una interfaz de verdad? 00:08:47
La idea es que cuando yo tengo un proyecto relativamente complejo 00:08:52
Necesito de alguna forma organizar los varios equipos de trabajo 00:08:56
Que están trabajando sobre el sistema 00:09:00
Es muy ineficiente pillar un grupo de trabajadores 00:09:02
De 50 trabajadores y decir 00:09:06
Vosotros desarrolláis todos, ahí va, todos juntos, venga 00:09:08
Necesito repartir estos trabajadores en varios módulos 00:09:11
De mi sistema 00:09:16
Y que cada uno de estos trabajadores 00:09:18
Se ocupe de desarrollar ese módulo en concreto 00:09:20
El problema surge 00:09:22
Cuando estos módulos tienen que comunicar entre ellos 00:09:24
Y yo tengo que utilizar 00:09:27
Objetos que están siendo desarrollados 00:09:28
Por otro equipo 00:09:31
¿Vale? 00:09:32
Para estar seguro de que puede 00:09:33
Mi equipo 00:09:36
Utilizar sobre los otros 00:09:38
Objetos, lo que puedo utilizar 00:09:40
Es una interfaz 00:09:42
Yo no te estoy diciendo como se hará 00:09:43
estas cosas. Te estoy diciendo 00:09:46
que un objeto que implemente 00:09:48
esta interfaz, seguramente 00:09:51
tendrá el método calcular 00:09:52
y calcular perímetro. 00:09:54
Entonces, tú puedes 00:09:57
crear los objetos que quieras 00:09:58
de este tipo, de tipo comparable, 00:10:00
utilizar métodos que 00:10:03
llamen, que pillen como parámetro 00:10:04
un objeto comparable 00:10:07
y tú sabes que sobre el método 00:10:08
comparable, sobre el objeto comparable, 00:10:10
podrás llamar calcular 00:10:12
y calcular perímetro. 00:10:14
¿Cómo está hecho? No lo sé 00:10:16
Lo implementará el otro equipo 00:10:18
Pero yo estoy seguro 00:10:21
Que puedo llamar esta lista 00:10:22
De métodos 00:10:24
Y sé que hace cada uno de estos métodos 00:10:25
Porque la interfaz me lo explica 00:10:28
Cuando tú usas estos métodos 00:10:30
Le pasarás este parámetro 00:10:32
Y obtendrás de vuelta este valor 00:10:34
Calculado o no se sabe cómo 00:10:36
Eso lo implementarán ellos 00:10:38
A lo mejor para calcularlo tengo que acceder a una base de datos 00:10:39
Acceder a un fichero, mezclar la base de datos 00:10:42
El fichero 00:10:44
Ir a hacer una conexión con otro servidor 00:10:45
No lo sé, no me interesa 00:10:48
Yo sé solo que si amo este método 00:10:49
Me resuelve lo que tiene que resolver 00:10:51
Esto tiene una potencia tremenda 00:10:53
A la hora de modulizar mi sistema 00:10:59
Yo tengo que poner de acuerdo 00:11:01
Los varios grupos de trabajo 00:11:04
Sobre lo que es la interfaz 00:11:06
Donde son los puntos, digamos, de contacto 00:11:08
Entre un módulo y otro 00:11:11
Entre unas clases y otras 00:11:13
Y explicarles 00:11:15
Qué pueden hacer con estos objetos 00:11:17
Luego ellos 00:11:19
Lo llamarán sin problemas 00:11:20
¿Vale? Cuando luego todo será 00:11:22
Organizado y será creado 00:11:25
Pues entonces yo al llamar 00:11:27
Los métodos, en vez de llamarlos 00:11:29
Pasándole un objeto comparable 00:11:31
Que no existe el objeto comparable porque es una interfaz 00:11:33
Le pasaré uno de los objetos 00:11:35
Que implementan comparable 00:11:37
Y en automático ello funcionará 00:11:39
No sé si 00:11:41
Luego hacemos ejemplos 00:11:42
Pero por ahora 00:11:45
Si os interesa 00:11:47
¿Vale? 00:11:49
El equipo que debe utilizar objetos 00:11:52
Este es más o menos la explicación de lo que acabo de decir ahora 00:11:54
Que implemente dicha interfaz 00:11:56
Basta con que declare en su código 00:11:58
Una referencia a dicha interfaz 00:12:00
Si yo tengo esta interfaz 00:12:01
No necesito crear un objeto 00:12:03
Que implemente esa interfaz 00:12:05
Sino que declaro una referencia 00:12:08
A esa interfaz 00:12:10
Ante la interfaz, como por ejemplo comparableX 00:12:11
¿Vale? 00:12:14
Y en automático puedo llamar sobre X 00:12:15
Todos los métodos de la interfaz 00:12:17
¿Dónde estará su implementación? 00:12:18
Pues su implementación dependerá que luego 00:12:21
Cuando yo asocio esta referencia 00:12:23
A un objeto que implementa 00:12:25
Esa interfaz 00:12:27
Tendrá un 00:12:28
El método 00:12:30
Especificado e implementado 00:12:32
Y por polimorfismo, cuando yo llamo 00:12:35
Este método, no se llamará sobre la interfaz 00:12:37
Que no existe, sino se llamará 00:12:39
sobre la instancia, que será 00:12:41
un objeto que sí tiene 00:12:43
implementado ese método. Entonces 00:12:45
funcionará. Es más de 00:12:47
lo mismo de lo que hemos visto con las clases abstractas. 00:12:49
¿Vale? Utilizando el 00:12:52
polimorfismo, esto funciona. 00:12:53
Si no hubiese polimorfismo, tendríamos 00:12:55
un problema. Los equipos 00:12:57
que creen clases que 00:12:59
implementen dicha interfaz 00:13:01
están a su vez desacoplados 00:13:03
de los equipos que lo utilizan. ¿Vale? 00:13:05
Esto es un concepto 00:13:07
de desacoplar el trabajo. O sea, 00:13:09
separar, individualizar 00:13:11
e independizar en un cierto sentido 00:13:13
el trabajo de un equipo 00:13:15
de trabajo y de otro 00:13:17
la ventaja de poner una interfaz 00:13:18
en el medio es que por un lado 00:13:21
puedo trabajar la implementación de esa 00:13:23
interfaz y eso es un equipo de trabajo 00:13:25
y por otro lado ya utilizar 00:13:27
esa interfaz sin necesidad de tener 00:13:29
una implementación 00:13:31
real 00:13:33
que me proporcionará más adelante 00:13:33
¿se entiende? 00:13:37
La idea es que podría haber un caso específico o casos específicos 00:13:39
En que el equipo A, que es el que implementa la interfaz, está haciendo su trabajo 00:13:46
Y que haya un equipo B que quiere utilizar esa interfaz 00:13:53
Y por lo tanto está utilizando Comparable en general y está utilizando sus métodos 00:13:58
Pero este equipo B necesita realmente un objeto para poder funcionar 00:14:03
¿Vale? Porque algunos de los métodos no se basan solo sobre comparable, sino que tienen que llamarlos estos métodos y funcionar. 00:14:09
¿Vale? Entonces, en casos como estos, Java proporciona los objetos mock, que nosotros por ahora no veremos, a lo mejor lo veremos más adelante, pero que os suelen como concepto. 00:14:19
Un objeto mock es un objeto falso 00:14:31
Es un objeto que no es verdad 00:14:35
No es un objeto real que luego voy a utilizar 00:14:38
Es un objeto falso que implementa en un cierto sentido 00:14:42
La interfaz 00:14:47
Pero me devuelve por ejemplo valores fijos 00:14:52
O valores muy sencillos 00:14:55
En vez de estar haciendo el acceso a la base de datos 00:14:57
el acceso al fichero 00:14:59
que decíamos antes, combinarlos y cosas por estilo 00:15:01
que no tengo todavía listo 00:15:04
porque todavía en eso está 00:15:05
trabajando el otro equipo de desarrollo 00:15:07
pues hago que 00:15:09
si tú llamas este método te devuelvo 3 00:15:11
y ya está 00:15:13
claramente cada vez que lo utilizaré 00:15:16
recibiré 3 00:15:18
pero recibiré un posible 00:15:19
valor real 00:15:22
de esa 00:15:23
interfaz 00:15:26
de ese método 00:15:27
Entonces es un poquito más complejo que esto 00:15:28
Pero a esta altura 00:15:32
Tampoco tiene mucho sentido 00:15:34
Meter ese tipo de complejidad 00:15:35
Porque por ahora esto no lo vamos a utilizar nosotros 00:15:37
Esto simplemente para que os suene 00:15:39
El concepto de mock object 00:15:41
Que en un futuro 00:15:43
Estáis trabajando y alguien dice 00:15:44
Que aquí para poder 00:15:46
Hacer el trabajo tenemos que hacer un objeto mock 00:15:48
Y que vosotros no sabáis hacerlo 00:15:51
Pero que sepáis que existe 00:15:53
Y digáis, si me acuerdo de una vez 00:15:55
Un tío que hablaba mal 00:15:57
Me ha comentado algo de eso 00:15:58
¿Vale? 00:16:00
Si tenemos tiempo más adelante 00:16:02
A lo mejor 00:16:04
Ejemplo de interfaz 00:16:05
¿Vale? Por ejemplo 00:16:08
Un ejemplo muy interesante de interfaz 00:16:09
Es la interfaz comparable 00:16:12
¿Vale? Esta interfaz 00:16:14
No la he creado yo 00:16:16
Existe en Java 00:16:17
Si vosotros os vais 00:16:19
Si vosotros os vais a LAPI 00:16:21
Y buscáis comparable 00:16:24
Os sale la interfaz comparable 00:16:25
Que incluye toda la información 00:16:28
Sobre qué es la interfaz comparable 00:16:31
Cómo se utiliza, para qué sirve, etc. 00:16:34
El concepto es que una interfaz comparable 00:16:37
Tiene un método 00:16:39
Este método de aquí 00:16:40
int compareToObjecto 00:16:42
Esto es un método que 00:16:45
Te devuelve un entero 00:16:49
Se llama compareTo 00:16:50
Y recibe otro objeto 00:16:52
Tú lo llamarás sobre un objeto 00:16:54
Y luego le pasas otro objeto como parámetro 00:16:55
Entonces, aquí hay dos objetos en el medio 00:16:59
El objeto que llama este método 00:17:02
Mi objeto actual 00:17:05
Y el objeto que le paso para comparar 00:17:07
Porque claramente comparar tú 00:17:09
Estoy comparando 00:17:11
¿Y qué me dice que tiene que hacer este método? 00:17:12
Este método tiene que devolver un entero 00:17:16
Y este entero tiene que ser 00:17:18
Un número negativo 00:17:19
Por ejemplo, menos uno 00:17:21
Si el objeto dis 00:17:22
El objeto sobre el que le estoy llamando 00:17:26
Es menor 00:17:29
Que este objeto que le he pasado como parámetro 00:17:30
Devuelve cero 00:17:33
Si los dos son iguales 00:17:36
Y devuelve un número positivo 00:17:39
Por ejemplo uno 00:17:42
Si dis 00:17:43
El objeto sobre el que estoy llamando 00:17:45
Es mayor 00:17:47
Que el objeto 00:17:49
En cuanto a tu definición de mayor y menor 00:17:51
Tú tienes el objeto gato 00:17:59
¿Cuándo el objeto gato1 que has creado tú es menor que el objeto gato2? 00:18:02
Lo tienes que definir tú 00:18:11
Oye, pero los gatos no son comparables 00:18:13
Pues entonces no implementas la interfaz comparable 00:18:16
Si tú implementas la interfaz comparable 00:18:19
Implicitamente le estás diciendo que tu clase está adquiriendo una nueva propiedad 00:18:22
En un cierto sentido que es comparable entre objetos de esa clase 00:18:28
Y como son comparables los objetos de otra clase 00:18:34
Tú tendrás que tener en tu mente una idea para poderlo comparar 00:18:38
¿Cómo se comparan dos gatos? 00:18:42
No lo sé 00:18:45
¿Vale? 00:18:46
¿Su edad? 00:18:47
Pues entonces un gato más viejo es mayor que un gato más joven 00:18:48
Vale, fenomenal 00:18:52
Y entonces ahora ya tienes una forma de implementar esto 00:18:53
En tu implementación de Compartoo mirarás el disk que será un gato 00:18:56
¿Cuántos años tiene? 00:19:02
El objeto los downcastarás a un gato siempre y cuando sea un gato 00:19:04
Y mirarás su edad 00:19:10
Y a ese punto devolverás menos uno 00:19:13
si la edad del tuyo es 00:19:16
menor que la edad de O 00:19:18
le devolverás 00:19:19
0 si la edad es la misma 00:19:21
puede ser más complejo 00:19:23
puede ser que un gato sea 00:19:26
mayor si 00:19:27
es más joven 00:19:29
o menor, es más joven y es más pequeño 00:19:31
porque hay también talla 00:19:34
y allí hay varias cosas 00:19:35
tú puedes complicar esta 00:19:37
convertu, cuanto te dé la gana 00:19:39
en la base de cómo 00:19:41
tú ordenas los objetos 00:19:44
¿Y cualquier objeto tiene que ser ordenable? 00:19:45
¿Vale? 00:19:50
Todos los objetos que hemos estado haciendo hasta ahora 00:19:52
No implementaban este comparable 00:19:55
Por lo tanto, ¿cómo los ordenamos? 00:19:57
No lo sé, no tengo ni idea 00:19:59
¿Vale? 00:20:01
Ahora 00:20:02
Si yo quiero implementar este compareTo 00:20:02
Entonces implementar compareable 00:20:06
¿Vale? 00:20:08
Necesito que en mi clase 00:20:10
esté definida 00:20:13
una idea de cómo se ordenan 00:20:15
estos objetos 00:20:18
¿vale? por ejemplo, una persona 00:20:19
pues lo ordeno por su DNI 00:20:22
miro el DNI 00:20:24
y si el DNI pasado a 00:20:25
número es menor 00:20:28
que el otro, pues entonces 00:20:30
declararé que es menor el objeto 00:20:31
y si no es mayor, no lo sé 00:20:34
depende de vosotros y de lo que estáis implementando 00:20:35
¿vale? puede que haya 00:20:38
cosas, si yo estoy haciendo la clase 00:20:40
integer 00:20:42
Que representa interos 00:20:43
Que existe, está en Java 00:20:45
¿Vale? 00:20:47
Y que es un objeto que dentro tiene un int 00:20:48
Y que sustantivamente hace 00:20:50
Como un wrapping 00:20:52
Hace como un 00:20:53
Un vectorio 00:20:57
De el número int 00:20:59
Como primitivo y lo transforma en un objeto 00:21:03
Integer que representa 00:21:05
Ese número 00:21:06
¿Vale? Lo veremos 00:21:08
Bueno, lo hemos usado una vez con integer.parse 00:21:09
Debe sonar 00:21:12
Esa es la clase integer 00:21:14
Que es un objeto que representa un entero 00:21:16
¿Sí? 00:21:19
¿Cómo ordeno los enteros? 00:21:20
Es muy fácil 00:21:22
Miro su valor 00:21:23
Y su valor, si es menor que el otro entero 00:21:25
Pues es menor 00:21:27
Si es mayor, es mayor 00:21:29
Y si son iguales, pues es cero 00:21:31
Ordenar un entero es muy fácil 00:21:33
Ordenar un gato 00:21:36
O ordenar un animal 00:21:38
Puede ser más complejo 00:21:39
Y a lo mejor no tiene sentido 00:21:41
Ordenar un animal 00:21:43
¿Dudas? 00:21:45
Entonces 00:21:50
¿Y por qué debería yo 00:21:50
Molestarme con 00:21:53
La interfaz comparable 00:21:55
¿Cómo se dice? 00:21:58
Implementarla y perder tiempo en crear 00:22:00
Este objeto aquí cuando podría 00:22:03
Tranquilamente crearme mi propio 00:22:05
Comparar gatos 00:22:07
Y ponerla ahí 00:22:09
Porque en el ecosistema de Java, en el API, en todas las clases ya creadas que tenéis vosotros 00:22:10
Hay clases que funcionan sobre objetos Convertible 00:22:18
Es decir, que funcionan sabiendo que sobre los objetos de tipo Convertible pueden llamar el Convertu 00:22:24
Y entonces si tú te haces una clase que implementa Convertible 00:22:33
Automáticamente puedes utilizar todos esos métodos ya creados 00:22:38
Sobre objetos de tu clase 00:22:43
Si en vez tú no la implementas, no 00:22:45
El ejemplo típico que haremos dentro de un rato 00:22:49
El sort 00:22:52
El sort sirve para ordenar 00:22:53
Imaginamos que vosotros tenéis un array de objetos 00:22:57
Y los queréis ordenar 00:23:00
Para ordenarlos necesitáis un orden 00:23:01
Que sean posibles de comparar entre ellos 00:23:06
Si no, puedes comparar como los dos 00:23:10
Entonces, existen métodos ya hechos 00:23:12
Arrays.sort, por ejemplo 00:23:17
Que te pillan un array 00:23:20
Y te devuelven un array 00:23:22
El mismo array ordenado 00:23:23
Pero el objeto que te pillan 00:23:25
Para poder hacer eso 00:23:28
Necesariamente tiene que ser de tipo comparable 00:23:30
Con eso ellos se aseguran 00:23:33
Que para poder funcionar el ordenamiento 00:23:36
Ellos pueden llamar 00:23:39
Dentro el compareTo 00:23:41
Y empezar a comparar los objetos 00:23:42
Que están dentro de esta array 00:23:45
Con el fin de decir 00:23:46
Al final de todo este trabajo 00:23:48
Pues te he ordenado la array 00:23:50
Si no se pueden comparar entre ellos 00:23:51
¿Qué puedo hacer? 00:23:54
¿Me explico? 00:23:58
Es más 00:24:00
Si yo en vez de haber utilizado la interfaz compareMode 00:24:00
Utilizo mi propio método 00:24:03
Comparar gatos 00:24:05
Que nadie conoce 00:24:06
Pues la función sort 00:24:08
Creada ya por otros desarrolladores 00:24:10
No puede 00:24:12
Adivinar que yo he creado 00:24:14
Comparar gatos 00:24:16
No me va a funcionar 00:24:17
Pero lo que puede hacer es decir 00:24:19
Mira, oye, yo me baso sobre una interfaz 00:24:22
Esta interfaz de aquí, comparable 00:24:24
Y sé que si tú implementas 00:24:26
Esta comparable, habrás tenido 00:24:28
Que implementar el compareTo 00:24:30
Que dará 00:24:32
exactamente este tipo de resultados 00:24:34
negativo, cero 00:24:36
o positivo, y yo podré 00:24:38
entender 00:24:40
estos números que me das 00:24:41
para poder ayudarte 00:24:44
a ordenar, independientemente 00:24:46
de cual sea 00:24:48
tu objeto 00:24:50
si tú has hecho el objeto animal que implementas 00:24:52
con parable, yo te lo puedo ordenar 00:24:54
si tú has hecho el objeto vehículo que implementas 00:24:56
con parable, yo te lo puedo ordenar 00:24:59
porque tú al fin y al cabo 00:25:00
Cuando implementas comparable 00:25:02
Lo que me estás dando es un criterio 00:25:04
Para ordenar 00:25:06
Una forma de comparar dos objetos 00:25:07
De tu clase y decir 00:25:10
Cuál viene antes y cuál viene después 00:25:12
Y sobre esta base yo puedo hacer 00:25:14
Ordenación 00:25:16
Este es un ejemplo 00:25:18
Muy importante de cómo funcionan 00:25:21
Las interfaces 00:25:24
Yo he creado toda una serie de métodos 00:25:25
Que se basan sobre el hecho que 00:25:28
Tú me has dado un criterio de comparación 00:25:29
Y yo hago todos mis métodos 00:25:32
Basándome sobre ese criterio 00:25:34
Cualquier método que implemente 00:25:35
Esa interfaz, también podrá utilizar 00:25:38
Todos mis métodos 00:25:40
¿Dudas? 00:25:42
Hay varias interfaces ya existentes 00:25:49
Y algunas de ellas 00:25:52
La iremos viendo, ¿vale? 00:25:53
Por ejemplo, con Parable lo utilizaremos 00:25:55
También está otra que se llama 00:25:57
Serializable 00:25:59
Serializable 00:26:02
¿Vale? 00:26:04
Serializable quiere decir que tú puedes 00:26:05
Pillar un objeto y trocearlos 00:26:07
En byte 00:26:10
Y mandarlo byte a byte 00:26:11
La cosa interesante de eso 00:26:14
Es que luego puedes guardar objetos 00:26:16
En un fichero 00:26:18
O mandar objetos 00:26:19
En internet 00:26:21
A otro ordenador 00:26:23
¿Vale? 00:26:25
Si la clase que tú haces implementa 00:26:27
Serializable, entonces yo le enseño 00:26:29
Cómo se puede 00:26:32
Trocear a byte 00:26:34
Mi objeto 00:26:35
Pues entonces automáticamente 00:26:37
Aquí te da la posibilidad de ser guardado en un fichero 00:26:39
No los carácteres 00:26:42
El objeto 00:26:45
No sé si entendéis la diferencia 00:26:46
Que luego puede llegar otro programa 00:26:47
Y pillarse el objeto 00:26:49
No los carácteres que representa 00:26:52
O no el gasto 00:26:54
El objeto que tú has guardado 00:26:56
Si tu clase es serializable 00:26:57
Es decir que luego tú podrás utilizar 00:27:05
El método que sea 00:27:07
Para poder escribir un fichero y leerlo 00:27:08
Pero el objeto es serializable 00:27:10
Es la misma clase 00:27:12
Si tienes un gato serializable 00:27:13
Y guardas el gato 00:27:15
Pues para sacarlo tendrás que tener la misma clase 00:27:17
Y decir, oye mira saco un objeto de esta clase 00:27:19
¿Vale? 00:27:22
Aún así, esto es cosas avanzadas 00:27:23
Las veremos cuando veremos persistencia de objetos 00:27:25
Y veremos como se guardan las cosas en ficheros 00:27:27
¿Vale? 00:27:30
Y será cosa que es de tercero 00:27:31
¿Vale? 00:27:32
Otra cosilla, ¿os acordáis que en Object existía un método que se llama Equals? 00:27:42
¿Vale? 00:27:49
Que era para ver si dos objetos son iguales 00:27:50
Cuidado, que si yo implemento Comparable 00:27:53
Y entonces doy una definición de cuando dos objetos son iguales 00:27:56
Porque tengo que devolver un cero cuando son iguales 00:28:02
Pues esta definición tiene que ser consistente con la implementación del Equals 00:28:05
Equals me tiene que dar true 00:28:12
Cuando esto me da cero 00:28:17
Y solo cuando esto me da cero 00:28:21
No puedo tener casos en el que esto me dice 00:28:23
Si son iguales y luego voy al equals 00:28:27
Y me dice falso 00:28:29
Sería un problema 00:28:30
Crearía inconsistencias en que si estoy comparando 00:28:32
Dos objetos que lo compares tú 00:28:35
Me dice si son el mismo 00:28:36
Y si lo intento comparar con el equals 00:28:37
Me dice no son distintos 00:28:39
Entonces cuidado también 00:28:40
Que como 00:28:43
Os acordáis que el equals por defecto 00:28:44
El equals de object 00:28:47
Compara las referencias 00:28:48
Si yo voy a implementar 00:28:51
El comparable con compareTo 00:28:54
Entonces estoy implementando esto de aquí 00:28:55
Pues lo más probable 00:28:57
Que tendré también que sobre escribir 00:28:59
Override el equals 00:29:01
Para que sea consistente 00:29:04
Si dejo el equals de object 00:29:05
Y implemento el compareTo 00:29:09
Para mis objetos 00:29:12
Lo más probable es que luego no sean consistentes 00:29:13
Porque estoy comparando cosas distintas 00:29:16
Habíamos dicho que los gatos comparaban su edad 00:29:19
Mientras el equals de object 00:29:21
Compara si son la misma referencia 00:29:23
Por lo tanto, darían cosas distintas 00:29:25
Si yo tengo dos gatos de la misma edad 00:29:27
Que son dos objetos distintos 00:29:29
CompareTo me daría cero 00:29:31
Porque tienen la misma edad 00:29:32
Y equals me daría falso porque son objetos distintos 00:29:34
Eso no puede pasar 00:29:36
Un ejemplo práctico de interfaz 00:29:39
Vamos a verlo 00:29:54
Entonces aquí tenemos 00:29:55
Una interfaz animal 00:29:57
Aquí 00:30:00
Mi interfaz animal 00:30:02
Que estará en un fichero 00:30:05
Tiene el método habla 00:30:07
Que devuelve nada 00:30:10
Aquí debería explicar 00:30:12
Que hace habla 00:30:14
Que cuando habla un animal 00:30:15
Pues hace su sonido 00:30:16
Sea cual sea 00:30:18
Entonces 00:30:19
Esto quiere decir que cualquier 00:30:22
Clase que implemente animal 00:30:26
Tiene que implementar 00:30:29
Habla 00:30:31
Si no, me da un error 00:30:31
Entonces me voy a crear perro 00:30:33
Public class perro 00:30:36
Implements animal 00:30:40
Este es otro fichero 00:30:43
Si os fijáis aquí no pongo extends 00:30:44
Pongo implements 00:30:47
Se puede extender una cosa 00:30:48
Y implements varias cosas 00:30:54
Mientras extends 00:30:57
Siempre es una sola clase 00:30:59
Extendo una clase 00:31:00
Pero puedo implementar cuantas clases me da la gana 00:31:02
Cuantas interfaces 00:31:05
Entonces aquí dentro 00:31:08
Yo puedo hacer lo que me da la gana con perro 00:31:09
Poner todas las variables que quiera 00:31:11
Todos los métodos que quiero 00:31:14
Pero necesariamente tendré que tener 00:31:15
Una implementación de 00:31:18
Habla 00:31:19
Igual a la de anterior, ¿vale? 00:31:21
En concreto, esto puede cambiar el public 00:31:23
¿Vale? No puede ser 00:31:26
Más restrictivo 00:31:28
¿Vale? 00:31:30
O sea que public lo puedo poner 00:31:32
Pero si intento poner aquí algo como 00:31:34
Private, me va a decir no 00:31:36
Porque la definición arriba no ponía 00:31:37
Public o no ponía private 00:31:40
¿Vale? 00:31:41
Entonces, ¿qué hace el método habla cuando es un perro? 00:31:42
Pues se escribe guau 00:31:47
Una fantástica implementación 00:31:48
Por otro lado, tengo gato 00:31:52
Que cuando implementa habla, porque él implementa animals 00:31:54
Por lo tanto, tiene que implementar el método habla 00:31:59
Y lo que hace es escribir miau 00:32:02
Cada animal dice lo suyo 00:32:05
¿Cómo se usa esto? 00:32:07
Entonces aquí tenemos una clase 00:32:09
Main 00:32:12
¿Vale? 00:32:14
En el que el main dice 00:32:15
Me creo un animal 00:32:17
¿Lo puede hacer esto? 00:32:19
00:32:22
¿Perro qué es? 00:32:23
Una clase 00:32:27
Y new perro es un 00:32:28
Instancia de tipo perro 00:32:30
Es un objeto 00:32:34
¿Sí? 00:32:35
¿Animal qué es? 00:32:36
Es una interfaz 00:32:38
Si os fijáis, aquí estoy utilizando el tipo de la interfaz como si fuera una variable 00:32:41
Interfaz no es ni siquiera una clase, ¿vale? 00:32:47
Pero lo hemos visto ya con las clases abstractas 00:32:51
Aquí lo que estamos utilizando es dando un tipo a esta interfaz 00:32:54
Que es un tipo más genérico de lo que es de verdad 00:32:57
Pero un perro cuando implementa un animal, ¿vale? 00:33:00
Cuando implementa la interfaz animal, un perro puede ser un animal 00:33:05
En este sentido lo que estamos diciendo es que cuando yo utilizo animal dog, por ejemplo aquí 00:33:08
Quiere decir que el objeto referenciado por dog implementa esa interfaz 00:33:14
Y por lo tanto, cuando usaré dog, podré usar todos los métodos que están definidos en la interfaz animal 00:33:21
No podré utilizar lo que está definido solo en perro 00:33:29
Si perro tuviera también otro 00:33:35
Método que es 00:33:39
Correr 00:33:41
Pues no lo podría utilizar 00:33:42
Porque desde animal 00:33:44
Correr no existe 00:33:46
Debería hacer un downcasting a perro 00:33:47
Y lo puede utilizar 00:33:50
Justo 00:33:52
Entonces 00:33:53
Yo quiero animal dog perro 00:33:56
Y animal dog gato 00:33:58
He creado dos animales 00:33:59
Y como tanto perro como gato 00:34:01
Implementan animal 00:34:04
Pues lo puedo crear así 00:34:05
Cuando llamaré dog.habla 00:34:06
Me escribirá 00:34:10
Cuando llamaré cat.habla 00:34:11
Me escribirá 00:34:16
Pero estos dos son animales 00:34:18
¿Cómo descubre 00:34:21
Cuáles de los métodos que tiene que utilizar? 00:34:23
Gracias al 00:34:26
Polimorfismo, nuestro mejor amigo 00:34:27
Vamos a ver 00:34:30
Otra cosa interesante 00:34:32
¿Vale? Me creo un array 00:34:35
De animales, esto ya lo hemos hecho 00:34:37
Es muy parecido a lo que hemos hecho con las 00:34:39
Trastes abstractas 00:34:41
¿No? Hasta ahora hemos estado trabajando más o menos así 00:34:43
Pongo 00:34:45
Dog en posición 0 00:34:47
Y cat en posición 1 00:34:49
Lo puedo hacer, fijaos que estoy 00:34:50
En un array de animal 00:34:53
Donde he metido dentro una referencia animal 00:34:54
Que en realidad es un perro 00:34:56
Y una referencia cat que es un animal 00:34:58
Que en realidad es un gato 00:35:01
Pero los puedo poner todo en animal 00:35:02
Porque tanto perros como gatos 00:35:05
Implementan la interfaz 00:35:06
Y luego lo que hago es 00:35:09
Que hablen todos 00:35:12
Y le paso este 00:35:13
Array 00:35:15
Que hables todo que es 00:35:17
Como 00:35:19
Estático 00:35:22
Cursiva 00:35:30
¿Cómo se llama? 00:35:32
Lo llamamos loco 00:35:33
¿Sí? 00:35:34
Este es un método estático porque estoy en el main 00:35:37
Para llamarlo, bueno, podría no ser estático 00:35:40
Si esto fuera un objeto, no pasaría nada 00:35:42
¿Vale? Lo que me interesa 00:35:44
Es que entendáis que le estoy pasando un qué 00:35:45
Un rey de qué 00:35:48
Un rey de animales 00:35:51
¿Sí? Aquí no hay gatos ni perros 00:35:53
Un rey de animales 00:35:56
Y de hecho, si os fijáis aquí 00:35:57
Lo que recibe él 00:36:00
Es un rey de animales 00:36:01
Me da igual que haya dentro 00:36:03
Esta cosa de aquí 00:36:06
Animal, array de animales 00:36:09
Me está diciendo que me van a pasar 00:36:11
Un array de objetos 00:36:14
Y los objetos que están ahí dentro 00:36:15
Todos cumplen con un requisito 00:36:18
¿Qué es? 00:36:20
Todos los que están ahí dentro 00:36:26
Tienen un requisito 00:36:28
Todos los arrays que estarán 00:36:30
Dentro de este array 00:36:32
Todos los objetos que estarán 00:36:34
Dentro de este array 00:36:37
Cumplen con un requisito 00:36:37
¿Qué es? 00:36:39
Implementan 00:36:39
La interfaz animal 00:36:42
¿Vale? Entonces en cualquier 00:36:45
Objeto de 00:36:47
Este array, ¿qué podré hacer yo? 00:36:49
Llamar 00:36:55
Los métodos de la interfaz animal 00:36:55
Y entonces aquí 00:36:57
Puedo tranquilamente hacer un for 00:37:01
¡Uy! ¿Qué es esto? 00:37:04
Sí, es una cosa que hemos visto 00:37:05
Y que se os ha olvidado porque no utilizáis nunca 00:37:07
¿Vale? Puedo pillar 00:37:09
Cada uno de los animales 00:37:11
Que están dentro de animales 00:37:13
Y decirle que hable 00:37:14
Este es equivalente a poner 00:37:16
Porinte igual a cero 00:37:19
Y menor que 00:37:22
Animales punto lente 00:37:24
Y más más 00:37:25
Y aquí poner animales de i 00:37:26
Punto habla 00:37:30
Fijaos que 00:37:31
Imaginaos que esta cosa 00:37:37
no lo hayáis creado vosotros 00:37:40
ma otro equipo de trabajo 00:37:42
necesitaba 00:37:44
el haber implementado 00:37:46
el método habla 00:37:48
para poder 00:37:50
hacer este código 00:37:52
vale, yo no sé 00:37:55
como se hace este método 00:37:58
yo lo único que sé es que como estoy 00:37:59
utilizando animal que es una 00:38:02
una interfaz y tú me has dado 00:38:04
la interfaz que es solo el prototipo 00:38:06
Yo sé que puedo llamar habla 00:38:08
Sobre todos los objetos de este array 00:38:10
Y lo llamo 00:38:13
Luego lo que hará 00:38:14
Cómo se hará y por qué se hará 00:38:16
Pues eso a mí no me importa 00:38:19
Lo está desarrollando otro equipo 00:38:20
Pero estoy seguro que lo puedo utilizar 00:38:22
Porque todos los objetos 00:38:28
Que están en este array 00:38:30
Son de tipo animal 00:38:31
Que quiere decir que están implementando la interfaz animal 00:38:32
Esto, sobre todo a nivel de diseño 00:38:35
Es una cosa muy potente 00:38:42
Muy interesante 00:38:44
Como nosotros nos centramos más en la implementación 00:38:44
Que en el diseño, muchas veces 00:38:48
En los exámenes o en los ejercicios 00:38:49
El diseño se lo doy yo 00:38:51
Os doy 00:38:52
Hacer tres clases, esta clase, esta clase 00:38:54
Os he dado ya el diseño 00:38:57
Pues entonces 00:38:59
A lo mejor os cuesta un poquito más 00:39:00
Ver la potencia de esta cosa 00:39:03
Pero en la realidad 00:39:05
Pues no lo tengo 00:39:06
Tanto para las interfaces que puedo crear yo 00:39:08
como es aquí, esta interfaz la he creado yo 00:39:11
como puede ser para interfaces 00:39:13
ya existentes a Java 00:39:15
como Compatible, Serializable 00:39:17
no sé cómo se dice en inglés 00:39:20
o Serializable o lo que sea 00:39:21
y hay muchas 00:39:23
también 00:39:24
repito un poquito lo que he dicho 00:39:27
antes, la cosa interesante es que 00:39:30
luego en el ecosistema de Java 00:39:31
en todas las clases que ya existen 00:39:33
que son muchas, muchas, muchas clases 00:39:35
muchas veces yo no sé 00:39:37
el objeto que vas a utilizar tú 00:39:40
Pero voy a utilizar 00:39:41
Interfaces ya existentes 00:39:43
Asumiendo que si tú 00:39:45
Implementas esa interfaz 00:39:47
Entonces, obviamente, a mí me estás dando herramientas 00:39:49
De algunos métodos que puedo llamar 00:39:51
Y por lo tanto yo puedo hacer 00:39:53
Un programa 00:39:55
General, como es este método 00:39:56
De aquí, el método que hablen todos 00:40:00
Basado sobre el hecho que 00:40:01
Tú habrás dado una implementación 00:40:03
De ese método 00:40:05
No sé cuál es, pero sé que lo tendrás 00:40:06
Y todo lo puedo utilizar 00:40:09
Y sé lo que tiene que hacer 00:40:10
La descripción de habla es que haga su sonido 00:40:12
Hay que calcular el área del triángulo 00:40:15
Entonces, basándome sobre eso 00:40:17
Puedo hacer cosas muy interesantes 00:40:20
Cuando yo entro en este mundo 00:40:22
Y tengo mi nuevo objeto nuevo 00:40:24
Que tengo que hacer algo con él 00:40:26
Y tengo un montón de herramientas que ya me hacen 00:40:27
Cosas potentes y optimizadas 00:40:30
Para poder utilizar 00:40:33
Lo que ya me proponen los demás 00:40:34
Realmente lo único que tengo que hacer es implementar 00:40:36
determinadas interfaces 00:40:38
pillo mi objeto 00:40:40
implemento la interfaz comparable 00:40:41
y ahora ya puedo utilizar todos los métodos 00:40:44
que trabajan sobre eso como comparable 00:40:47
entonces no tengo que volver a implementar 00:40:48
un método para ordenar 00:40:51
mis arrays, sino utilizo 00:40:53
los métodos que ordenan 00:40:54
arrays que me han hecho otros basándose 00:40:56
sobre comparable 00:40:59
dudas? 00:40:59
sigamos 00:41:09
y aquí 00:41:10
me contradí 00:41:13
Hemos dicho que una interfaz 00:41:16
Es una clase abstracta 00:41:20
Que no tiene métodos 00:41:22
Implementados 00:41:24
No es mentira 00:41:26
Yo puedo pillar una interfaz 00:41:27
Implementar un método 00:41:29
¿Vale? 00:41:31
Existe el concepto de método por default 00:41:33
Método por defecto 00:41:36
¿Vale? 00:41:39
Es decir, que si yo tengo una interfaz 00:41:39
Vale, la interfaz, cada uno la implementará como sea 00:41:42
Pero quiero poder proporcionar 00:41:44
proporcionar un método ya implementado para decir mira por defecto esto en la 00:41:46
mayoría de la mayoría de los casos se implementa si te lo doy ya implementado 00:41:57
luego tú eliges si lo quieres sobreescribir si no lo quieres 00:42:03
implementar lo que sea pero yo te doy ya una versión por defecto como es el caso 00:42:06
Aquí, ¿vale? 00:42:12
Aquí he cambiado un poquito 00:42:15
La interfaz de animal 00:42:17
Y le he puesto 00:42:21
La interfaz de animal tiene habla 00:42:22
Habla es abstracto 00:42:24
¿Vale? No pone abstract 00:42:26
Pero hemos dicho que la interfaz 00:42:28
Si no pongo nada es abstracto 00:42:29
Lo tendrás que implementar tú sí o sí 00:42:30
Y por otro lado te doy default void 00:42:33
Corre 00:42:37
Default es otra palabra 00:42:38
Lo es en rojo 00:42:39
Es una palabra reservada 00:42:40
Te estoy diciendo que esto 00:42:43
Es un método de mi interfaz 00:42:45
Pero es un método al que te doy 00:42:47
Una implementación por defecto 00:42:49
Si tú no lo implementas 00:42:50
Me vale igual 00:42:53
Heredarás esta, en un cierto sentido 00:42:54
Cuidado que no estamos en herencia, estamos en implementación 00:42:57
Y por lo tanto, te digo 00:42:59
Mira, si tú 00:43:03
No haces nada con este señor 00:43:04
En automático, él escribirá 00:43:06
El animal corre 00:43:08
Es su implementación por defecto 00:43:09
¿Vale? Entonces, ¿qué puedo hacer? Pues puedo hacer que en perro implementa animal y decirle, oye, mira, implemento habla, pero no hago nada con corre. 00:43:13
Entonces, corre utilizará la implementación por defecto de la interfaz. Es decir, que si un perro corre, me escribirá el animal corre. ¿Vale? La implementación que viene aquí. 00:43:25
Sin embargo, para hacer un ejemplo distinto 00:43:38
Aquí, en gato 00:43:41
Implemento habla 00:43:43
Y vuelvo a sobrescribir 00:43:45
Reimplementar también corre 00:43:48
Donde en vez de utilizar la entrevista en arriba 00:43:50
Escribo que tiene que escribir el gato corre 00:43:53
Por hacer las dos cosas 00:43:56
Resultado 00:44:00
Que cuando yo llamo dog.corre 00:44:01
Me saldrá el animal corre 00:44:05
cuando llamo cat.corre 00:44:08
el gato corre 00:44:10
y aquí la pregunta es obvia 00:44:11
es obvia, tan obvia que 00:44:17
está aquí la respuesta 00:44:29
¿no? es decir, vale 00:44:32
yo tengo las clases abstractas 00:44:35
las clases abstractas pueden implementar métodos 00:44:36
o hacer métodos abstractos, vale, es fenomenal 00:44:39
y luego tengo las interfaces 00:44:41
que pueden hacer métodos abstractos 00:44:42
o puedo implementarlos 00:44:45
entonces, aquí 00:44:46
Algunas pistas de la diferencia 00:44:52
¿Vale? 00:44:56
¿Qué son? 00:44:57
Primero el propósito 00:44:58
Una clase estrata se utiliza para proporcionar 00:44:59
Una estructura básica para una jerarquía de clases 00:45:02
¿Vale? 00:45:05
Cuando yo uso una clase estrata 00:45:06
Estoy construyendo una jerarquía de clases 00:45:07
Estoy en un cierto sentido 00:45:10
Organizando mis clases 00:45:12
Entre ellas 00:45:14
Tengo persona que debajo tiene empleado 00:45:15
Y tiene debajo 00:45:18
De empleado profesor 00:45:20
Debajo de persona también está estudiante 00:45:21
Estoy creando toda una jerarquía de clases 00:45:23
Que se interrelacionan entre ellos 00:45:26
Y alguna de estas puede ser astrata 00:45:27
Mientras que cuando defino una interfaz 00:45:30
No estoy tanto definiendo 00:45:34
Esta jerarquía de clase 00:45:36
Podría ser que alguna clase 00:45:38
Se implemente en la interfaz o no 00:45:39
Independientemente de donde están en esta jerarquía 00:45:41
Sino que estoy haciendo un contrato 00:45:44
Estoy diciendo 00:45:46
Mira, cuando tú vas a implementar 00:45:47
Esta clase 00:45:50
Que implementa 00:45:53
Mi interfaz 00:45:54
Determinada 00:45:56
Te estás pillando el 00:45:57
Deber de implementar 00:46:00
Todos los métodos que te he dado yo 00:46:03
O sea, te estás pillando 00:46:04
El contrato de decir 00:46:06
Vale, cuando yo implemento 00:46:08
Estos métodos que me has dicho tú 00:46:09
Los tienen que estar en la base de la ley 00:46:11
Independientemente de cual sea mi jerarquía 00:46:13
De clases 00:46:16
Son dos propósitos distintos 00:46:17
En uno estoy dando una herramienta para estar seguro que si alguien implementa mi interfaz 00:46:19
Está implementando esos métodos 00:46:28
Es un contrato entre varios desarrolladores, entre varias partes de mi programa 00:46:29
Sin embargo cuando utilizo una clase abstracta la estoy utilizando para hacer un diseño de cómo es mi estructura 00:46:34
De la estructura de mi sistema 00:46:41
Y a eso da una pizca de diferencia 00:46:44
Segunda implementación de métodos 00:46:47
Bueno, esto es reactivo 00:46:50
Una clase abstracta normalmente 00:46:52
Tiene una parte concreta 00:46:54
Y una parte abstracta, ¿vale? 00:46:56
Algunos métodos concretos y algunos métodos abstractos 00:46:57
Mientras que la interfaz 00:47:00
Por lo general tiene solo abstractos 00:47:01
¿Vale? Y aquí añade a colete 00:47:04
Ella, a menos que no se utilice 00:47:06
Un método default 00:47:08
¿Vale? Que es lo que hemos visto ahora 00:47:09
Y la razón de por qué no se ha movido la técnica 00:47:11
Dos razones más 00:47:13
Herencia, y este es fuerte 00:47:15
¿Cuántas clases puede heredar? 00:47:17
Una 00:47:20
¿Cuántas interfaces puede implementar? 00:47:21
Infinitas 00:47:23
Pues ya tenéis la diferencia suficiente 00:47:23
Para las dos cosas 00:47:26
¿Vale? 00:47:27
Si tengo una clase de strata 00:47:28
Puede heredar solo de esa clase de strata 00:47:29
Y si necesito algunas cosas más 00:47:31
Pues tiro de interfaz 00:47:34
¿Vale? 00:47:36
Entonces, ¿por qué no anulamos la clase de strata 00:47:38
Y la destruimos la clase de strata? 00:47:40
Bueno, en realidad, en mi experiencia 00:47:42
La clase de strata se usa menos 00:47:44
Pero es este punto de aquí 00:47:45
La clase abstracta 00:47:48
Me crea esta organización 00:47:50
Que la interfaz no me crea 00:47:52
Y... 00:47:54
Entonces, herencia múltiple en un lado 00:47:59
Y símbolo en otro 00:48:01
Y también hay una cosa sobre las variables 00:48:02
Esto es también interesante 00:48:05
Las variables en una clase abstracta 00:48:06
Pueden ser estáticas o no estáticas 00:48:09
O sea, yo en una clase abstracta 00:48:11
Puedo crear variables del objeto 00:48:13
Sin embargo, en una interfaz 00:48:16
No puedo crear variables de un objeto 00:48:19
¿Vale? 00:48:22
Porque no la he dado 00:48:24
Implemento 00:48:25
Entonces, una interfaz sí puede tener variables estáticas 00:48:27
Que se referen a esa interfaz 00:48:30
En la que daré la misma forma 00:48:33
Pero no pueden tener variables no estáticas 00:48:35
Entonces, si yo quiero hacer 00:48:38
Algo parecido a esto que estamos viendo ahora 00:48:40
¿Vale? 00:48:43
En general y necesito 00:48:44
En mi jerarquía 00:48:46
Utilizar una clase 00:48:47
Que tenga variables no estáticas 00:48:49
Y de allí extender 00:48:52
Parte de esa que parte 00:48:54
Ostrata y parte no 00:48:55
Pues no puedo hacerlo con una interfaz 00:48:57
Necesito la clase 00:48:59
Ostrata 00:49:02
Y esto es un punto que me dice 00:49:03
Vale, a este punto pues 00:49:05
No puedo destruir 00:49:07
La clase ostrata y decir algo todo con una interfaz 00:49:10
Hay casos particulares en los que necesito todavía el concepto de concepto 00:49:12
Y esto si lo pensáis un poco, habéis sentido un poco el concepto de instancias, etc, etc, etc 00:49:17
¿Entendéis por qué? 00:49:22
La interfaz no es una clase 00:49:23
¿Vale? 00:49:25
La interfaz no genera instancias 00:49:27
¿Vale? 00:49:29
Puede generar referencias 00:49:30
Pero nunca de un new comparable 00:49:32
¿Vale? 00:49:34
Siempre hay una letra pequeña 00:49:40
Es que esto de la programación 00:49:41
es un mundo 00:49:44
y luego está la cosa 00:49:46
más compleja de este curso 00:49:49
hasta ahora 00:49:50
la interfaz funcional 00:49:51
¿qué es? 00:49:53
momento de falta de 00:49:58
respiración 00:50:00
y de broad your mind 00:50:01
porque 00:50:03
llegamos a una cosa que no hemos visto hasta ahora 00:50:06
y que veremos aquí en un momento 00:50:08
pero no estará muy por la noche 00:50:10
te expectaré diciendo 00:50:12
la interfaz funcional 00:50:14
Imaginaos una interfaz 00:50:15
Donde yo pongo esta anotación de aquí 00:50:20
Que es lo que me crea 00:50:22
Una interfaz funcional 00:50:24
Y luego digo 00:50:25
Vale, muy bien 00:50:28
Tengo la interfaz 00:50:29
Esta es declaración 00:50:33
Como class 00:50:34
Operación 00:50:35
Este es el nombre de la interfaz 00:50:37
¿Qué tiene dentro? 00:50:40
Tiene un método 00:50:41
El método ejecutar 00:50:43
Que recibe un A y un B 00:50:45
Vamos a ver cómo se usa esta cosa 00:50:47
Mira adelante 00:50:55
Creo un objeto operación 00:50:56
Y en vez de definir aquí 00:51:00
Su ño o no sé qué 00:51:04
Lo que le estoy pasando 00:51:06
Cómo se hace esta operación 00:51:10
No le estoy pasando un valor 00:51:12
Le estoy pasando 00:51:16
Una función 00:51:18
No estoy almacenando 00:51:19
En una variable 00:51:23
El valor 3 00:51:24
Más estoy almacenando en una variable 00:51:25
Un procedimiento 00:51:28
Que me dice 00:51:30
Dame a y b 00:51:33
Y el resultado es a más b 00:51:33
Y esta es la operación suma 00:51:36
Cuando llamaré suma.ejecutar 00:51:38
De a, b 00:51:42
¿Os acordáis de esto? 00:51:43
¿Qué me hará? 00:51:46
Si yo hago suma.ejecutar de 3,5 00:51:47
¿Qué me hace? 00:51:54
Aplica esta operación, hace 3 más 5 y el resultado es 8 00:51:58
Pero puedo crear una operación multiplicación 00:52:02
Donde le paso como parámetro, como valor 00:52:07
Otra distinta operación 00:52:12
Que es dame A y B 00:52:14
Y el resultado es A por B 00:52:16
Entonces ahora 00:52:18
He usado la misma 00:52:22
Objeto 00:52:23
Pero no le estoy pasando un valor 00:52:26
Le estoy pasando una función 00:52:28
Y esto 00:52:30
Todo esto es basado 00:52:32
Sobre un concepto teórico 00:52:40
Que es el lambda cálculo 00:52:42
Que se da en quinto de 00:52:44
Carrera 00:52:50
¿Vale? 00:52:52
Para poder 00:52:56
para poder especificar todas estas cosas 00:52:57
este señor de aquí 00:53:01
el let in y cosas por el estilo 00:53:02
pues hay todo un lenguaje entre comillas 00:53:04
que es el lambda cálculo 00:53:06
que me permitiría 00:53:08
aquí hacer cosas 00:53:12
muy potentes 00:53:14
¿os acordáis al principio de curso? 00:53:15
porque seguramente estáis repasando 00:53:18
cada 15 días 00:53:20
cuando hicimos una clasificación de los lenguajes 00:53:21
y vimos que había lenguajes 00:53:24
Y había lenguajes funcionales 00:53:26
Cuya característica era que podía pasar como parámetros 00:53:30
Y como variables a funciones en vez de valores 00:53:35
Pues este es el intento que ha hecho Java 00:53:40
Para incluir dentro de Java mismo algo de lenguaje funcional 00:53:45
En realidad tiene sus matices 00:53:50
¿Vale? Porque para que sea funcional de verdad 00:53:58
Debería ser implementado de otra forma 00:54:00
Y cosas por el estilo 00:54:02
Pero lo que está intentando hacer aquí 00:54:03
Es acercarse a lo que son los lenguajes funcionales 00:54:05
¿Y esto por qué? 00:54:08
Porque hay problemas 00:54:11
Que los lenguajes orientados a objetos 00:54:12
Y lenguajes interactivos 00:54:14
Normales que conocemos nosotros 00:54:16
Se permiten solucionar 00:54:18
Súper fácilmente 00:54:20
O sea que hay cosas que 00:54:21
Funcionan muy bien 00:54:23
Los lenguajes orientados a objetos para eso 00:54:25
Y hay otros temas que los lenguajes, sobre todo la programación nuestra, no funcional, no lógica 00:54:27
Que utilizamos nosotros, crea programas súper complejos y súper lentos para poder hacer decenas de cosas 00:54:35
Hay campos en los que esta forma de programar, la que estamos aprendiendo nosotros, no funciona 00:54:44
Es muy engorrosa 00:54:52
Uno de ellos, por ejemplo, es el lenguaje natural 00:54:54
El procesamiento del lenguaje natural 00:54:58
Lo puedes hacer tranquilamente en Java 00:55:01
Pero la forma con que lo logras 00:55:03
Utilizando Prolog 00:55:07
O otros lenguajes de programación lógica 00:55:08
O de programación funcional 00:55:11
Pues es otro mundo 00:55:12
Yo esto lo he vivido 00:55:14
En un curso aquí en la Politécnica 00:55:16
Donde había el procesamiento del lenguaje natural 00:55:22
Había que hacer 00:55:24
No sé, no me acuerdo ni siquiera qué 00:55:25
Me acuerdo que yo me pasé tres días 00:55:27
Lo hacíamos en pareja 00:55:29
Entonces yo me pasé tres días 00:55:31
Haciendo mi programito en Java 00:55:33
Para hacer lo que sea 00:55:34
Y vino mi compañero y le digo 00:55:35
Mira, yo conozco Prolog 00:55:36
Mira, tres líneas de código 00:55:38
Entonces, todo depende 00:55:40
Pero la idea es que 00:55:47
Si en un día futuro 00:55:49
Como el MOOC 00:55:50
¿Vale? Llega un momento en que vosotros veáis runas arcanas en un programa de Java, ¿vale? 00:55:52
Podráis decir, me acuerdo ese tío que hablaba mal, que habló de programación funcional o de interfaz funcional. 00:56:01
Y allí tendréis como un... 00:56:09
Una revelación. 00:56:15
No, no, una sensación mala de esta, de como que hay alguien detrás que intentarlo. 00:56:16
y son cosas complejas 00:56:22
que no se pueden 00:56:26
parar, aprender 00:56:29
esto os lo digo 00:56:30
de verdad, lo pongo aquí 00:56:33
simplemente para que tengáis un 00:56:34
ejemplo, lo podéis copiar 00:56:36
por algún lado y ver que funciona 00:56:38
y cosas por el estilo, pero que 00:56:40
no va a entrar en el examen 00:56:42
ni siquiera para el bien 00:56:44
son cosas que no vamos a 00:56:47
trabajar 00:56:49
esto sería un main 00:56:49
Y este de aquí sería 00:56:57
Y ya está 00:56:59
Autor/es:
stefano chiesa
Subido por:
Stefano C.
Licencia:
Reconocimiento - No comercial
Visualizaciones:
16
Fecha:
31 de enero de 2023 - 13:19
Visibilidad:
Clave
Centro:
IES ROSA CHACEL
Duración:
57′ 12″
Relación de aspecto:
1.78:1
Resolución:
1280x720 píxeles
Tamaño:
478.47 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid