Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 19-02-24 - 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 lo último que hemos visto, como bien recordáis, es la herencia y sus implicaciones, ¿vale?
00:00:00
Entonces, ¿la herencia qué era?
00:00:13
Pues es la posibilidad de relacionar unas clases con otras mediante una relación del tipo, esto es esta otra cosa.
00:00:18
Un alumno es miembro del instituto, un cliente temporal es cliente, un gato es animal.
00:00:27
Entonces, si yo tengo entidades distintas, pues como gato, perro, cliente temporal, empleado temporal, empleado plantilla,
00:00:37
tengo diferentes entidades
00:00:48
y por tanto tengo que hacer clases distintas
00:00:50
pero identifico
00:00:52
que todas comparten algo
00:00:54
pues entonces ahí identifico
00:00:56
una relación de herencia, puedo identificarla
00:00:58
y trabajar haciendo el diseño de mis clases
00:01:00
completamente independientes unas de otras
00:01:02
claro, como hemos dicho muchas veces hay muchos
00:01:04
diseños posibles, pero la idea
00:01:06
es hacerlos lo más eficiente
00:01:08
que se pueda
00:01:10
entonces si yo identifico que hay clases
00:01:11
que comparten cosas
00:01:14
como empleado temporal, empleado plantilla
00:01:15
Comparten cosas, aunque algunas son distintas
00:01:18
Pues identifico que lo comparten
00:01:21
Me puedo hacer una superclase que coge lo común
00:01:22
Empleado, por ejemplo
00:01:26
Y las otras dos heredan todo lo común de esa
00:01:27
Y añaden lo suyo
00:01:31
Entonces, el haber establecido esa jerarquía
00:01:33
Una superclase de las cuales heredan
00:01:38
Tiene algunas ventajas
00:01:40
¿Qué ventaja?
00:01:42
¿Qué ventaja en realidad?
00:01:45
Pues sobre todo la que más podemos ver
00:01:46
la que más podemos visualizar es
00:01:48
que ahora ya cuando yo tenga un almacén
00:01:49
de empleados, un array de empleados
00:01:52
una colección, un conjunto de empleados
00:01:54
los puedo
00:01:56
meter todos juntos
00:01:57
porque todos son empleados
00:01:59
¿vale? todos son empleados
00:02:01
los puedo meter todos juntos en el mismo array
00:02:03
eso es lo que hemos visto
00:02:05
nosotros de forma palpable
00:02:07
que es nuestra ventaja
00:02:08
que los puedo meter todos en el mismo array
00:02:10
en realidad, porque si yo tengo una referencia
00:02:12
empleado E
00:02:15
esa referencia se puede llenar en un momento dado
00:02:16
con un empleado temporal, porque hereda
00:02:19
pero también se puede rellenar en otro
00:02:20
momento dado con un empleado plantilla
00:02:23
porque hereda, entonces eso me da
00:02:25
una flexibilidad
00:02:27
yo declaro la referencia
00:02:28
de una superclase
00:02:31
pero luego puedo meter en ella lo que me interese
00:02:32
entonces eso hace que el código
00:02:35
sea un poquito más eficiente
00:02:39
porque si yo
00:02:40
cambio algo
00:02:43
del empleado temporal
00:02:44
lo cambio solo en la clase
00:02:46
empleado temporal, no en la superclase
00:02:49
esa era más o menos
00:02:51
la idea
00:02:53
con esa idea ya vimos unos cuantos ejemplos
00:02:53
para ver eso como se podía utilizar
00:02:57
como se podía utilizar
00:02:59
de manera que nos facilitara las cosas
00:03:01
entonces la idea es que más o menos eso
00:03:02
pues lo tengáis en la cabeza
00:03:05
medio claro, entonces de ahí ya vino
00:03:07
todo el rollo del polimorfismo
00:03:09
de la sobrescritura de métodos
00:03:11
del instance of de todo ese rollo
00:03:13
que vimos ya a través de los ejercicios
00:03:15
¿vale?
00:03:17
bueno, pues entonces la herramienta de la herencia está muy bien
00:03:20
para hacer un diseño jerárquico
00:03:23
pero
00:03:25
se queda corta
00:03:27
ya lo previmos
00:03:28
en su momento, se queda corta
00:03:31
porque la herencia es
00:03:33
simple, en Java al menos
00:03:35
es simple, una clase
00:03:37
solo puede heredar de otra
00:03:39
solo puede heredar de otra
00:03:40
entonces, a lo mejor hay entidades
00:03:42
que son dos cosas a la vez
00:03:46
¿vale? por ejemplo
00:03:47
un diseño de clases
00:03:50
de un instituto
00:03:52
pues habría profesores interinos, profesores
00:03:53
de plantilla, alumnos
00:03:56
personal de secretaría
00:03:58
hay de todo
00:03:59
entonces uno tiene que decidir cómo organiza
00:04:01
esas clases, cómo las organiza
00:04:04
entonces si me terencia mejor
00:04:06
entonces pues a ver
00:04:08
un profesor interino
00:04:10
es profesor
00:04:12
con lo cual hereda de profesor
00:04:14
pero también es
00:04:16
también puede ser
00:04:18
poder representar otro papel
00:04:19
¿vale?
00:04:22
poder representar otro papel porque es
00:04:23
miembro del equipo directivo
00:04:26
por ejemplo, entonces hay una super clase que es
00:04:27
directivo que tiene
00:04:30
las características de los miembros del equipo directivo
00:04:32
entonces ese profesor interino
00:04:34
tiene que coger todo lo de
00:04:36
profesor y tiene que coger
00:04:38
todo lo de equipo directivo
00:04:40
¿Cómo lo hace? No puede
00:04:42
O es una cosa o es la otra
00:04:45
Es una limitación muy grande
00:04:46
Entonces
00:04:48
¿Hacemos que entonces profesor herede de equipo directivo
00:04:50
Y así profesor interino
00:04:54
A través de profesor hereda de equipo directivo?
00:04:55
No, porque estamos inventando
00:04:58
Esa relación, no todos los profesores
00:04:59
No todos heredan de equipo directivo
00:05:01
Entonces
00:05:04
Que la herencia sea simple
00:05:04
Es una limitación
00:05:06
Bueno, pues vamos a través de un ejemplo
00:05:09
motivar el tema de las interfaces que es muy sencillo
00:05:11
y son cuatro chorradas, nada más
00:05:13
bueno pues esto que
00:05:15
vamos a contar ahora
00:05:30
como no tengo
00:05:32
pizarra
00:05:34
si, pizarra tengo
00:05:40
es verdad, lo que no tengo es con que usarla
00:05:43
que todos los fines de semana se me voy a comprar
00:05:44
vale, pues
00:05:48
esto que vamos a
00:05:50
ver ahora se llama
00:05:53
interfaces
00:05:54
¿Vale? No lo confundáis
00:06:03
Con las interfaces gráficas
00:06:05
De usuario, eso es otra cosa
00:06:07
¿Vale? Eso es otra cosa, una interfaz gráfica
00:06:08
De usuario, ¿sabes lo que es?
00:06:11
Una forma de comunicarse con un programa
00:06:12
A través de ventanas, a través de gráficos
00:06:15
No a través de consola, ¿vale?
00:06:17
Esto es otra cosa, no lo confundáis
00:06:19
Esto que vamos a ver ahora son
00:06:20
Interfaces de Java, pero no gráficas
00:06:22
Interfaces de Java
00:06:25
Bueno, pues venga
00:06:27
Vamos a suponer que
00:06:28
En un ejemplito sencillo
00:06:31
Que es lo más fácil de entender
00:06:34
Pues por ejemplo con empleados
00:06:36
Vamos a poner aquí
00:06:38
Ejemplo interfaces
00:06:42
Empleados
00:06:43
Bueno pues resulta
00:06:51
Que en esta empresa
00:07:01
Para la que vamos a hacer esta aplicación
00:07:03
De gestión de los empleados de la empresa
00:07:05
Hay dos tipos de empleado
00:07:07
Empleado plantilla
00:07:09
Y empleado temporal
00:07:11
Lo más fácil de entender
00:07:11
vale, pues entonces si hay dos tipos de empleado
00:07:13
con información distinta
00:07:16
hay que hacer dos clases
00:07:18
porque son dos entidades
00:07:20
distintas que hemos identificado
00:07:22
empleado plantilla, empleado temporal
00:07:24
pero efectivamente después de hacer
00:07:26
el análisis de las propiedades
00:07:28
que caracterizan a cada empleado
00:07:30
hemos visto que muchas cosas son comunes
00:07:32
entonces como hemos visto
00:07:34
que muchas cosas son comunes hemos dicho
00:07:36
vale, pensamos, vamos a hacer
00:07:38
una clase empleado y que los dos
00:07:40
heredan de ella. Hasta aquí
00:07:42
el mismo proceso mental que con la herencia.
00:07:44
El mismo.
00:07:47
Estamos en la fase de diseño y decidimos
00:07:48
eso. Decidimos hacer
00:07:51
una superclase.
00:07:52
Decidimos
00:07:59
hacer una superclase empleado
00:08:00
con las propiedades comunes
00:08:02
que puedan ser, por ejemplo,
00:08:08
todos los empleados
00:08:15
sean de plantilla, sean de no sé qué,
00:08:16
tienen NIF, nombre y sueldo.
00:08:18
Entonces, como todos tienen NIF, nombre y sueldo, pues esto lo ponemos en empleado, silencio, y si hacemos lo habitual, pues haríamos un GET y un SET, que ya no lo sabemos de memoria, y habitualmente incorporaríamos también un constructor con parámetros para facilitar e instanciar el objeto ya con sus tres datos, etc.
00:08:28
Bueno, pues esta superclase se ha hecho simplemente para unificar
00:09:00
Unificar todo lo que tienen en común los empleados de plantilla
00:09:07
Y los empleados temporales, por ejemplo
00:09:11
Pues venga, entonces
00:09:14
Ahora ya haríamos
00:09:17
Vale, el empleado plantilla, pues por ejemplo
00:09:20
Necesita
00:09:36
De él necesitamos saber
00:09:37
Su
00:09:39
Fecha de ingreso
00:09:40
Entonces pues yo que sé, podríamos poner aquí
00:09:42
Date
00:09:46
Pues de Java útil, Java time
00:09:59
De donde, Java útil
00:10:02
Por ejemplo
00:10:03
Pero vamos
00:10:05
Esto es solo para ver un ejemplo de diseño
00:10:07
No vamos a utilizar estas clases ni nada
00:10:10
Solo
00:10:11
Pues nada, aquí incorporaríamos solamente
00:10:12
El getDLSet
00:10:15
de la propiedad que falta
00:10:17
bueno, espera
00:10:19
nos falta el extens
00:10:20
aquí diríamos
00:10:22
oye, que este empleado
00:10:25
de plantilla es empleado
00:10:26
también, entonces tiene las
00:10:29
tres propiedades de empleado y además
00:10:30
tiene una fecha de ingreso
00:10:33
propia solo de los de plantilla
00:10:34
pues nada, pondríamos los get y set
00:10:36
vale, no hago
00:10:39
no voy a hacer todos los constructores y todo
00:10:50
Porque esto no es, no vamos a trabajar con ellos
00:10:52
Es solamente para ver el diseño que nos quedaría
00:10:55
Si incorporamos interfaces
00:10:57
Entonces, bueno
00:10:58
No pongo el constructor con parámetros
00:10:59
Entonces, en esta fase de diseño
00:11:02
En la que estamos
00:11:05
Hemos identificado que también tenemos
00:11:06
Empleados temporales
00:11:08
Vale
00:11:10
Pues este empleado temporal sería también
00:11:20
Empleado
00:11:23
Vale, y el empleado temporal
00:11:27
pues bueno, añade yo que sé, cualquier propiedad
00:11:33
nos da igual, pues el empleado
00:11:35
temporal
00:11:37
perdón, no te he oído
00:11:37
ala, venga
00:11:41
le ponemos la fecha en la que
00:11:43
se acaba, por poner
00:11:45
algo
00:11:47
fecha fin de contrato
00:11:47
ya está
00:11:53
y el get y el set que le falta
00:11:57
bueno
00:12:06
y llegados a este punto
00:12:13
pues bueno, ya uno podría hacer una aplicación
00:12:17
de gestión con un main
00:12:18
en el cual trabaje con objetos empleado
00:12:20
y claro, tendrá que haber
00:12:23
establecido unos requisitos, ¿qué va a hacer mi aplicación?
00:12:26
pues mi aplicación con los empleados va a hacer
00:12:29
pues esto, lo otro, ¿qué pueden hacer los empleados?
00:12:31
pues los empleados temporal
00:12:35
y plantilla, cualquier empleado
00:12:37
por ejemplo, ¿qué funcionalidad pueden tener todos ellos?
00:12:40
pues generar nómina, por ejemplo
00:12:43
generar nómina, bueno pues entonces
00:12:46
Entonces ese método lo podríamos poner aquí, un método public string generar nómina, ¿vale? Entonces como la nómina de los empleados temporales y de plantillas es distinta, se genera de forma distinta, en la clase empleado lo dejaríamos así, ¿vale?
00:12:49
Ese es un diseño que estamos haciendo dentro de todos los posibles.
00:13:17
Entonces, al dejarlo así, abierto, porque generar nómina depende del tipo de empleado,
00:13:19
al dejarlo así lo convertimos en un método abstracto.
00:13:26
Entonces, al convertirlo en un método abstracto, lo identificamos así, ¿vale?
00:13:30
Y al ser un método abstracto, automáticamente la clase se nos convierte en clase abstracta.
00:13:46
y no pasa nada
00:13:53
porque se convierta en clase abstracta
00:14:01
silencio los de atrás
00:14:03
lo que pasa al convertirse en clase abstracta
00:14:05
simplemente es
00:14:09
que, que implicaciones tiene
00:14:11
que hayamos convertido empleado en clase abstracta
00:14:13
que implicaciones tiene
00:14:15
Moisés
00:14:17
no lo sabes
00:14:18
estas partes
00:14:21
pues estas partes son unas partes muy importantes
00:14:24
porque te voy a aseminar de ellas en dos semanas
00:14:27
Diego, estas partes de herencia
00:14:28
¿qué implicación tiene haberla convertido en abstracta?
00:14:32
la única que tiene
00:14:37
a ver, Daniel
00:14:39
¿qué implicación tiene haber convertido esta clase en abstracta?
00:14:40
que ya no se puede
00:14:50
¿ya no se pueden?
00:14:50
no, que ya no se pueden crear objetos empleados
00:14:54
cuando no era abstracta
00:15:00
Yo podría instanciar un objeto empleado
00:15:03
y también un objeto empleado de plantilla
00:15:05
y también un objeto empleado temporal.
00:15:07
Podría instanciar de los tres tipos.
00:15:09
Entonces, un objeto empleado genérico
00:15:11
yo podría instanciarlo.
00:15:13
Si yo quiero tener un objeto que sea un empleado
00:15:15
y que no tenga los datos adicionales
00:15:17
ni de plantilla ni de temporal, podría.
00:15:19
Al hacerla abstracta,
00:15:22
ya no se pueden instanciar objetos empleados.
00:15:24
No se pueden.
00:15:26
Yo no podría hacer nunca un new empleado.
00:15:27
Aunque tenga constructor aquí, los tiene.
00:15:30
pero en realidad nunca voy a poder hacer un new empleado
00:15:33
porque es abstracta
00:15:36
el que tenga los constructores
00:15:37
ahora mismo ya para lo único que vale
00:15:40
es que desde las herederas
00:15:41
yo los puedo llamar con super
00:15:43
para servirme de ellos
00:15:45
para hacer los propios constructores de las herederas
00:15:47
es para lo único que valen ahora esos constructores
00:15:49
para que las herederas
00:15:52
los usen con super para construir
00:15:53
los suyos propios llamando al de arriba
00:15:55
y ahorrándose código
00:15:57
pero ya no valen para nada más
00:15:58
porque esta clase se ha convertido en abstracta y no se puede instanciar
00:16:00
entonces que no se puedan instanciar objetos de esta clase
00:16:03
no pasa nada
00:16:05
porque me está sirviendo a nivel de código
00:16:07
como plantilla
00:16:10
me está sirviendo como plantilla
00:16:11
para ahora las herederas
00:16:13
trabajar como si hubiera hecho un corta y pega
00:16:16
lo de arriba hasta abajo
00:16:21
entonces me está sirviendo como plantilla de código
00:16:22
y todo lo que herede de ahí es como haber hecho un copia y pega
00:16:24
entonces una clase abstracta
00:16:27
me sirve
00:16:29
me es útil en tiempo de desarrollo
00:16:30
de escritura de código, me sirve para unificar
00:16:32
código, lo que yo ponga ahí
00:16:34
es como si lo estuviera tecleando directamente
00:16:36
en las herederas, me vale para eso
00:16:38
una clase abstracta
00:16:40
pero nunca voy a instanciar de ella
00:16:42
en tiempo de ejecución, esa clase no
00:16:44
existe, no vale para nada, en tiempo de ejecución
00:16:46
nunca voy a poder instanciar objetos en pleno
00:16:49
¿vale? pero para
00:16:50
lo que es la escritura de código me es muy útil
00:16:52
porque yo en las herederas
00:16:54
ya tengo todo lo de la superclase abstracta
00:16:56
¿vale?
00:16:59
bueno, pues entonces
00:17:00
la clase abstracta
00:17:02
al fijarme este método
00:17:04
ahora que ocurre en las herederas
00:17:06
al haber fijado yo este método
00:17:08
así abstracto
00:17:11
automáticamente se me ha puesto rojillo
00:17:11
aquí
00:17:14
en las herederas que antes no estaba
00:17:15
¿por qué?
00:17:18
claro, ahora ya
00:17:21
si el método de la superclase es abstracto
00:17:22
y tú heredas
00:17:25
tienes que darle cuerpo a ese método
00:17:26
tienes que dárselo obligatoriamente
00:17:29
Si tú heredas de una clase abstracta con métodos abstractos, lo tienes que decir.
00:17:30
Entonces, esa es otra utilidad de la clase abstracta, que está obligando, forzando a sus herederas,
00:17:36
está forzando a que se comprometan en un comportamiento.
00:17:43
Dile, vale, tú hereda de mí, yo este método lo dejo en blanco porque no sé cómo lo vas a hacer,
00:17:48
pero te obligo a que especifiques cómo vas a hacerlo.
00:17:54
¿vale? te obligo a que lo especifique
00:17:57
si tiene sentido, tiene sentido en el diseño
00:18:00
de clases, que si tú quieres ser empleado
00:18:02
vale, tú sé empleado
00:18:04
pero entonces dime cómo vas a
00:18:06
generar la nómina, dímelo, porque si no
00:18:08
no seas empleado, tiene sentido
00:18:10
que el diseño funcione así
00:18:12
bueno, pues efectivamente
00:18:13
empleado plantilla
00:18:15
pues
00:18:17
sobrescribiría
00:18:18
obligatoriamente
00:18:22
el método generar nómina
00:18:23
con lo que fuera
00:18:26
con lo que fuera
00:18:28
aquí nos da un poco igual
00:18:31
vale
00:18:38
y
00:18:45
ojo eh, esto
00:18:47
y lo mismo
00:18:49
el empleado
00:18:52
temporal
00:18:53
tiene que sobrescribir esto
00:18:55
vale
00:18:58
pues nada
00:19:02
sobrescribiría también
00:19:04
su generar nómina
00:19:08
bueno pues nada, la aplicación
00:19:10
ahí ya está funcionando, uno
00:19:17
hace su main con los requisitos que haya que hacer
00:19:19
mete los métodos en las
00:19:21
clases de empleado temporal, empleado
00:19:23
plantilla para que hagan
00:19:25
las funcionalidades que tienen que hacer, ya
00:19:27
lo que sea, lo que la aplicación me pida hacer con estos
00:19:29
empleados, vale
00:19:31
luego la aplicación va creciendo
00:19:33
y
00:19:36
aparece
00:19:37
uy he puesto dos return
00:19:39
y aparece otro tipo de empleado
00:19:40
empleado
00:19:46
vamos a llamarle empleado externo
00:19:48
empleado externo es un empleado que te viene
00:19:49
de una empresa que te lo has subcontratado
00:19:52
no es temporal tuyo, pero lo has subcontratado tú
00:19:54
es un empleado externo
00:19:55
rápidamente vamos a suponer que hacemos un empleado externo
00:19:57
por aquí
00:20:00
y me sobra un punto y coma
00:20:00
efectivamente
00:20:04
tenemos aquí el empleado externo
00:20:05
que también es un empleado
00:20:18
se tiene que caracterizar
00:20:20
por su nombre, nif y sueldo
00:20:23
también es un empleado, pues no pasa nada
00:20:24
yo lo incorporo
00:20:26
lo incorporo a mi jerarquía
00:20:28
¿vale? este me ha llegado
00:20:30
como
00:20:32
mantenimiento
00:20:32
de la aplicación, la aplicación
00:20:35
estaba funcionando, lleva ya un año funcionando
00:20:38
y ahora en mi empresa se incorpora
00:20:40
esta posibilidad, bueno pues yo
00:20:42
mantengo la aplicación incorporándole
00:20:44
esto, digo no pasa nada, me hago
00:20:46
otra nueva entidad, empleado externo que también
00:20:48
hereda de empleado, pues muy bien
00:20:50
¿vale?
00:20:52
hereda de empleado tendrá pues por ejemplo
00:20:54
su propiedad adicional
00:20:56
Nombre de la empresa por la que viene
00:20:57
Por ejemplo, yo que sé
00:21:01
Cualquier chorrada, no nos importa
00:21:02
Y también necesita generar su nómina
00:21:05
Porque si era de empleado
00:21:09
Todos los empleados tienen que generar su nómina
00:21:10
Pues venga, nómina externa
00:21:13
Por ejemplo
00:21:25
Vale, bueno, aquí en condiciones normales
00:21:26
Pues haríamos el get y el set
00:21:36
Vamos a hacerlo para que no parezca que
00:21:37
Que pasamos de ellos
00:21:39
vale, pues
00:21:44
ahora
00:21:46
resulta que aparece una nueva capacidad
00:21:48
de la empresa, resulta que
00:21:50
la empresa pues dice, a ver
00:21:52
una funcionalidad nueva, yo tengo
00:21:53
la potestad de despedir
00:21:56
despedir
00:21:58
y cuando despida tengo que
00:22:00
hacer una acción concreta, por ejemplo
00:22:01
generar finiquito, vale
00:22:04
pues es una nueva funcionalidad de la aplicación
00:22:05
generar finiquito
00:22:08
vale, pero eso, quienes lo hacen
00:22:09
solamente lo hacen los empleados
00:22:12
temporales y externos
00:22:14
porque no puedo despedir a los de plantilla
00:22:16
entonces ahí ya
00:22:18
entra algo que tengo que ver
00:22:20
cómo lo incorporo
00:22:22
de manera que quede bonito, que quede claro
00:22:23
que quede un diseño decente en la aplicación
00:22:26
entonces
00:22:28
se traduce en que tengo que meter ahí
00:22:29
un método nuevo, un comportamiento
00:22:32
nuevo, pero sólo
00:22:34
para dos entidades, para empleado externo
00:22:35
y temporal
00:22:38
entonces bueno, vale
00:22:39
Pues yo podría decir, bueno, pues esa funcionalidad nueva,
00:22:43
generar finiquito, la pongo en empleado externo dentro
00:22:46
y la pongo en empleado temporal dentro.
00:22:50
Y ya está.
00:22:53
Y en empleado plantilla no la pongo.
00:22:53
Vale, bueno, sería una solución.
00:22:56
Por un lado estamos poniendo el mismo método,
00:22:59
aunque sea con cuerpo distinto, el mismo método,
00:23:03
el mismo nombre, lo estamos poniendo en dos clases distintas.
00:23:05
Entonces eso ya nos suena como a que, oye,
00:23:09
tú no puedes unificar esto
00:23:10
de alguna manera con herencia o algo así
00:23:12
tenemos esta herramienta
00:23:14
que queremos usarla precisamente para eso
00:23:17
para unificar todo lo que
00:23:18
compartan diferentes clases
00:23:21
no podríamos, pero claro que tenemos un problema
00:23:22
que no podemos poner
00:23:25
generar finiquito en empleado
00:23:26
porque sería un mal sitio
00:23:28
porque entonces se le daría
00:23:31
generar finiquito los tres tipos
00:23:33
hombre, podría
00:23:34
decir, vale, no pasa nada, lo pongo ahí
00:23:36
y el empleado plantilla simplemente
00:23:38
ese método nunca lo va a llamar
00:23:40
vale, nunca lo va a llamar, pero es que
00:23:42
queda un diseño horrible, porque entonces tú tienes
00:23:44
el que esté usando estas clases
00:23:46
verá empleado plantilla y dirá, anda, tiene un método
00:23:48
general finiquito, ¿y por qué tiene un método general finiquito?
00:23:50
entonces eso ya es una aplicación fea
00:23:52
no debería tener ese método
00:23:54
ese método solo deberían tener los objetos
00:23:55
empleado plantilla, empleado temporal y empleado externo
00:23:57
entonces
00:24:00
como que no acabamos de ver claro
00:24:01
cómo incluir eso
00:24:03
esa funcionalidad que solo afecta
00:24:06
a dos de nuestras tres entidades
00:24:08
claro, aquí la solución sería
00:24:11
hombre, y si yo me hago otra superclase
00:24:14
otra superclase
00:24:17
que sea empleado despedible
00:24:18
por ejemplo, yo que sé
00:24:20
entonces, empleado
00:24:22
temporal heredaría
00:24:24
de empleado normal y de empleado despedible
00:24:26
empleado plantilla
00:24:28
solo de empleado normal
00:24:30
y empleado externo heredaría
00:24:32
de empleado normal
00:24:34
Y de empleado despedible
00:24:36
Eso sería lo ideal
00:24:38
Pero no podemos
00:24:39
Porque cada clase solo puede heredar de otra
00:24:41
No puede heredar de dos
00:24:44
Entonces la solución ideal sería esa
00:24:45
Hacer dos plantillas
00:24:47
La plantilla empleado tal y como la tenemos
00:24:49
Y la plantilla empleado despedible
00:24:51
Y que luego
00:24:54
Nuestras tres entidades
00:24:55
Empleado, plantilla, temporal y externo
00:24:57
Elijan de quien heredan
00:25:00
Y si quieren heredar de las dos
00:25:02
Pues de las dos
00:25:03
Esa es la solución ideal
00:25:04
Y así se queda, cada entidad se queda
00:25:05
Si necesita de las dos, se queda con las dos
00:25:08
Si necesita de una sola, se queda con una
00:25:10
Esa sería la solución ideal, pero no podemos
00:25:12
Porque, como hemos dicho muchas veces
00:25:13
En Java no podemos ir a dar de dos
00:25:15
Vale, pues entonces viene
00:25:17
El truco, el parche
00:25:18
De las interfaces
00:25:21
Vale, pues me voy a hacer una cosa
00:25:22
Que se llama interfaz
00:25:25
Que una interfaz en realidad
00:25:27
Es
00:25:30
Como si fuera una clase
00:25:31
Con todos los métodos abstractos o vacíos
00:25:33
¿Vale?
00:25:36
Una interfaz
00:25:38
La podéis ver
00:25:38
Como una clase
00:25:39
Que tiene todos sus métodos abstractos
00:25:41
Eso sería
00:25:44
Vamos a escribirlo aquí
00:25:46
Para que viéndolo se nos quede más
00:25:48
Es una clase
00:25:50
Con todos los
00:25:58
Métodos abstractos
00:26:00
¿Vale?
00:26:04
Bueno, así hasta cierta versión
00:26:07
Luego ya se permite una
00:26:08
Luego ya se van incorporando cosas
00:26:09
Que las iremos que nosotros también diciendo
00:26:11
¿Vale? Pero en origen, su esencia viene de ahí.
00:26:13
Una interfaz es una clase que tiene todos los métodos abstractos.
00:26:17
¿Vale?
00:26:20
Y las clases normales de Java lo que hacen es heredar de ella,
00:26:22
pero en este caso no se llama heredar.
00:26:29
En este caso se llama implementar.
00:26:31
Lo que hacen es implementarla.
00:26:33
Es decir, dan cuerpo a sus métodos.
00:26:36
Entonces, esta es la idea.
00:26:40
Pues, entonces, aquí en nuestra aplicación podríamos incorporar.
00:26:45
Vamos a incorporar ahora una interfaz empleado despedible.
00:26:49
Empleado despedible, para que recoja el comportamiento de los
00:26:55
empleados que pueden ser despedidos.
00:26:59
Pues, uno haría aquí una interfaz.
00:27:02
Entonces, despedible.
00:27:07
Despedible.
00:27:19
Vale, entonces, ¿cómo se programa,
00:27:22
cómo se declara una interfaz?
00:27:25
pues uno cambia el class, la palabra class la cambia por esta, ¿vale?
00:27:26
La cambia por esa, ese es el primer requisito,
00:27:31
la palabra class se cambia por esa, ¿vale?
00:27:35
Entonces de una interfaz como tiene todos sus métodos abstractos,
00:27:42
salvo los matices que se han incorporado después que ya incorporamos,
00:27:46
ya incorporaremos, como tiene todos los métodos abstractos,
00:27:51
de una interfaz no se pueden instanciar objetos tampoco,
00:27:55
no se pueden instanciar.
00:27:57
Una interfaz vale solo para heredarla o implementarla.
00:27:59
Esto se llama implementarla.
00:28:03
Solo vale para eso.
00:28:04
Entonces, como no permite que se instancien objetos de ella,
00:28:06
en una interfaz no podemos declarar propiedades.
00:28:10
No podemos.
00:28:13
¿Vale?
00:28:14
Yo no puedo poner aquí cosas como esta.
00:28:16
Por ejemplo, el compilador ya se me queja y me dice,
00:28:20
no, esto es una interfaz, no es una clase.
00:28:24
Luego, no puede tener propiedades.
00:28:27
O sea, si esto fuera una clase, ya sí que podría, puede tener su propiedad nombre, pero no es una clase, es una interfaz, entonces no puede.
00:28:29
El sentido de esto es, como nunca vas a instanciar objetos de esto, pues no puedes tener propiedades.
00:28:43
Si tú quieres una clase de la que vayan a heredar otros y que también tenga propiedades, elige una clase, elige una clase abstracta si quieres, pero no elijas una interfaz.
00:28:49
porque una interfaz no puede tener
00:28:59
propiedades, lo que sí que puede
00:29:01
es tener
00:29:04
propiedades estáticas
00:29:05
¿vale? eso sí que puede
00:29:07
que además
00:29:12
tienen que ser
00:29:13
constantes, esto sí puede
00:29:15
parecer una interfaz
00:29:25
propiedades que son estáticas
00:29:26
y que además no pueden cambiar
00:29:28
de valor una vez que las has
00:29:31
inicializado, que será el
00:29:32
el modificador
00:29:35
final, si recordáis. El modificador
00:29:37
final, cuando se le ponía una propiedad,
00:29:39
significa que esa propiedad, una vez
00:29:41
que reciba valor, que tiene
00:29:43
que recibirlo en el momento de declararse,
00:29:45
ya no
00:29:48
va a cambiar nunca de valor, no se puede cambiar.
00:29:49
Bueno, pues
00:29:52
las interfaces pueden tener
00:29:53
propiedades estáticas.
00:29:54
Eso sí.
00:29:57
Entonces, para guardar información
00:29:59
genérica, entonces
00:30:01
yo podría usar en cualquier
00:30:02
programita mía, empleado despedible,
00:30:05
En este caso, por ejemplo, la funcionalidad de generar finiquito, pues a lo mejor el finiquito se va a generar para todos ellos a partir de un porcentaje.
00:30:07
Imaginaos que entonces su sitio para guardarlo a lo mejor podría ser aquí.
00:30:20
Entonces, variables static final sí puede tener, pero propiedades de ningún otro tipo.
00:30:29
No puede tener propiedades de ningún otro tipo. Esa es la primera condición de las interfaces.
00:30:34
vale
00:30:38
¿qué tiene una interfaz dentro?
00:30:41
tiene métodos vacíos
00:30:43
eso es lo que tiene
00:30:45
en nuestro caso es una interfaz empleado despedible
00:30:46
para hacer una especie de plantilla
00:30:49
de empleado despedible, pues le pondríamos un método
00:30:50
por ejemplo, generar
00:30:53
finiquito, pues yo que sé
00:30:55
y este método estaría así
00:30:57
entonces, como ya se asume
00:31:10
que en las interfaces todos los métodos
00:31:12
son vacíos, aquí ni se pone
00:31:14
el abstract, ni se pone nada, en una interfaz
00:31:16
No se pone el astra en el método vacío
00:31:18
No se pone
00:31:20
Propiedades
00:31:21
Estatic
00:31:34
Y final
00:31:38
¿Vale? Eso por un lado, aquí
00:31:40
No se pone el astra
00:31:42
Otra cosa
00:31:44
Los métodos de las interfaces
00:31:54
Por definición y por
00:31:56
Narices, son public
00:31:58
Porque las interfaces
00:32:00
Están pensadas, como luego ya
00:32:02
Vamos a ver y vamos a creernos
00:32:04
con más facilidad están pensadas
00:32:06
para que las implementen de cualquier
00:32:08
parte, para dar una especie de patrón
00:32:10
de funcionamiento y que las implementen de cualquier parte
00:32:12
entonces por definición y por obligación
00:32:14
son public, todos los
00:32:16
métodos de las interfaces son todos public
00:32:18
entonces como eso es así
00:32:20
ni siquiera hay que ponerlo
00:32:22
es que no se puede, lo puedes poner y no pasa nada
00:32:23
lo puedes poner
00:32:26
y no se te va a quejar
00:32:27
pero es que en este caso poner public
00:32:31
y no ponerlo en los métodos de una interfaz
00:32:34
es lo mismo
00:32:36
porque los métodos son siempre
00:32:37
public independientemente de que se ponga
00:32:40
el modificador o no
00:32:42
uy
00:32:43
vale, aunque no esté el modificador
00:32:45
que es lo habitual, que no aparezca el modificador
00:33:01
son siempre public
00:33:03
vale, pues una interfaz es algo así
00:33:05
luego ya se incorpora
00:33:11
posteriormente, que ya lo incorporaremos
00:33:13
para verlo como ejemplo
00:33:15
la posibilidad de darles un cuerpo
00:33:16
por defecto
00:33:19
y la posibilidad de meter métodos
00:33:20
estáticos, pero bueno, eso lo
00:33:23
ponemos luego para no liar
00:33:25
entonces, ¿cuál es
00:33:27
la motivación de una interfaz? generar una especie
00:33:29
de patrón de comportamiento
00:33:31
es decir, yo soy empleado despedible
00:33:33
y el que me
00:33:35
implemente, tiene que
00:33:37
implementar este comportamiento
00:33:38
y este, y este, y este, porque podría haber un montón
00:33:41
de métodos vacíos, podría haber un montón
00:33:43
entonces, una interfaz es como una especie
00:33:44
de compromiso de funcionamiento
00:33:47
una serie de acciones, esta, esta
00:33:49
esta, esta, esta, acciones, métodos
00:33:51
Y el que implementa esa interfaz, lo que hace ya es decidir cómo se concreta ese comportamiento.
00:33:53
Luego, a nivel semántico de significado, una interfaz está asociada a un comportamiento, solo tiene métodos.
00:34:03
Sin embargo, la herencia, como la hemos visto, es más genérica.
00:34:10
Cuando nosotros hacíamos aplicaciones con animales, perros y gatos, el animal tenía cosas, tenía identidad.
00:34:13
y luego el perro le añadía alguna otra
00:34:20
y el gato le añadía alguna otra
00:34:23
pero el animal en sí ya tenía cosas
00:34:25
¿vale?
00:34:27
no tenía solamente comportamiento y métodos
00:34:29
también tenía descripción
00:34:31
entonces la herencia es más genérica
00:34:32
una superclase dentro de la herencia
00:34:35
una superclase
00:34:37
tiene una descripción suya, es algo
00:34:38
es algo y también hace algo
00:34:41
pero una interfaz solamente
00:34:43
hace algo, no es nada
00:34:45
porque ser está asociado
00:34:47
a que haya propiedades que te describen
00:34:49
si no tienes propiedades que te describen
00:34:51
no eres nada, pero si puedes
00:34:53
hacer algo, hacer algo son los métodos
00:34:55
pues entonces la interfaz solamente
00:34:57
tiene métodos, es decir
00:34:59
solamente recoge la idea
00:35:01
de un comportamiento
00:35:03
solamente recoge la idea de un comportamiento
00:35:05
no de una identidad, de yo tengo
00:35:07
mi nombre, tengo mi nif, tengo mi
00:35:09
no recoge la idea de identidad
00:35:11
por eso los nombres de las
00:35:12
interfaces de la máquina virtual de Java
00:35:16
muchas veces tienen nombres
00:35:19
que están asociados a un comportamiento
00:35:21
por ejemplo, yo la he llamado a propósito despedible
00:35:24
porque despedible
00:35:26
está asociado a que te pueden despedir
00:35:28
la interfaz comparable
00:35:30
como ya veremos, está asociada a que te pueden comparar
00:35:31
muchos nombres acaban en el hable
00:35:34
de los interfaces
00:35:36
porque están asociadas a cosas que se pueden hacer
00:35:37
tirable
00:35:40
pintable
00:35:42
lo que sea
00:35:44
suelen ser los nombres habituales de las interfaces
00:35:45
Significan lo que se puede hacer
00:35:48
Pintar, tirar
00:35:50
Sin embargo, las superclases normales de herencia
00:35:51
Pues son animal, empleado
00:35:55
No es solo lo que pueden hacer
00:35:56
Sino también lo que son
00:35:58
Tienen su nombre
00:35:59
Efectivamente
00:36:00
Sustantivos o calificativos
00:36:03
Bueno, pues
00:36:07
Entonces, ahora
00:36:11
Una vez que hemos decidido tener esta interfaz
00:36:13
Pues ahora ya
00:36:16
Nuestra aplicación se convierte
00:36:17
en que empleado
00:36:20
plantilla no es despedible
00:36:22
con lo cual empleado plantilla se queda así
00:36:24
hereda de empleado y punto pelota
00:36:25
silencio
00:36:27
pero empleado temporal
00:36:29
es un empleado
00:36:31
pero también puede ser despedido
00:36:33
entonces se tiene que quedar con las dos cosas
00:36:36
vale, pues
00:36:38
hereda de empleado
00:36:40
y ahora hay que indicar que implementa
00:36:41
la interfaz despedible
00:36:44
y como se indica, pues no pasa
00:36:45
nada después del extends
00:36:48
uno pone implements
00:36:49
que es la palabra clave
00:36:52
para decir que una clase
00:36:53
implementa una interfaz
00:36:55
¿vale? y ya está
00:36:57
entonces empleado temporal
00:37:06
hereda de empleado
00:37:08
luego se queda con todo lo que tiene empleado
00:37:09
propiedades y métodos
00:37:12
y además
00:37:14
implementa empleado despedible
00:37:15
entonces al implementar empleado despedible
00:37:18
está obligada
00:37:20
a dar cuerpo
00:37:22
a todos los métodos
00:37:24
Vacíos de empleado despedible
00:37:26
Está obligada
00:37:28
Por eso se nos ha puesto aquí rojo
00:37:29
Porque nos ha dicho, uy, si implementas de empleado despedible
00:37:33
Pues vas a tener que implementar
00:37:36
Generar finiquito
00:37:38
Pues no pasa nada
00:37:39
Ala
00:37:41
Genero finiquito
00:37:42
Pues cualquier cosa
00:37:45
Voy a poner algo
00:37:48
¿Vale?
00:37:52
Este diseño
00:37:55
Es un poquito más fiel
00:37:58
A lo que es la realidad
00:38:00
yo voy identificando
00:38:01
las diferentes
00:38:04
entidades que me van saliendo
00:38:05
tengo empleados, solo algunos
00:38:08
se les puede despedir, pues solo algunos
00:38:10
se adhieren a la posibilidad
00:38:12
de ser despedidos, no todos se adhieren
00:38:14
y así se pueden ir incorporando cosas
00:38:16
empleado externo
00:38:18
le pasaría igual, empleado externo era de empleado
00:38:20
pero también puede ser despedible
00:38:23
pues entonces
00:38:25
no pasa nada, implementa empleado despedible
00:38:32
y entonces no le queda más remedio
00:38:34
que
00:38:36
sobrescribir esto
00:38:38
pues lo que fuera
00:38:41
se supone que lo haría
00:38:43
de una manera distinta al otro
00:38:45
se supone
00:38:47
yo ahora del código que hago dentro de los métodos
00:38:48
me estoy despreocupando, me da igual lo que haya dentro
00:38:55
cada uno tendría su propia forma
00:38:57
de generar finiquitos, se supone
00:38:59
y la suerte de las interfaces
00:39:00
es que se puede heredar
00:39:06
de tropecientas a la vez
00:39:08
a lo mejor
00:39:10
aparte del comportamiento despedible
00:39:12
pues hay otro comportamiento
00:39:14
o otra cosa que pueden tener
00:39:16
en común, no todos los empleados
00:39:18
que sea, pues yo que sé, aparte de despedir a un empleado
00:39:20
¿qué se le puede hacer?
00:39:22
Felicitarle, felicitable
00:39:24
pues entonces se podría ver una interfaz empleado felicitable
00:39:25
y entonces uno puede implementar
00:39:29
todas las que quiera separadas por comas
00:39:31
entonces
00:39:33
empleado externo, extens, empleado
00:39:34
eso sí que solamente puede dar de una
00:39:37
después del extens solo puede haber una, sí o sí
00:39:38
solo puede haber uno, pero luego
00:39:40
después del implements puede haber
00:39:42
tropecientas separadas por comas
00:39:44
uno puede implementar todos los
00:39:46
comportamientos o interfaces
00:39:48
que necesite
00:39:50
y luego tendrá que dar código
00:39:52
a todos ellos
00:39:54
¿vale?
00:39:55
entonces de esta manera pues tenemos
00:39:58
muchísimas más posibilidades para hacer
00:40:00
diseños un poquito
00:40:02
más claros, más
00:40:04
pidedignos
00:40:06
¿y ahora qué pasa?
00:40:07
¿qué implicaciones tiene haber hecho esto de aquí?
00:40:11
por ejemplo, si nos hacemos
00:40:17
nuestro main
00:40:18
constructores
00:40:19
ay, que no lo ha llamado bien
00:40:23
a ver, refactors
00:40:29
vale, ahora ¿qué ocurre?
00:40:33
pues exactamente igual que
00:40:45
con la herencia que ya hemos visto, que yo puedo tener
00:40:46
aquí un array con todos
00:40:48
mis empleados
00:40:51
o una referencia suelta
00:40:51
para no meter un array, si yo tengo aquí una
00:40:56
referencia suelta en e
00:40:58
Está claro, ya lo sabemos
00:40:59
Que en E podemos meter
00:41:01
Un empleado plantilla
00:41:02
Eso ya lo sabemos
00:41:04
Pero en E podríamos
00:41:07
Meter también un empleado temporal
00:41:09
Eso es lo de la herencia que hemos visto
00:41:11
Y en E podríamos
00:41:13
Meter también
00:41:15
Un empleado externo
00:41:16
¿Vale? En E cae cualquiera de estas cosas
00:41:18
Y si fuera una RAI
00:41:28
A cualquier porcentaje de la RAI cabría
00:41:30
Entonces si yo hago ahora E punto
00:41:31
Pues generar nómina
00:41:33
pues ya sabemos lo que significa esto
00:41:35
que
00:41:38
al método generar nómina que se llama
00:41:39
dependerá de qué tipo de objeto sea
00:41:42
si es
00:41:44
empleado plantilla
00:41:46
¿por qué estamos así?
00:41:47
pues se llamará
00:41:51
generar nómina de empleado plantilla
00:41:52
¿que no? ¿que es empleado temporal?
00:41:53
pues se llamará al generar nómina
00:41:58
de empleado temporal, esto ya lo sabemos
00:42:00
¿vale?
00:42:02
es lo de herencia
00:42:03
¿vale? pues con las interfaces es similar
00:42:04
resulta que yo tengo
00:42:07
uy, tengo un montón de empleados que voy a despedir
00:42:09
venga, voy a meterlos
00:42:11
a todos en un array
00:42:13
por ejemplo, pues yo me puedo
00:42:14
hacer un array
00:42:17
lo voy a poner abajo, venga
00:42:18
voy a
00:42:36
el new, me falta
00:42:37
y la end
00:42:39
vale, por ejemplo, vamos a despedir
00:42:41
a 20, vamos a despedir a 20
00:42:44
pueden, a 20
00:42:46
pueden ser tanto
00:42:48
temporales como externos
00:42:49
con lo cual el array
00:42:51
¿de qué lo hacemos? de temporales, de externos
00:42:53
puede ser de cualquiera de los dos tipos
00:42:56
pues yo lo hago
00:42:58
de empleado despedible
00:43:00
pero claro, lo que cae dentro
00:43:01
de esas referencias no puede ser empleado
00:43:03
despedible porque es que no se puede instanciar
00:43:05
ahora ya dentro de esa referencia puede caer
00:43:07
cualquier cosa
00:43:10
cualquier cosa, por ejemplo
00:43:10
en la posición 0
00:43:14
yo puedo meter
00:43:16
un nuevo
00:43:17
Empleado, plantilla no
00:43:20
Plantilla, si yo pongo
00:43:22
Este, me diría
00:43:24
No, no puedes
00:43:26
¿Por qué? Porque empleado plantilla no
00:43:28
Implementa esta, no la implementa
00:43:30
Entonces no puedes, esto no podríamos
00:43:32
Pero esto de abajo
00:43:34
Pues si podemos
00:43:38
Un temporal si que podemos meterle
00:43:41
Y también podríamos ponerle un externo
00:43:43
En cualquiera de esas posiciones
00:43:53
Podríamos ponerle un externo en cualquiera de ellas
00:43:57
Porque todas implementan empleado despedible
00:43:59
Todas lo implementan
00:44:03
Entonces esto funciona igual que la herencia
00:44:04
Y ahora imaginaos que llamamos a despedir 0
00:44:07
A este que llamamos al generar finiquito
00:44:12
Bueno pues se estará llamando
00:44:15
En este caso a generar finiquito del temporal
00:44:19
Del método que hay en el temporal
00:44:23
Pero si llamamos a este
00:44:25
Pues estaremos llamando
00:44:34
A generar finiquito, pero en la versión
00:44:37
Del externo, ¿vale?
00:44:39
O sea, esto es igual que la herencia
00:44:41
Exactamente igual
00:44:42
Efectivamente
00:44:44
Efectivamente
00:44:47
El tipo de dato
00:44:49
A la hora de declararlo es la interfaz
00:44:52
Luego tu instancia es cualquiera de los que lo implementan
00:44:54
Cualquiera de los que lo implementan
00:44:57
¿Vale?
00:44:58
Vale, pues venga, nos...
00:45:00
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 7
- Fecha:
- 26 de febrero de 2024 - 18:52
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Duración:
- 45′ 02″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 171.55 MBytes