20250124 Interfaces_1 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Bueno, pues con lo que estábamos, ¿verdad? Era con la herencia, ¿vale?
00:00:01
Entonces, realmente yo creo que todos estamos ya en el punto en el cual entendemos por qué esto tiene sentido y tiene razón de ser, ¿no?
00:00:12
Que no es un invento que se pone en otras cosas. ¿Verdad que sí?
00:00:19
No. Hola.
00:00:24
David, tú por ejemplo, ¿qué has atendido? ¿Podrías decirme una razón por la que la herencia tenga sentido?
00:00:27
Bueno, pues inténtalo
00:00:35
porque tendrás que dar charlas
00:00:38
y debe ser con tu trabajo
00:00:40
No me lo podías explicar tú, Juan
00:00:42
No, porque la hered...
00:00:48
Una, reutilizar código
00:00:52
¿Vale?
00:00:56
Efectivamente, porque tú heredas de una clase
00:00:58
y al heredar de ella o extender
00:01:00
todo lo que tenía esa clase
00:01:02
está ya en ti
00:01:04
Entonces, eso es una ventaja para el tiempo de desarrollo, ¿vale?
00:01:05
Para hacer métodos más fáciles,
00:01:11
tipo poner métodos en todas las partes de las herencias,
00:01:13
y luego meter verazas y todo eso.
00:01:18
Bueno, esencialmente, sobre todo, la ventaja de la herencia es el polimorfismo.
00:01:20
Es decir, yo tengo...
00:01:25
Le he dicho 200.000 veces.
00:01:28
Le he dicho 200.000 veces.
00:01:30
Entonces, esencialmente, la herencia es una herramienta para describir mejor la realidad que vamos a gestionar, ¿verdad?
00:01:35
Porque nuestra aplicación va a gestionar una serie de conceptos y entidades.
00:01:50
Entonces, si hacemos un diseño que los represente correctamente con sus clases, propiedades y métodos,
00:01:55
luego ya la aplicación, lo que para nosotros ahora mismo es el main solamente,
00:02:01
La aplicación va a ser mucho más sencilla de hacer, más fácil de mantener, de escalar, aumentar funcionalidades, etc.
00:02:05
Entonces, la herramienta esencialmente es un diseño para representar mejor la realidad.
00:02:13
¿Y por qué la representa mejor?
00:02:17
Porque en la realidad muchos conceptos distintos comparten una raíz común, ¿no?
00:02:19
Comparten cosas, ¿vale?
00:02:25
Un gato y un perro, pues los dos son animales.
00:02:27
Entonces, en lugar de hacer un gato y un perro por separado, hacemos una clase animal.
00:02:29
Un gato cree de esta y un perro cree de esta, pues estaremos reutilizando todo lo de animal y además estaremos particularizando.
00:02:33
Entonces, al particularizar, lo que hacemos es, todos los animales comen, pero el perro come diferente del gato.
00:02:41
Entonces, al particularizar, yo particularizo el método comer en gato y el método comer en perro.
00:02:49
¿Vale? Pero luego mi aplicación le da exactamente igual que cada clase heredera o cada subclase tenga su propia versión. A la aplicación le da igual. La aplicación, gracias a que hay una raíz común, sabe que yo puedo tener 37 animales que si todos heredan de mi raíz común animal, todos van a comer.
00:02:57
y la aplicación llamará a comer
00:03:18
y la aplicación será
00:03:20
completamente transparente
00:03:22
que luego en realidad
00:03:24
cada uno de los animales o subclases
00:03:25
lo hace a su manera
00:03:28
será completamente transparente
00:03:29
la aplicación sabe que llamará
00:03:32
al método de la superclase
00:03:33
y ya sabe que la máquina virtual
00:03:35
hará el trabajo sucio
00:03:37
es decir, vale, estás llamando al método de la superclase
00:03:38
pero yo tengo que ver
00:03:42
el objeto concreto, cuál es su propia versión
00:03:44
entonces la máquina virtual hace el trabajo sucio
00:03:46
de irse a la clase
00:03:49
concreta del objeto que ha llamado
00:03:51
al método de la superclase a ver si tiene
00:03:52
una versión suya propia
00:03:54
entonces todo ese trabajo sucio que hace la máquina virtual
00:03:56
se lo quita el desarrollador
00:03:59
porque si no el desarrollador
00:04:01
tendría que especificar en el código
00:04:02
no, estoy llamando a la versión
00:04:04
de comer de gato, a la versión de comer de perro
00:04:06
no, el desarrollador dice yo llamo a comer de la de arriba
00:04:08
de la de arriba y la máquina virtual
00:04:10
que se preocupe el objeto
00:04:12
en concreto que versión
00:04:14
propia tiene, ese es el
00:04:16
polimorfismo y eso en realidad es lo que
00:04:18
le da a esto
00:04:20
la fuerza de que nos dé
00:04:21
aplicaciones más
00:04:24
más manejables
00:04:25
y que no sean unos
00:04:28
códigos que luego a la hora de mantenerlos
00:04:30
hay una cantidad de clases que tenemos que
00:04:32
retocar por todos lados
00:04:34
vale, pero la herencia tal y como la hemos visto
00:04:36
pues tiene una pequeña
00:04:38
pega, que la herencia
00:04:40
Java es simple
00:04:42
es decir, que la herencia sea simple
00:04:44
significa que de una superclase
00:04:55
bueno, mejor dicho, que lo estoy explicando
00:04:58
que una clase
00:05:04
solo puede heredar de otra
00:05:06
el extens que acompaña a la subclase
00:05:10
el extens este de aquí
00:05:14
que acompaña a la subclase
00:05:18
solo puede tener una
00:05:20
es decir, una clase
00:05:21
solo puede tener un padre
00:05:24
solo, y ya está
00:05:25
el que le paga que eres tú
00:05:26
y el real, el biológico
00:05:30
pues aquí en Java, solo una clase
00:05:31
solo puede tener un padre
00:05:34
¿vale?
00:05:35
esto, de nuevo
00:05:38
es una limitación
00:05:39
porque a lo mejor habrá situaciones de la realidad
00:05:41
que queremos modelar
00:05:44
que yo soy a la vez una cosa
00:05:45
y soy a la vez otra
00:05:47
entonces querría heredar de las dos
00:05:48
y diríamos, vale, pues esas dos cosas que eres
00:05:51
ponlas juntas en una clase
00:05:55
pero es que entonces a lo mejor ya se pierde el sentido
00:05:56
porque estoy mezclando dos clases que no son
00:05:59
entonces, podría haber situaciones que no se pudieran representar bien
00:06:02
solamente con una estructura así
00:06:06
esta es la estructura de Java
00:06:08
de clases, uno puede hacer aquí un árbol hasta el infinito
00:06:13
un árbol hasta el infinito
00:06:16
pero al final cada una
00:06:18
solo puede dar de una, luego el árbol
00:06:20
hasta el infinito siempre va a ser
00:06:22
así, donde la clase de arriba
00:06:24
que esto es verdad que no lo he
00:06:27
dicho hasta ahora, donde la clase
00:06:28
de arriba es una clase que
00:06:30
ya existe
00:06:32
que es la clase object
00:06:33
entonces hay una clase en Java que ya existe
00:06:36
que ya está hecha, como la clase string, como la clase scanner
00:06:38
como las dos mil millones de clases
00:06:40
que está en la JRE
00:06:42
que es la clase object
00:06:43
la clase de object no tiene dentro
00:06:45
prácticamente nada
00:06:48
la podemos mirar ahora, no tiene dentro prácticamente nada
00:06:49
y cuando uno hace
00:06:51
cualquier clase
00:06:54
cualquiera
00:06:56
tiene dos opciones
00:06:57
o la deja en blanco
00:07:02
el extens y ya está, ya hace su clase
00:07:03
o hereda de algo
00:07:06
y entonces ya se mete en la jerarquía
00:07:08
heredando lo que sea
00:07:10
bueno, pues si nosotros aquí no ponemos nada
00:07:11
lo dejamos en blanco completamente
00:07:14
y no ponemos nada
00:07:16
por defecto
00:07:17
es como si hubiéramos puesto esto
00:07:19
¿vale?
00:07:22
luego, si no hay nada
00:07:28
en realidad tenemos esto
00:07:29
¿eso qué significa?
00:07:31
que cuando nosotros hacemos una clase
00:07:33
en realidad
00:07:34
esa clase ya tiene algunas cositas dentro
00:07:36
muy pocas, aunque nosotros no las veamos
00:07:39
muy poquitas, que son las de odio
00:07:41
y de hecho
00:07:43
ya lo hemos usado a veces incluso sin saberlo
00:07:45
porque nosotros
00:07:47
Hacíamos a lo mejor
00:07:49
A ver
00:07:50
Me mejor en el eclipse
00:07:51
Vale
00:08:00
¿Qué os pasa?
00:08:27
Lo meto aquí en ejemplo
00:08:30
Herencia
00:08:31
Vale, ¿se ve bien con la luz atrás?
00:08:32
Porque no se ve una caca, ¿no?
00:08:39
Ah, que está todavía arrancando
00:08:41
Está como nosotros
00:08:42
Que no acaba todavía de despertarse
00:08:45
He dicho nosotros, no he dicho vosotros.
00:08:46
Bueno, por ejemplo, voy a reutilizar este ejemplo herencia de cliente, cliente online, cliente tienda.
00:08:53
Pues nosotros la primera clase que hicimos en esta aplicación era la clase cliente y esta clase no heredaba de ninguna.
00:09:08
luego ya sí, cliente online hereda de esta
00:09:16
con lo cual tenía todo lo de cliente, sobre escribía métodos si interesaba
00:09:21
si no, no, cliente tienda también heredaba de cliente
00:09:25
luego tenía todo lo de cliente, sobre escribía métodos si le interesaba o no
00:09:28
y ya está, y con esto ya hicimos una aplicación con diferentes clientes
00:09:33
que hacían diferentes cosas, vale, esta en concreto, esta en particular
00:09:37
no hereda de nadie, con lo cual en realidad esto es como si hubiéramos puesto
00:09:41
esto. Luego, poner esto y no poner nada es la misma cosa. Entonces, efectivamente, Java
00:09:45
tiene una jerarquía de clases que es un arbolito, siempre, porque cualquier clase que yo haga,
00:09:58
cualquier clase que hagamos, si yo no pongo nada, va a heredar de esta, que es object
00:10:06
de aquí, vale
00:10:19
de la clase object hereda cualquiera
00:10:28
que yo hago más clases que no heredan de ninguna
00:10:30
pues todas heredan de object
00:10:32
todas heredan de object
00:10:34
vale
00:10:35
ahora, que hago
00:10:39
en alguna clase un stance de alguna otra
00:10:46
bueno, pues entonces se heredará de la que sea
00:10:49
que luego hago otra que en lugar
00:10:51
de heredar de object directamente hereda
00:10:54
de otra, pues bueno, esa estará metida ahí
00:10:56
donde sea, entonces
00:10:58
en
00:10:59
java
00:11:01
cualquier aplicación
00:11:04
es un arbolito de clases
00:11:06
donde la de object es la de arriba
00:11:08
si no hay herencia pues todas las demás
00:11:09
están todas abajo
00:11:12
que además estoy haciendo
00:11:13
extens de alguna de las que ya hay
00:11:16
pues estaría haciendo un nivel inferior
00:11:17
todo es un árbol así
00:11:19
entonces esto
00:11:20
a veces puede representar algunas situaciones
00:11:23
pero hay veces
00:11:26
que no lo representa
00:11:27
porque hay veces que alguna de estas clases de aquí
00:11:28
pues efectivamente tiene todo lo de esta
00:11:31
y todo lo de sus abuelos y bisabuelos
00:11:34
pero a lo mejor también querría
00:11:36
yo que tuviera lo de esta
00:11:38
y que heredara el comportamiento
00:11:39
heredara de las dos
00:11:42
pues en Java no se puede, solo puedes
00:11:43
heredar de alguna
00:11:46
entonces hay un parche
00:11:47
pero es un parche fundamental
00:11:50
para
00:11:52
salvar esto
00:11:54
salvar esta restricción
00:11:57
que son las interfaces
00:11:58
¿Vale? Son las interfaces
00:12:00
Es una cosa muy sencilla
00:12:01
Que vamos a ver simplemente ahora
00:12:03
Que es lo que tiene de fondo
00:12:05
Pero antes de eso vamos a ver un pelín y más
00:12:07
Ya que hemos sacado esto de la clase object
00:12:09
Que es la raíz de la jerarquía siempre
00:12:11
De cualquier conjunto de clases en Java
00:12:13
Vamos a ver por curiosidad que tiene
00:12:15
Esta clase object
00:12:17
Entonces recordad, esto estar o no estar
00:12:18
Es lo mismo, vale, vamos a ver que tiene object
00:12:21
Bueno, es que object hasta que la abre
00:12:23
Este
00:12:31
Uf, se está mil horas
00:12:32
Debería haberla buscado a mano
00:12:35
Igual si la busco a mano
00:12:42
Porque está en
00:12:50
Avalanche
00:12:51
Así es más rápido
00:12:51
Vale, esta es la clase object
00:13:03
Esta sí que no hereda de nadie
00:13:05
Que ya está dada
00:13:07
Y todo eso, y no tiene nada
00:13:09
Tiene un constructor
00:13:11
Sin parámetros
00:13:12
Vale, luego cuando una clase
00:13:14
cualquiera que hacemos que no era de nadie
00:13:17
nos pone automáticamente
00:13:19
el eclipse, un super sin parámetros
00:13:21
está llamando a este, que no hace nada
00:13:23
bueno, por eso decíamos cuando nos aparecía
00:13:24
loquito y ya está, porque es que no hace nada
00:13:27
claro, el super siempre es
00:13:29
constructor de la superclase
00:13:31
cuando la superclase es
00:13:33
object, pues
00:13:35
poner el super y no ponerlo es lo mismo, porque es que no me está
00:13:37
haciendo nada el constructor de la superclase
00:13:39
¿vale?
00:13:41
¿y qué tiene? pues tiene algunos
00:13:43
métodos muy chorras que hasta ahora
00:13:45
algunos los hemos usado
00:13:47
sin saber exactamente que hacían
00:13:50
getClass
00:13:52
te devuelve el nombre de la clase
00:13:54
al que pertenece ese objeto
00:13:56
este te genera
00:13:57
un código hash para ese objeto
00:14:00
que todavía no lo necesitamos pero lo necesitaremos
00:14:02
más adelante
00:14:04
y sí que hemos usado uno
00:14:04
este, ¿verdad?
00:14:07
este método lo hemos usado para objetos
00:14:09
a veces, ¿vale?
00:14:11
el método id
00:14:13
pues este método
00:14:14
Está heredado de object
00:14:16
Entonces, por ejemplo
00:14:18
Mi cliente que hereda de object
00:14:20
Da igual que yo lo ponga o no, porque hereda de object
00:14:22
Si yo
00:14:24
Ahora en mi main
00:14:26
En mi main de pruebas, este de aquí cualquiera
00:14:27
Pues tengo mi objeto cliente
00:14:34
Que es c
00:14:40
Vale, vamos a hacer un específico
00:14:40
Cliente
00:14:45
Vale, pues este objeto cliente
00:14:46
Tiene un método equals
00:14:57
Al que puede llamar
00:14:59
Vale
00:15:00
tiene un método equals al que puede llamar
00:15:02
y a este método equals al que puede
00:15:04
llamar, este método ¿cuál será?
00:15:07
en cliente no está declarado
00:15:09
entonces este método equals
00:15:11
será el que hereda automáticamente de
00:15:13
object y el que hereda de object
00:15:15
es este, el que hereda
00:15:17
de object se le puede pasar cualquier
00:15:18
objeto, el que a mí me dé la gana
00:15:20
cualquiera y me devuelve
00:15:22
un true, ¿y qué hace este equals?
00:15:24
es un equals muy básico
00:15:26
compara si la
00:15:28
dirección de memoria del objeto
00:15:31
que yo paso, es idéntica
00:15:32
a la dirección de memoria del objeto
00:15:35
que lo llamo.
00:15:37
Ya alguna vez lo hemos mencionado.
00:15:38
Si yo hago un equals entre un
00:15:41
objeto y otro objeto,
00:15:42
lo que hace el equals,
00:15:45
a menos que yo lo tenga sobrescrito en la
00:15:47
clase cliente, claro, a menos que lo tenga
00:15:48
sobrescrito. Si yo no lo tengo sobrescrito,
00:15:50
el equals,
00:15:53
la versión que usa es la heredada.
00:15:54
¿La heredada de quién? Pues de
00:15:57
object, porque cliente
00:15:58
heredada de object la heredada y la versión heredada de equals que hace pues si no se va
00:16:00
a igual a lo que hace es ver si son exactamente iguales exactamente iguales esta dirección de
00:16:07
memoria y la dirección de memoria del objeto es decir si un objeto y otro en memoria ram son el
00:16:13
mismo están uno encima del otro no sé su contenido es igual porque yo puedo tener un objeto en esta
00:16:19
dirección de memoria otro objeto en esta dirección de memoria tenerlas los mismos valores en las
00:16:24
propiedades, pero este
00:16:29
equals me daría false
00:16:31
porque uno y otro no están
00:16:32
en la misma dirección de memoria
00:16:35
bueno, pues el método equals de object
00:16:37
lo que te ofrece es eso
00:16:39
que es muy sencillo, te dice
00:16:41
oye, yo te digo que son iguales
00:16:43
si uno y otro están en la misma dirección
00:16:45
si tú quieres que la igualdad
00:16:46
sea por otras cosas
00:16:49
sea dos objetos son iguales
00:16:50
si el nombre es el mismo
00:16:53
que eso tiene más sentido, dos clientes en mi aplicación
00:16:54
son iguales
00:16:57
Si su nombre es igual
00:16:59
Eso tiene mucho más sentido
00:17:00
Este sentido no es un sentido real
00:17:02
Yo puedo tener en mi aplicación
00:17:05
Dos personas
00:17:08
Con el mismo DNI
00:17:09
Porque una la he cargado de la base de datos
00:17:11
En un momento
00:17:14
Y otra la he cargado después de otra base de datos
00:17:15
Tengo dos objetos distintos
00:17:18
Pero el DNI es igual
00:17:20
Entonces si yo llamo a este equals
00:17:22
Para ver si uno es otro
00:17:25
Me va a decir no, no, son dos personas distintas
00:17:26
la aplicación funcionaría mal
00:17:28
porque aunque esté cargada en objetos distintos
00:17:30
se refiere a la misma
00:17:32
se refiere a la misma persona, mismo DNI
00:17:34
aunque estén objetos diferentes
00:17:36
luego, en casos así
00:17:37
cuando yo ya estoy haciendo la aplicación bien, la estoy diseñando
00:17:40
bien, tendría que ver, oye, ojo
00:17:42
que el método equals
00:17:44
que heredo de object es que no me interesa
00:17:45
porque cuando yo quiera ver
00:17:48
si un cliente es igual que otro cliente
00:17:50
me va a decir false
00:17:52
aunque tenga el mismo DNI, me va a decir false
00:17:54
entonces esta versión no me interesa
00:17:56
vale, pues por eso, ¿qué hacemos a veces?
00:17:57
en la clase
00:18:01
que le dé de object, sobreescribir
00:18:02
este método
00:18:04
sobreescribir el equals
00:18:04
este de aquí, sobreescribir este
00:18:07
¿vale?
00:18:09
entonces aquí en mi aplicación, si yo quiero
00:18:11
incluir que
00:18:14
cuando tenga dos objetos
00:18:15
que vete a saber de dónde han salido
00:18:17
de dónde se han leído, de dónde se han pasado
00:18:19
si son el mismo DNI, entonces quiero
00:18:21
que la aplicación entienda que es el mismo cliente
00:18:23
porque son el mismo DNI y el mismo cliente
00:18:25
Aunque esté cargado en varios objetos distintos
00:18:27
Pues si quiero que entienda eso
00:18:29
Tengo que sobreescribir el método equals
00:18:31
¿Vale?
00:18:34
Pues sobreescribo el método equals
00:18:35
Que tiene exactamente esta cabecera
00:18:37
Sobreescribo el método equals
00:18:39
¿Veis? Me aparece aquí el verdecito
00:18:45
Y aquí ya digo
00:18:46
Oye, ¿qué quiero yo?
00:18:48
¿Cuándo quiero que me devuelva true?
00:18:51
¿Y cuándo quiero que me devuelva false?
00:18:52
¿Quiero que me devuelva true?
00:18:53
Si los dos de ne son iguales
00:18:55
Y quiero que me devuelva false si no
00:18:56
pues entonces yo aquí ya podría poner
00:18:58
return
00:19:01
dis.dni
00:19:02
igual a
00:19:04
bueno el objeto obj
00:19:06
tendría que hacer un casting
00:19:08
a cliente
00:19:11
porque yo aquí puedo mandar
00:19:12
un objeto genérico
00:19:15
pero se supone que yo quiero comparar cuando un objeto
00:19:16
sea igual a otro, luego le pasaría un cliente
00:19:19
como aquí le paso un cliente
00:19:20
este cliente de aquí
00:19:23
para ver si este es igual que este
00:19:24
Vale, entonces, me hago el casting a cliente de este objeto y ahora ya devuelvo esta igualdad, vj.dn.
00:19:27
vale, entonces
00:19:57
esto es un string y esto es un string
00:20:00
vj, no, perdón
00:20:02
esto es un string
00:20:05
que es el dni del objeto en el que estoy
00:20:09
que llama al método
00:20:11
y este es otro string, que es el dni del pasado
00:20:12
como parámetro, que lo he hecho el casting
00:20:15
para poder hacer la propia dni, porque si no hago el casting
00:20:17
no puedo hacer la propia dni
00:20:19
vale, de nuevo string
00:20:20
son objetos
00:20:23
esto ya sí que de toda la vida hacemos
00:20:24
cuando quiero ver si un string es igual que otro
00:20:26
llamamos a equals
00:20:29
y ahora ya podemos entender
00:20:30
porque en la clase string llamamos a equals
00:20:32
sino el doble igual
00:20:34
porque cuando yo quiero comparar dos cadenas
00:20:35
quiero comparar si tienen el mismo texto
00:20:38
quiero comparar si una cadena es
00:20:40
hola Pepito y hola Pepito
00:20:42
pero no quiero, me da igual
00:20:44
que estén en la misma posición de memoria
00:20:46
o que estén en distinta, me da igual
00:20:48
lo que yo quiero es comparar si
00:20:50
aquí pone hola Pepito y aquí pone hola Pepito
00:20:52
Entonces, la clase string
00:20:54
Como hereda de object
00:20:56
La clase string
00:20:58
Ha implementado su propia versión de equals
00:21:00
¿Vale?
00:21:03
Entonces, la clase string
00:21:04
Si uno la abriera por aquí
00:21:05
La clase string
00:21:08
Que está aquí abajo
00:21:17
¿Vale? Hereda de object
00:21:18
Como todas las clases del mundo
00:21:22
¿Vale? Y aparte implementa cosas
00:21:24
Pero eso ahora lo entenderemos
00:21:27
Hereda de object como todas las del mundo
00:21:28
No tiene ningún stance de nadie, pues hereda de object
00:21:30
vale, y entonces
00:21:32
su equals sería
00:21:34
el feo, el equals de
00:21:36
string sería el que te dice que
00:21:38
este string está en la misma posición de memoria
00:21:40
que el otro, el mismo, no encima de otro
00:21:43
no es el string que queremos
00:21:44
no es el equals que queremos, el equals de string
00:21:46
es, oye, quiero saber si este texto
00:21:49
es igual que este texto
00:21:51
me da igual que estén en posiciones de memoria distintas
00:21:52
pues por eso la clase string
00:21:54
tiene su propia versión de
00:21:56
equals, que estará por ahí
00:21:58
que es esta
00:22:01
¿Vale?
00:22:09
¿Ves? Sobrescribe
00:22:11
Sobrescribe
00:22:13
el equals de object
00:22:14
y lo sobrescribe diciendo
00:22:17
oye, no, yo quiero ver si todos
00:22:19
los caracteres, bueno, se hace
00:22:21
todas estas cosas raras
00:22:23
si el objeto que me pasas aquí
00:22:24
es un string
00:22:27
pues entonces haces todo esto
00:22:28
patatín, patatán y ya
00:22:30
es una versión propia suya
00:22:32
para la clase string
00:22:34
la versión suya de stream
00:22:35
vale, pues entonces
00:22:36
estábamos ahora haciéndonos nuestra
00:22:39
versión propia de equals
00:22:41
para cliente, para no tener la heredera de
00:22:43
object, bueno pues nuestra versión
00:22:45
es, oye devuélveme true
00:22:47
si el dni
00:22:49
del objeto que llama al método
00:22:51
es igual que
00:22:53
el parámetro
00:22:55
ya tengo mi versión de equals, luego otro ejemplo
00:22:56
más de por qué necesitamos
00:22:59
la herencia
00:23:01
vale, entonces el método equals
00:23:01
este es el método más usado
00:23:05
y más polimórfico del mundo, cuando tú llamas
00:23:07
a equals de un string, estás llamando a la versión de
00:23:09
la clase string, cuando llamas a
00:23:11
equals de cliente, estás llamando a este, cuando llamas
00:23:13
a equals de no sé qué
00:23:15
pero si no hubiera un equals
00:23:16
propio, pues estaríamos llamando
00:23:19
al equals este, de object
00:23:21
que compara direcciones de memoria sin más
00:23:22
entonces aquí en nuestro main de pruebas
00:23:24
¿vale? en nuestro main de pruebas
00:23:27
por ejemplo, vamos a poner
00:23:33
aquí el DNI de este cliente
00:23:34
te estás durmiendo, ¿verdad?
00:23:37
no, no, me estoy durmiendo
00:23:39
sí, te estás durmiendo
00:23:40
¿estás qué?
00:23:42
se me está quemando el cerebro
00:23:45
vale, por ejemplo
00:23:46
íbamos a comparar este cliente
00:23:52
con el DNI1, con este C
00:23:54
que estaba aquí arriba
00:23:55
que este C
00:23:57
o lo habíamos puesto a null, vamos a ponerle
00:23:58
no, el mismo
00:24:01
para ver que, vale, entonces
00:24:04
este c
00:24:06
es un objeto que está por ahí
00:24:08
con sus propiedades
00:24:10
¿vale? y este otro
00:24:11
cli es otro objeto que está por ahí con sus propiedades
00:24:14
pero los dos tienen el mismo dna
00:24:16
luego cuando yo
00:24:18
mire a ver si uno es igual que otro porque lo
00:24:20
necesita para, porque mi aplicación
00:24:22
quiere hacer la comprobación que sea lo que sea
00:24:24
porque quiero ver si hay duplicados para
00:24:26
quitar uno, si no estar, vale
00:24:28
para lo que sea, si quiere ver que uno es igual que otro
00:24:30
pues hará esto, y como tenemos
00:24:32
sobrescrito equals, pues
00:24:34
ahora aquí nos dice true.
00:24:36
Son iguales. ¿Vale?
00:24:38
Pero si no hubiéramos sobrescrito
00:24:40
el método equals aquí,
00:24:42
si no lo hubiéramos sobrescrito,
00:24:44
porque no nos hubiéramos acordado
00:24:46
de sobrescribirlo
00:24:51
y nuestra aplicación va a necesitar a veces
00:24:53
ver si un cliente es igual a otro.
00:24:55
O sea, si la aplicación no lo necesita, no es grave.
00:24:57
Pero si mi aplicación va a necesitar a veces
00:24:59
ver si un cliente es igual a otro y a mí se me ha olvidado
00:25:01
sobrescribir mi propia versión
00:25:03
de equals, la buena,
00:25:05
la que yo decida por DNI, por nombre, si se me ha olvidado,
00:25:07
ahora mi aplicación va a funcionar igual, pero me dice, no, no son iguales.
00:25:10
Vale, y yo sigo procediendo, sigo haciendo cosas sobre un supuesto falso.
00:25:15
Porque este cliente y este sí que son, son iguales.
00:25:19
Pero sin haber sobrescrito el equals me dice que son distintos, me dice falso,
00:25:23
porque este es un objeto en una dirección de memoria
00:25:27
y este es otro en otra dirección de memoria.
00:25:30
¿Está claro?
00:25:36
Vale, pues ahora entonces, gracias a la herencia, entendemos un poco más el equals de dónde sale y la importancia de sobrescribirlo en nuestras clases si vamos a necesitar ver si un objeto es igual a otro según un criterio propio.
00:25:37
Vale, string ya lo tiene sobrescrito, por eso lo usamos siempre sin más, etc.
00:25:50
Vale, todo esto venía a cuenta del object, que aunque nosotros no lo veamos y no lo sepamos, cualquier clase hereda de object y tiene todo lo de object.
00:25:55
Y si hereda de otra, también lo va a tener, porque recordad que el árbol este de herencia, si esta hereda de esta, tiene todo lo de esta.
00:26:06
Ahora, esta de aquí hereda de esta, pues tiene todo lo de esta, que a su vez tenía todo lo de la de arriba.
00:26:13
Luego cada uno tiene todo lo de su padre, abuelo, bisabuelo, etcétera, etcétera.
00:26:18
Bueno, pues todo esto venía a cuento de la clase object, que es la base de toda la jerarquía de clases,
00:26:23
que se nos quedaba
00:26:30
corto, porque puede haber clases
00:26:33
que interese
00:26:35
que adopten
00:26:37
funcionalidades de dos clases
00:26:38
distintas
00:26:43
y yo no puedo fusionarlas
00:26:43
porque por ejemplo, hay situaciones en las que sí
00:26:46
uno podría
00:26:50
a ver, que se nos ocurre
00:26:52
vale, pues imaginaos
00:26:55
un zoológico
00:26:57
en el tiempo de los robots
00:27:00
dentro de 300 años
00:27:02
entonces, claro, los robots
00:27:03
dominan el mundo y tienen su zoológico
00:27:06
donde tenemos humanos y animales
00:27:07
o sea, animales en general
00:27:10
¿vale?
00:27:11
entonces
00:27:13
los humanos y los animales no humanos
00:27:13
pues en principio
00:27:18
tienen características distintas
00:27:20
podría decir
00:27:24
entonces
00:27:25
se podría hacer
00:27:26
una clase, humanos
00:27:28
hay, pues yo que sé
00:27:30
humanos
00:27:32
no lo sé, españoles
00:27:33
franceses, alemanes, entonces para eso es una clase
00:27:36
se puede hacer una super clase
00:27:38
humano general, con todo lo que tenga
00:27:40
humano, y luego ya cada uno pues
00:27:42
mujeres, hombres, lo que sea
00:27:44
con animales igual
00:27:45
gatos, perros, caballos, una super clase
00:27:47
animal, pero a su vez
00:27:50
si dejamos la jerarquía
00:27:51
por separado pues habrá cosas
00:27:54
que comparten los dos
00:27:56
los humanos y los animales
00:27:58
pues todos tienen
00:27:59
todos comen y todos cagan
00:28:00
bueno vale pues comer
00:28:06
vale pues entonces
00:28:08
ahí
00:28:09
se podría solucionar haciendo una
00:28:11
super clase de estas dos por separadas
00:28:14
de humano y de animal
00:28:16
pues se hace una super clase que es
00:28:17
miembro del zoo por ejemplo
00:28:20
entonces se pueden solucionar
00:28:21
pero claro
00:28:23
y todos hacen todo lo que haya en miembro del zoo
00:28:24
pero podría haber situaciones que no sean fáciles
00:28:28
de solucionar así, por ejemplo
00:28:30
los robots
00:28:31
como son peores personajes
00:28:33
que nosotros, pues también meten
00:28:36
en su propio zoológico a robots
00:28:38
por ejemplo
00:28:40
entonces el zoológico de los robots del futuro
00:28:41
tiene robots
00:28:44
humanos y animales
00:28:46
¿vale? a ver que no me pierda
00:28:48
yo
00:28:50
Entonces, esto es para que entiendas una situación, como puede haber tantas, en las cuales necesitas herencia múltiple, ¿vale?
00:28:51
Entonces, ¿qué ocurre aquí? Que los humanos y los robots hablan, los animales no.
00:29:01
¿Tú no sabes que los animales hablan también, no?
00:29:09
No, los del zoológico y los robots no hablan.
00:29:13
¿Los zoológicos?
00:29:15
No, esos no hablan.
00:29:16
Yo te juro que te pongo hasta los robots, sí.
00:29:17
bueno pero le ponemos directamente la parte de animalitos dóciles vale entonces qué ocurre que
00:29:19
ahí pone hacer la jerarquía con una superclase miembro del zoo pues hombre no se adapta porque
00:29:31
el método hablar vale el método de hablar pues solamente lo tienen los humanos y los robots pero
00:29:39
Sin embargo, no queremos que lo tengan los animales,
00:29:47
pero si hay cosas que tienen compartida.
00:29:50
Entonces, a lo mejor podríamos hacer una superclase
00:29:52
habladores, con todas las cosas relacionadas con hablar,
00:29:54
porque se trata de forma distinta.
00:29:59
Entonces, humanos y robots queremos que hereden de
00:30:01
habladores, pero animales no queremos que hereden de
00:30:03
habladores, porque todo relacionado con habladores es
00:30:05
mucho y no queremos que lo hereden porque es meter ahí un
00:30:07
montón de cosas que podemos luego a lo mejor usarlas por no
00:30:09
ser cuidadosos y la hemos cagado con la aplicación.
00:30:13
Entonces, esto se le dan de animal, sin más.
00:30:17
Pero a su vez queremos que todos hereden de la superclase
00:30:21
que tiene todo relacionado con comer, con cagar, etc.
00:30:23
Entonces, ¿cómo resolvemos eso?
00:30:26
Pues se queda muy complicado.
00:30:28
Entonces, ¿cómo lo resolveríamos?
00:30:30
Pues hacemos una superclase, que eso ahora lo vemos después,
00:30:31
por ejemplo, pensada en todo lo que comparten todos
00:30:35
de cara a su descripción.
00:30:41
Propiedades que todos comparten, etc.
00:30:42
Y luego ya, si alguna de esas entidades que hay abajo tienen características diferenciadas, las metemos en una interfaz, lo que se llama una interfaz, y ahora de esas subclases, las que tengan esa característica diferencial, que además, en nuestro caso, que sería hablar, todo lo de animales, pero además hablar, pues esas que implementen esta interfaz que acabo de hacer.
00:30:44
Entonces, tendría animales que heredan de, perdón, sí, gatos, perros, no sé qué, que heredan de animal, ¿vale? Luego, además, tendría humanos que heredan de animal, ¿vale? Robot no puede heredar de animal, ¿vale? Y luego tendría robot y humano que implementa habladores, ¿vale?
00:31:11
Entonces puedo flexibilizar muchísimo mi jerarquía gracias a esto de las interfaces.
00:31:33
Y decido, vale, tú le das de aquí, pero además implementas esto,
00:31:40
con lo cual tienes esto de aquí, pero te comportas de esta manera,
00:31:43
que el otro no se puede comportar así, el animal no puede hablar,
00:31:45
luego no puedo implementar esto, pero tú sí tienes lo suyo,
00:31:48
luego le das de su superclase.
00:31:51
Bueno, más o menos.
00:31:53
Yo a ti lo dibujo como si fuese un arbolito porque...
00:31:55
Sí, pero no se nota, ¿no? O sí se nota.
00:31:59
Sí, se nota un poco que me estoy perdiendo, ¿no?
00:32:03
Por eso, si quieres, dibújalo ahí con palitos y cuadraditos.
00:32:05
Sí, más que dibujarlo, vamos a poner un ejemplo ahora de cómo son las interfaces,
00:32:09
cómo se, bueno, ahora o después, cómo se programa una interfaz,
00:32:14
cómo se implementa una interfaz y cómo se usa.
00:32:18
Ya está, un ejemplito.
00:32:21
Y luego ya, sobre todo a nosotros, lo que nos importa sobre todo,
00:32:23
es que este concepto
00:32:28
de interfaces, clases y clases abstractas
00:32:32
que ya vimos el otro día
00:32:35
es sobre el que se diseña todo
00:32:35
entonces nosotros a partir de ahora
00:32:38
¿qué vamos a usar?
00:32:39
vamos a usar un montón de paquetes
00:32:41
por ejemplo, todo el que gestiona las excepciones
00:32:43
todo el que gestiona las colecciones
00:32:46
todo el que gestiona las interfaces gráficas
00:32:49
vamos a usarlo
00:32:51
pues todos esos paquetes están todos
00:32:52
metidos en una jerarquía
00:32:54
de interfaces y clases abstractas y clases
00:32:56
normales. Ahí es un sumo bollón.
00:32:58
Entonces tenemos que entender
00:33:00
cómo se usa un montón de
00:33:01
clases que tienen jerarquías entre ellas.
00:33:04
Nos interesa eso más
00:33:07
que hacer la parte
00:33:08
de diseño, que es tengo una situación
00:33:10
que diseño me
00:33:12
queda bien, que no sé qué, más que eso.
00:33:14
Sobre todo lo que nos interesa es entender
00:33:16
cómo poder usar un montón de clases
00:33:18
que están relacionadas de esa manera, como las
00:33:20
excepciones, colecciones, etc.
00:33:22
¿Entendido?
00:33:25
Pues hala, idos a comer que es lo que más os gusta hacer
00:33:26
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 17
- Fecha:
- 26 de enero de 2025 - 19:24
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 33′ 35″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 384.59 MBytes