20250124 Interfaces_2 - 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:
Vale, pues entonces
00:00:00
Hacemos nuestro, estábamos haciendo
00:00:03
Nuestro
00:00:05
Diseño de clases
00:00:07
Para gestionar este zoológico
00:00:09
Del 2050
00:00:11
No, bueno, del 2200
00:00:12
Venga, pues ya está
00:00:15
Todos los animales van a tener nombre, descripción
00:00:16
Y un historial de acciones que se han hecho con ellos
00:00:18
Vale, y ya está
00:00:20
Y aquí podríamos poner los get, los set
00:00:23
Todo el rollo moruno de toda la vida
00:00:25
¿Vale?
00:00:27
venga, sí, ahora que sabemos hacer las cosas rápidamente
00:00:30
un constructor
00:00:33
con parámetros
00:00:34
siempre ponemos
00:00:35
uno sin parámetros
00:00:38
ahora, si somos super clase
00:00:39
de otra clase que nos va a heredar
00:00:42
más que nunca viene bien un constructor sin parámetros
00:00:44
porque si luego hacemos
00:00:47
uno sin parámetros en la de abajo
00:00:48
nos va a decir
00:00:50
que este super implícito de aquí
00:00:50
no tiene constructor sin parámetros arriba
00:00:54
entonces, si hacemos constructores
00:00:56
a lo bestia para dar y tomar
00:00:58
seguramente nos ahorremos
00:01:00
problemas en el futuro
00:01:03
pues venga
00:01:04
constructor con parámetros
00:01:07
constructor sin parámetros
00:01:08
nuestra clase animal
00:01:10
de la cual heredarán
00:01:16
gatos, perros
00:01:17
caballos
00:01:20
y humanos
00:01:21
¿verdad?
00:01:22
vale, entonces vamos a hacer
00:01:25
un humano y un perro
00:01:27
¿no?
00:01:29
que heredan de animal, pues entonces
00:01:30
por ahora en el zoológico los robots solo han metido perros
00:01:33
por ahora, están ampliando, pero por ahora como solo han metido
00:01:38
perros, pues hacemos una clase perro solo
00:01:42
y el perro aparte del nombre, la descripción
00:01:45
y el historial de acciones que se han hecho con él, pues el perro
00:01:53
tiene algo que lo caracteriza respecto a
00:01:57
otros animales que no son perros
00:02:01
como por ejemplo
00:02:03
una raza, sí, lo que pasa es que una raza
00:02:05
se podría meter en animal, porque hay muchos animales que se caracterizan
00:02:09
un perro
00:02:12
yo creo que es el único
00:02:13
animal que ladra
00:02:15
entonces
00:02:17
se le podría
00:02:18
el lobo agulla
00:02:20
pero no ladra
00:02:26
¿tú has oído algún lobo hacer una de
00:02:27
pues no
00:02:28
Yo he visto lobos
00:02:29
Y vosotros también en el zoo seguro
00:02:32
Bueno, pues que los robots
00:02:35
En función del volumen del ladrido del perro
00:02:42
Pues lo ponen en un sitio
00:02:45
Donde dé más o menos por saco
00:02:46
Entonces tienen que tener registrado
00:02:49
El volumen del ladrido
00:02:50
¿Vale?
00:02:51
Vale, pues venga
00:02:56
Ponemos unos get in, unos set
00:02:57
constructor, sí, puedo hacer
00:02:59
constructor o no
00:03:04
vale, sobre todo me importa
00:03:06
en la superclase porque si luego la subclase
00:03:08
va a querer hacer y no tiene
00:03:10
aquí si no hago constructor
00:03:12
lo único que está ocurriendo es que tengo un constructor
00:03:14
sin parámetros por defecto y ya está, no pasa nada
00:03:16
que es lo que sabemos de toda la vida
00:03:19
que si una clase no tiene constructores
00:03:20
tiene uno por defecto y escondido
00:03:22
venga, tenemos el perro
00:03:24
pero por dios
00:03:27
Se nos ha olvidado decir que el perro hereda de animal.
00:03:28
Entonces, como se nos ha olvidado decir que el perro hereda de animal,
00:03:33
este perro se había quedado solo ladrando, pero no tenía nombre ni tenía nada.
00:03:36
Ahora ya tiene todo.
00:03:40
Vale.
00:03:42
Y ahora, en el zoológico empiezan a meter humanos.
00:03:43
Pues nada.
00:03:47
Empezamos a meter al humano en el zoológico.
00:03:50
Entonces, el humano es un animal.
00:03:57
tiene su nombre, su descripción y el historial
00:03:59
de acciones que se han hecho con él en el zoológico
00:04:01
pues el humano
00:04:03
hereda del animal
00:04:05
y bueno, además incorporará cosas
00:04:06
pues yo que sé, cualquier chorrada
00:04:09
el
00:04:10
humano
00:04:12
pues lo que incorpora
00:04:14
es
00:04:17
bien pensado
00:04:18
el cociente de inteligencia
00:04:28
Porque en función de inteligencia, pues el robot decide meter al humano en una celda más segura o menos segura.
00:04:30
Cuanto más tonto sea, pues menos...
00:04:36
Por ejemplo, en función del cociente de inteligencia.
00:04:38
Ya está, ponemos el Getty Set de esto que añade.
00:04:45
Bueno, siendo justos, si los robots nos han dominado es que son más listos.
00:04:47
Entonces nos van a ver como una mierda.
00:04:52
Entonces les va a dar igual lo listo que somos.
00:04:53
Bueno, a ver, nosotros tenemos miedo
00:04:55
a entes que son más tontos
00:05:00
que nosotros
00:05:02
¿Tú te enfrentarías a un
00:05:03
gorila?
00:05:06
Sí, depende
00:05:07
Si gano, que me da
00:05:08
Nuestra rendida admiración
00:05:11
Eso no compensa, ¿no?
00:05:14
Vale
00:05:16
Vale, entonces
00:05:17
el humano hereda de animal
00:05:20
Pero los robots
00:05:21
son malvados, entonces se encierran
00:05:24
entre ellos también, porque se dominan unos
00:05:26
a los otros, nosotros no hemos hecho
00:05:28
zoológicos con otros humanos
00:05:30
pero ellos perfectamente podrían hacer un zoológico
00:05:31
en el que metan otros robots
00:05:34
entonces
00:05:35
claro
00:05:37
entonces tenemos nuestro robot
00:05:39
nuestra clase robot
00:05:42
que incorpora su código
00:05:43
de serie, su número de serie
00:05:46
que tiene su número de serie
00:05:47
vale, pero
00:05:52
robot es un animal
00:05:54
no es un animal
00:05:55
entonces no tiene sentido que herede de animal
00:05:57
hombre, ahora mismo lo que hemos puesto en animal
00:05:59
lo podría heredar, pero a ver
00:06:01
porque tampoco se nos ha ocurrido nada específico de animal
00:06:03
podríamos poner
00:06:05
en un animal también
00:06:08
justo, justo iba a poner eso
00:06:09
género, y un robot no tiene
00:06:11
género, al menos en este mundo
00:06:14
en el 2200, en el 2300 igual ya sí
00:06:15
vamos a añadir el getter y el setter
00:06:18
del género que hemos puesto
00:06:20
Bueno, pues las amebas
00:06:21
Las amebas tienen género
00:06:30
Los gusanos tienen género
00:06:34
Pero los robots no tienen género
00:06:36
Entonces
00:06:38
Aquí al
00:06:39
Super robot que está haciendo esta aplicación
00:06:40
Pues dice
00:06:43
No puedo poner animal
00:06:45
Porque mi robot no tiene género
00:06:46
No puedo poner animal
00:06:49
bueno, pues lo podríamos dejar así
00:06:50
ahora empezamos a incorporar más funcionalidades
00:06:53
a ver, que sé que el ejemplo está completamente pillado
00:06:55
por los pelos, pero bueno, la idea es entender
00:06:57
un poquito cómo meter una interfaz
00:06:59
vale, pero resulta que los humanos y los robots
00:07:00
hablan, y es importante
00:07:03
poder hablar con ellos
00:07:05
en los procedimientos
00:07:07
del zoológico para tratar con ellos y todo
00:07:09
entonces, los robots
00:07:11
y los humanos tienen que implementar
00:07:13
un método hablar
00:07:15
vale
00:07:16
Un método a hablar, pues cuando tú lo invocas, pues ya está, lo que sea. Vale, entonces, este método, pues nada, te devuelve cualquier cosa, ¿vale? Al azar. Vale, pues el robot habla, pero los humanos también hablan, entonces, los humanos también tienen que tener un método a hablar.
00:07:17
Bueno, vamos a poner aquí el public
00:07:58
El humano también habla
00:08:01
Pero no habla como el robot
00:08:06
Habla distinto
00:08:08
Bueno, tendrá aquí su método hablar
00:08:09
Y el humano
00:08:13
Pues
00:08:27
Como tiene sentimientos
00:08:28
Pues en lugar de decir cualquier cosa
00:08:30
Porque le da igual estar encerrado o no estar encerrado
00:08:32
Pues devuelve otra cosa
00:08:34
Vale
00:08:37
Bueno, pues entonces
00:08:41
Aquí
00:08:44
el asunto es
00:08:45
nosotros podemos dejar la estructura así
00:08:48
y tenemos animal
00:08:50
de donde heredan, perro y
00:08:51
humano, vale, entonces yo aquí en mi main
00:08:54
de pruebas
00:08:56
yo me hago aquí un main de pruebas
00:08:56
un paquete
00:09:00
de main
00:09:04
con mi main de pruebas
00:09:05
ay
00:09:07
siempre se me olvida esto
00:09:27
si, hay una forma de poner
00:09:31
cuál es el atajo
00:09:32
de verdad, si se trata de ahorrar trabajo
00:09:34
¿cuánto sabéis?
00:09:38
ay, pero me va
00:09:41
y por qué no
00:09:42
control espacio, pero me ofrece
00:09:44
un huevo de cosas
00:09:46
ah, main method está aquí, vale
00:09:47
venga
00:09:50
venga, entonces
00:09:52
yo soy libre
00:09:54
porque la inteligencia me ha hecho libre
00:09:57
pero la tuya está en un estado
00:09:59
todavía un poco catatónico
00:10:01
o estudian más programación
00:10:02
venga, entonces ahora
00:10:04
el tener esta estructura, ahora ya la aplicación
00:10:07
principal al super robot
00:10:09
que hace la aplicación
00:10:11
pues hay muchas cosas que le vienen muy bien
00:10:13
pues él puede tener aquí, oye tengo aquí
00:10:15
todos mis animales
00:10:17
porque a estos animales
00:10:18
míos, pues
00:10:21
de aquí
00:10:23
mis perros y mis humanos
00:10:25
que resulta que me han dicho
00:10:26
que me van a traer, mi zoológico
00:10:29
va a tener solamente tres humanos
00:10:31
y cuatro perros, pues venga
00:10:33
siete personas
00:10:35
vale, entonces importo esto
00:10:36
lógicamente del paquete correspondiente
00:10:41
y aquí ya sabemos
00:10:43
aquí ya, pues podría meter el
00:10:45
super robot
00:10:47
en animales, pues podría
00:10:48
ya poner lo que fuera
00:10:51
en la posición cero, me has traído
00:10:52
un humano, venga
00:10:55
pues un humano
00:10:57
Un nuevo humano
00:10:59
Y a este humano ya le puedo poner el nombre
00:11:07
Lo que sea
00:11:09
Por ejemplo
00:11:10
Este humano pues se llama
00:11:14
Pedrito
00:11:17
Y va a molestar mucho
00:11:19
Con lo cual le vamos a encerrar
00:11:23
Bajo 20 llaves
00:11:26
Vale
00:11:28
Entonces ahora al
00:11:29
Super robot le llegan robots
00:11:31
Vale
00:11:34
Los robots no los puede meter
00:11:35
En este array
00:11:38
No los puede meter en este array
00:11:40
¿Vale? Entonces
00:11:41
Si le van a llegar robots
00:11:43
Pues bueno, para empezar tendría que hacer
00:11:45
Su array específico de robots
00:11:47
¿Verdad? Tendría que hacer su array específico
00:11:49
De robot
00:11:52
¿Qué?
00:11:53
Bueno, da igual
00:11:57
Lo que me ha ofrecido
00:11:59
Efectivamente
00:11:59
bueno pues si le van a llegar
00:12:02
6 robots pues tendría que hacer
00:12:08
su a raíz de robot
00:12:10
cuidado porque hay
00:12:12
en el paquete JWT
00:12:18
hay una clase robot
00:12:20
entonces cuidado con hacer el import automático
00:12:21
esta es la primera vez que nos ocurre
00:12:24
pero ocurrirá mucho
00:12:26
en el futuro
00:12:28
que hay varias clases
00:12:29
que tú puedes hacer una clase
00:12:32
y en otros paquetes
00:12:33
hay otras clases que se llaman así
00:12:35
entonces el Eclipse cuando te hace el import
00:12:38
te ofrece todas las que ha encontrado
00:12:41
dentro de tu estructura de paquetes
00:12:43
que se llaman así
00:12:45
pues en JWT hay una que se llama Robot
00:12:46
que no sabemos que narices era
00:12:48
JWT es un paquete para hacer interfaces gráficas
00:12:50
entonces no sé que será eso
00:12:53
cuidado con que no hagáis automáticamente el clean clean
00:12:55
mirad que importéis la buena
00:12:59
en nuestro caso es la de modelo
00:13:01
no la de arriba, la de JWT
00:13:03
es la de modelo
00:13:05
vale, y aquí uno ya podría poner
00:13:07
sus robots y lo que fuera
00:13:10
vale
00:13:12
pues el robot
00:13:13
cero
00:13:17
sería un nuevo robot
00:13:18
uy
00:13:23
pues el robot cero
00:13:25
ya está, que tiene un número de serie
00:13:31
el que fuera
00:13:34
cero, punto
00:13:34
no he puesto public el set
00:13:36
de robots
00:13:39
Ah, es que no le he hecho ni
00:13:42
No le he hecho el
00:13:44
El set del número de serie
00:13:47
Vale, entonces ahora yo aquí
00:13:49
Pues ya se le podría poner
00:14:10
Pues yo que sé
00:14:12
Número de serie, lo que fuera
00:14:15
Va, el número de serie que es entero
00:14:16
Luego, no es stream
00:14:24
Es entero
00:14:26
Vale, entonces ahora en mi zoológico tengo
00:14:27
Eh
00:14:30
Humanos y animales metidos aquí
00:14:31
Y robots metidos aquí
00:14:34
Pero están por libre. Entonces, si yo ahora quisiera ponerme a hablar, por ejemplo, con todos los que hablen, que son los humanos y los robots, pues no puedo tirar un bucle sin más que me hable con todos.
00:14:35
tendría que ir recorriendo
00:14:58
este array de animales
00:15:00
y hablar con los que sean humanos
00:15:01
haciendo el instance of
00:15:04
y luego tendría que recorrer este
00:15:06
porque se tratan por separado
00:15:08
pero sin embargo comparten
00:15:10
repito, una funcionalidad común
00:15:12
que es hablar
00:15:14
entonces esto ya de por sí parece
00:15:15
medio feo
00:15:18
uno puede, con lo que tiene de Java
00:15:20
lo básico, sin que incorporemos nada más
00:15:23
lo podría hacer todo
00:15:24
pero la idea es las herramientas que se van incorporando
00:15:25
para poder hacer aplicaciones realmente eficientes
00:15:29
bueno, pues entonces, podríamos decir
00:15:33
jo, lo bonito que sería
00:15:35
si humano
00:15:37
pudiera
00:15:41
heredar de animal y por tanto
00:15:43
tener todo lo de animal y también heredar de algo
00:15:47
que le permitiera tener todo lo compartido
00:15:51
lo compartido que tiene con robot.
00:15:53
O sea, el humano tiene compartido con animal
00:15:55
y compartido con robot.
00:15:57
Y se tiene que pronunciar.
00:15:59
¿Tú qué haces?
00:16:00
¿Heredas de animal y te quedas con todo lo de animal
00:16:02
más lo tuyo?
00:16:04
¿O heredas de otra cosa que te da todo lo compartido
00:16:05
con robot y particularizas lo tuyo?
00:16:08
Tienes que elegir.
00:16:10
Entonces, una caca que tengas que elegir.
00:16:11
Vale, pues entonces, aquí como nos vendría muy bien
00:16:14
la herencia múltiple, nos vendría muy bien
00:16:17
que humano pudiera heredar de dos cosas distintas,
00:16:18
pues nos hacemos una interfaz
00:16:21
¿qué es una interfaz?
00:16:24
vale, una interfaz
00:16:27
es como si fuera una clase
00:16:28
abstracta, vale
00:16:30
vamos a hacernos aquí
00:16:32
en lugar de una clase, una interfaz
00:16:34
entonces
00:16:36
esa interfaz
00:16:37
yo ahora mismo la estoy abriendo
00:16:40
como si fuera hacer una clase normal y corriente
00:16:43
esa clase
00:16:44
ahora mismo para mí va a ser
00:16:46
la super clase de robots y humanos
00:16:49
en la que voy a poner lo común entre robots y humanos.
00:16:51
Los humanos y los animales tienen cosas comunes
00:16:55
y los humanos y los robots tienen cosas comunes.
00:16:57
Pues voy a poner una superclase con lo común entre animal y humano
00:17:00
que ya está en animal
00:17:04
y una superclase con lo común entre robot y humano.
00:17:05
Mi problema, si yo lo dejo como clase tal cual,
00:17:11
mi clase, pues lo común entre robot y humano,
00:17:14
¿cuál puede ser?
00:17:17
Que son habladores.
00:17:17
Clase hablador.
00:17:20
sí, hacemos una clase
00:17:20
hablador con lo común
00:17:26
entre humanos y robots
00:17:27
¿vale? lo común entre humanos
00:17:29
y robots, pues puede ser
00:17:32
el timbre
00:17:34
de la voz, porque todos los dos hablan
00:17:36
¿vale?
00:17:38
y a ver, los getty set
00:17:51
los voy poniendo todo el rato, porque es un rollo
00:17:52
quiero que entendamos qué es esto
00:17:54
antes de irnos y ya está
00:17:56
entonces esto es lo que
00:17:58
tienen en común
00:18:00
entonces yo podría dejar esta clase así
00:18:01
y luego además tienen en común que los dos pueden hablar
00:18:06
de hecho
00:18:08
yo había hecho ya en humano
00:18:10
un método hablar
00:18:12
y en robot había hecho también un método hablar
00:18:13
porque los dos pueden hablar
00:18:16
entonces nosotros ya de herencia sabemos
00:18:17
que en este caso
00:18:19
vamos a hacer por tanto un método aquí
00:18:21
hablar
00:18:24
como este método
00:18:25
todavía se queda por definir
00:18:30
porque el humano hablará de una forma
00:18:32
y el robot hablará de otra
00:18:34
Entonces, ahora mismo está por definir. Pues lo dejo por definir. Eso lo convierte en abstracto. Eso lo convierte en abstracto. Y ahora, al tener esta clase un método abstracto, esta clase se convierte en abstracta.
00:18:35
vale, genial, ahora ya robot lo completo y digo, a ver, robot hereda de hablador, estupendo, robot me hereda de hablador,
00:18:50
pero claro, humano también me debería heredar de hablador, de hecho para eso he hecho esta clase, para que sea la super clase de humanos y robots,
00:19:07
pero ¿qué ocurre? lo que ya sabemos
00:19:15
humano resulta
00:19:18
que ya es un animal
00:19:21
ojalá pudiera yo hacer esto
00:19:21
que sea un animal y además
00:19:24
un hablador, con lo cual se queda
00:19:26
con las dos, lo que tenga animal y lo que tenga hablador
00:19:28
con las dos
00:19:30
pero en Java no se puede heredar de más de una clase
00:19:31
desgraciadamente esto no lo podemos hacer
00:19:35
luego este diseño
00:19:37
que hemos hecho no funciona
00:19:39
hablador
00:19:41
no puede ser, no, no, no
00:19:42
Apenas hay que borrar nada, tranquilos
00:19:44
Vale, pues como lo arreglamos
00:19:45
Ojo
00:19:48
Hablador en lugar de clase
00:19:49
Que sea
00:19:52
Una cosa que llamamos interfaz
00:19:54
Esto
00:19:56
Que sea una interfaz
00:19:57
Una interfaz
00:20:00
Vale, bueno
00:20:01
Pues que es una interfaz
00:20:10
Una interfaz
00:20:12
Interface
00:20:14
Como lo queráis llamar
00:20:16
Porque a veces cuando decimos interfaz
00:20:17
lo confundimos con interfaz gráfica, eso es otra cosa
00:20:18
claro
00:20:21
es una clase
00:20:21
que solo tiene
00:20:23
métodos abstractos
00:20:26
vale, voy a poner
00:20:31
aquí con matices
00:20:40
por ahora dejamos el con matices
00:20:43
porque si alguno lo estudia por ahí dirá
00:20:44
uy, me han mentido, no te he mentido
00:20:46
lo que pasa es que no te he dado toda la información
00:20:48
para no liar
00:20:50
el con matices significa
00:20:51
que estos métodos abstractos
00:20:53
podrían tener una implementación por defecto
00:20:56
pero eso nos olvidamos por ahora
00:20:58
vamos a la definición más general de interfaz
00:20:59
una interfaz es una clase
00:21:02
que solo puede tener
00:21:04
métodos abstractos, ni siquiera
00:21:05
ni siquiera
00:21:08
puede tener
00:21:11
propiedades
00:21:14
ni siquiera
00:21:15
lo que sí que puede tener
00:21:18
es variables estáticas
00:21:21
esto sí
00:21:24
eso es una interfaz
00:21:24
entonces cuando declaramos una interfaz
00:21:32
ahora ya viene la teoría
00:21:35
cuando declaramos una interfaz
00:21:37
en lugar de class ponemos interfaz
00:21:39
vale
00:21:40
cambia class por esto
00:21:42
entonces
00:21:45
una interfaz
00:21:46
está pensada
00:21:48
para ofrecer
00:21:50
una sucesión de métodos vacíos
00:21:52
que definen como una obligación
00:21:54
de comportamiento
00:21:57
dices yo soy la interfaz hablador
00:21:58
entonces todo el que herede de mí
00:22:00
va a ser un hablador
00:22:03
y por tanto está obligado
00:22:04
a implementar todos los métodos
00:22:06
abstractos que yo tenga
00:22:08
entonces la idea de fondo de la interfaz
00:22:09
es como recoger
00:22:12
un tipo de comportamiento
00:22:14
normalmente, un tipo de comportamiento
00:22:16
por ejemplo la interfaz hablador
00:22:18
recogería el tipo de comportamiento
00:22:20
de los habladores, que puede ser
00:22:23
método hablar, método gritar, método
00:22:24
susurrar, esos métodos
00:22:26
se quedan vacíos, son abstractos
00:22:28
y luego ya las clases
00:22:30
que hereden de esa interfaz
00:22:32
tienen ya que obligatoriamente
00:22:34
dar cuerpo a esos métodos
00:22:37
entonces una interfaz es una especie
00:22:39
de contrato vinculante
00:22:41
es decir, yo
00:22:42
defino lo que
00:22:44
tiene que hacer un hablador
00:22:47
y el que me herede
00:22:48
ahora vemos como se le da una interfaz
00:22:50
una interfaz, como lo queréis llamar
00:22:52
el que me herede, tiene que obligatoriamente ya definir cómo va a hacer él cada una de las cosas.
00:22:54
Esta interfaz solo tiene un método, pero debería tener varias.
00:23:02
Luego, ese es más o menos el sentido que tiene.
00:23:06
Es como una especie de contrato vinculante de acciones.
00:23:08
Porque es lo único que puede tener, métodos.
00:23:13
No puede tener ni propiedades.
00:23:15
Entonces, propiedades estáticas como constantes globales,
00:23:17
y se le deja una constante global para decidir
00:23:22
algo global, entonces de hecho es tan así
00:23:24
que no hace falta ni poner el static
00:23:26
si yo pongo aquí una propiedad
00:23:28
como las interfaces obligatoriamente
00:23:30
solo pueden tener propiedades estáticas
00:23:32
si yo pongo aquí una propiedad
00:23:34
esta propiedad por defecto es static
00:23:35
por defecto, aunque yo no lo ponga
00:23:38
de hecho me la he puesto en cursiva, en cuanto yo he cambiado
00:23:39
esto, class por interfaz
00:23:42
cuando la tenía
00:23:43
en class, no estaba en cursiva
00:23:46
porque era una propiedad normal
00:23:48
cuando yo lo cambio
00:23:50
a interfaz
00:23:52
me lo pone en cursiva
00:23:54
que le eclipse, él porque le da la gana
00:23:56
a él, pone en cursiva las propiedades
00:23:58
estáticas, entonces esto
00:24:00
cuando esto es una interfaz
00:24:02
cualquier cosa que yo ponga
00:24:04
aquí, es
00:24:06
static o no, no da igual
00:24:08
que lo ponga o no lo ponga, es que es static, sí o sí
00:24:10
entonces aquí en particular
00:24:12
me aparece en rojo, perdón
00:24:14
sí en rojo, porque si recordáis
00:24:16
las variables estáticas
00:24:18
hay que definirlas en el momento de declararlas.
00:24:19
Si no las defines, pues te daría problemas.
00:24:22
¿Vale?
00:24:27
Entonces, bueno, aquí el timbre voz,
00:24:29
como es particular de cada heredero,
00:24:34
no tendría sentido poner aquí timbre voz.
00:24:38
Las interfaces no pueden incluir propiedades.
00:24:40
Todo lo que sean propiedades tiene que ir en las subclases.
00:24:44
Todo.
00:24:46
La interfaz solo vale para definir un comportamiento.
00:24:47
Entonces, esta propiedad aquí.
00:24:50
No, no, no, no, no, los métodos jamás.
00:24:54
Las propiedades.
00:24:57
Porque solamente puede tener propiedades estáticas, solo.
00:24:58
Lo normal es que las estéticas no tengan propiedades.
00:25:03
Pues las propiedades estáticas te valen para información global.
00:25:05
Información global puedes tener muy poquita.
00:25:08
Pero si hay alguna que te interese,
00:25:11
la puedes poner ahí como variable estática.
00:25:12
Pero normal es que no tengan variables, ni siquiera variables estáticas.
00:25:14
Bueno, pues entonces los métodos de una interfaz, por defecto, como son abstractos, el abstract ni se pone.
00:25:18
Y el public tampoco, porque obligatoriamente los métodos de una interfaz son públicos.
00:25:25
Luego esto es que ni se pone, esto se queda así.
00:25:30
Y aunque se quede así, esto es abstracto y público.
00:25:35
luego, los métodos de las interfaces
00:25:39
y sus propiedades estáticas en caso de haberlas
00:25:43
todas
00:25:45
son implícitamente
00:25:46
públicas, lo ponga yo o no lo ponga
00:25:48
porque en una interfaz
00:25:51
se entiende que es como una plantilla
00:25:53
que está ahí y que la podemos
00:25:55
heredar de mil sitios, entonces debería
00:25:57
ser pública
00:25:59
entonces implícitamente
00:25:59
vale, entonces lo voy a poner ahí
00:26:02
todos los
00:26:04
métodos
00:26:08
de una
00:26:09
interfaz
00:26:12
son
00:26:13
implícitamente, es decir, aunque yo no lo ponga
00:26:16
de forma implícita,
00:26:18
públicos.
00:26:21
Luego los puede usar
00:26:22
desde cualquier otro paquete sin
00:26:24
ningún problema.
00:26:26
De hecho,
00:26:30
este public creo que ni siquiera tenemos que ponerlo,
00:26:32
aunque eso no estoy segura.
00:26:34
Sí, o sea,
00:26:37
podríamos no ponerlo y también ahí es como si estuviera
00:26:38
implícitamente el public puesto.
00:26:40
Lo que pasa es que a mí verlo así me da como un poco
00:26:42
de dolor. Muchas veces vais
00:26:44
a ver el public puesto en los métodos, pero es que da
00:26:46
igual que esté puesto o que no esté puesto.
00:26:48
¿Vale?
00:26:51
Entonces,
00:26:55
repito que de esto hay matices.
00:26:56
Es que puede haber
00:26:58
una implementación por defecto en la interfaz,
00:26:59
pero eso lo dejamos para más adelante.
00:27:02
Que puede haber cositas
00:27:04
aquí. Aquí puede haber más cosas y más rollo
00:27:05
relacionado con la operación funcional
00:27:07
que dejamos un poco para más adelante.
00:27:09
Pero ahora mismo nos quedamos con lo básico
00:27:11
y con lo único que realmente necesitamos
00:27:13
para trabajar, que es que
00:27:15
una interfaz es esto, una clase
00:27:17
que se pone interfaz en vez de class
00:27:19
que solamente tiene métodos abstractos
00:27:21
y vale para
00:27:23
unificar subclases
00:27:25
bueno, pues entonces
00:27:28
ahora ya tenemos esta interfaz, porque en nuestra
00:27:29
aplicación hemos decidido que va a haber habladores
00:27:31
va a haber habladores, pues tienen
00:27:33
su interfaz hablador con su comportamiento
00:27:35
y a lo mejor esos habladores
00:27:37
pues yo que sé, vamos a, pueden hacer más cosas
00:27:39
¿no?
00:27:41
Bueno, pues entonces, ahora ya, mi robot es un hablador, pues ¿cómo se hereda una interfaz?
00:27:43
No se pone extens, justo, muy bien, a una interfaz se la implementa, a una clase o clase abstracta se la hereda o extiende y a una interfaz se la implementa.
00:27:54
Implementa. Implementa significa dar cuerpo a los métodos que tiene. Entonces, robot implementa hablador. Tiene que implementar hablador y por tanto, pues al implementar hablador, tiene que dar cuerpo a los métodos que tiene.
00:28:09
Tiene que implementar hablar, que ya lo implementaba, que es este. Y tiene que implementar susurrar. Pues ya está, pues susurrar cualquier cosa.
00:28:24
vale
00:28:43
y ahora que ocurre con humano
00:28:52
pues humano
00:28:54
este override
00:28:57
nos lo pone el eclipse automáticamente
00:28:58
pero ahora mismo
00:29:01
lo podemos quitar porque no
00:29:01
nos aporta nada
00:29:04
y que ocurre con el humano
00:29:05
pues que el humano que lo que queríamos era
00:29:07
que tuviera
00:29:10
de los dos
00:29:12
pues hereda de animal
00:29:15
y al heredar
00:29:17
nos quedamos con propiedades, con métodos
00:29:20
y todo, porque animal es una clase
00:29:23
y además implementa
00:29:24
hablador, pues después del stents
00:29:27
ponemos el implements
00:29:29
vale, entonces
00:29:30
mi humano hereda de animal
00:29:35
con todo lo que animal tenga
00:29:37
y además implementa hablador
00:29:38
con todo lo que hablador tenga
00:29:41
que solamente van a ser métodos
00:29:43
solamente van a ser métodos
00:29:44
vale, pues al implementar
00:29:47
de hablador, está
00:29:49
condenado a
00:29:50
dar cuerpo a los métodos de
00:29:52
hablador. Al hablar ya le daba
00:29:54
cuerpo y vamos a
00:29:57
darle cuerpo al otro de susurrar.
00:29:59
Y esta es la única forma
00:30:14
de implementar la herencia múltiple
00:30:21
en Java.
00:30:23
Y con estas herramientas
00:30:26
de clases, clases abstractas, interfaces,
00:30:28
herencias e implementaciones,
00:30:30
pues uno trata
00:30:32
de reflejar
00:30:33
de la manera más fidedigna
00:30:35
y con el mayor sentido posible
00:30:38
la situación
00:30:39
entonces, normalmente
00:30:40
elegimos clases y clases abstractas
00:30:42
cuando lo que queremos
00:30:46
recoger en esa entidad
00:30:48
no solo es comportamiento
00:30:49
sino también es propiedades
00:30:51
queremos recoger propiedades
00:30:53
como en animal, queríamos recoger nombre, descripción
00:30:54
e interfaces
00:30:57
las interfaces están pensadas
00:30:59
para recoger comportamientos
00:31:01
Por eso las interfaces suelen acabar con nombre hable, hablable, titulable, pesable, modificable, porque las interfaces lo que recogen son comportamientos, métodos, acciones, y el que implementa la interfaz da cuerpo a esas acciones, y el que hereda de una clase da cuerpo a lo que tenga abstracto y a sus propiedades.
00:31:03
Sí, y eso te permite, igual que la herencia, meter la misma referencia, ¿vale?
00:31:33
Es decir, ahora yo, al robot y humano, al implementar los dos hablador,
00:31:51
a mí ahora en mi aplicación se me abre esta posibilidad que antes no tenía.
00:31:57
Vale, entonces, ahora yo aquí, en mi array este de habladores, si habladores es una interfaz, pues en mi array este, ahora de nuevo tengo la flexibilidad de, puedo meter un humano, puedo meter un robot.
00:32:03
entonces
00:32:40
cuando
00:32:41
vale, entonces efectivamente
00:32:44
el significado que tiene una interfaz
00:32:54
es describir un comportamiento
00:32:56
y entonces todas las clases
00:32:59
que implementa una interfaz
00:33:00
se supone que tienen un comportamiento común
00:33:02
aunque cada una lo haga de una manera distinta
00:33:04
pero todos hablan, todos corren
00:33:06
todos lo que sea
00:33:08
entonces efectivamente una interfaz
00:33:09
es una manera de
00:33:12
catalogar, como dices tú
00:33:14
un comportamiento
00:33:16
y luego ya cada clase que lo implemente
00:33:17
ya da las particularidades de cómo lo hace
00:33:20
y aparte de eso
00:33:22
de diseño, de dar una especie
00:33:24
de foto un poquito más real
00:33:26
aparte de eso me permite lo mismo
00:33:28
que me permite la herencia
00:33:30
ahora yo puedo tener una caja de habladores
00:33:31
de toda la gente que se comporta igual
00:33:34
entonces yo aquí en esta caja tengo
00:33:35
todos los que tienen ese comportamiento
00:33:37
de habladores, todos los que tienen
00:33:40
yo aquí puedo tener humanos y robots tranquilamente
00:33:41
entonces los humanos
00:33:44
pueden estar en cajas de habladores
00:33:46
y en cajas de animales, tranquilamente
00:33:48
en las dos, porque los humanos se ayudan
00:33:50
de animales e implementan robots.
00:33:52
El robot puede estar en cajas de habladores
00:33:54
y los animales
00:33:56
y los perros, pues en cajas
00:33:58
de perros, o sea, de animales.
00:34:00
Claro.
00:34:03
Entonces, esta de nuevo es la
00:34:08
ventaja.
00:34:09
El que todos los que se comportan
00:34:11
igual y por tanto implementan la misma
00:34:13
interfaz, pues pueden
00:34:15
Estar bajo una interfaz
00:34:17
Bajo una referencia común
00:34:21
¿Vale? Y meterlos en la misma caja, etc
00:34:23
Entonces de nuevo nos abre
00:34:26
Las posibilidades
00:34:29
¿Vale? Entonces el próximo día
00:34:31
Hacemos ya un ejercicio
00:34:33
Un poco más concreto, más tocable
00:34:36
Para verlo un poquito mejor
00:34:38
¿Vale?
00:34:42
Venga, pues vamos a parar aquí
00:34:44
- 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:
- 14
- Fecha:
- 26 de enero de 2025 - 19:26
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 34′ 47″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 152.46 MBytes