20260123 InterfacesTeroria - 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:
flojerías, bueno
00:00:00
esto es una pizarra, sí
00:00:01
vale, bueno pues vamos
00:00:03
a un concepto más relacionado con la herencia
00:00:05
que es
00:00:08
básico en cualquier diseño
00:00:09
en cualquier aplicación mínimamente
00:00:11
compleja y sobre
00:00:13
la que se sustenta
00:00:15
cualquier paquete que usemos, como el de
00:00:17
colecciones, que es
00:00:19
el siguiente que veremos, o las
00:00:21
excepciones, o las interfaces gráficas
00:00:23
cualquier cosa
00:00:26
todos esos paquetes que nosotros
00:00:27
ya usaremos para hacer nuestras cosas
00:00:29
se sustentan sobre esta idea
00:00:31
de interfaces
00:00:32
que es lo que vamos a
00:00:34
incorporar a otra que es
00:00:37
nada
00:00:39
a nivel de incorporación de detalles
00:00:40
de código es nada, son cuatro cosas
00:00:43
es sobre todo una cuestión de entender
00:00:45
por qué aparecen, por qué las usamos
00:00:47
¿vale?
00:00:49
bueno, pues a ver
00:00:51
lo que es la herencia, la motivación
00:00:52
de por qué apareció la herencia
00:00:55
en esta vida
00:00:57
la tenemos, ¿no?
00:00:58
¿Por qué?
00:01:03
Es interesante la idea.
00:01:04
Venga, me ha tocado.
00:01:06
Para...
00:01:10
Para...
00:01:11
Una frase rápida.
00:01:13
Para poder utilizar datos
00:01:15
de otras clases.
00:01:17
Bueno, poder utilizar datos no me gusta,
00:01:20
porque no es la idea.
00:01:23
Los datos tú los utilizas cuando instancias un objeto.
00:01:24
Ahí utilizas datos.
00:01:27
No exactamente.
00:01:29
Claro, eso es la herencia
00:01:29
Crear una clase a partir de otras
00:01:35
¿Pero por qué?
00:01:37
¿Por qué?
00:01:38
Vale, que eso podríamos resumirlo en
00:01:47
Reutilizar código
00:01:49
¿Verdad?
00:01:51
Para automatizar sería la palabra
00:01:52
No, no automatizamos nada
00:01:54
No estamos automatizando nada
00:01:56
Para reutilizar código
00:01:58
Lo que tú has dicho viene a ser reutilizar código
00:02:01
¿Vale?
00:02:03
entonces
00:02:03
y además de
00:02:05
reutilizar código
00:02:07
en sí
00:02:09
¿para qué otra cosa nos ha servido?
00:02:10
¿cuál ha sido otra motivación
00:02:15
fundamental?
00:02:16
claro
00:02:19
va por ahí, por el polimorfismo
00:02:20
es decir, tú tienes un montón
00:02:22
de datos, un montón
00:02:24
de objetos en tu aplicación
00:02:26
que no son lo mismo en realidad
00:02:28
uno es alumno de FP
00:02:30
alumno de la ESO
00:02:32
alumno de infantil, no son lo mismo, con lo cual
00:02:34
no los puedes crear, declarar como la misma clase
00:02:38
porque son distintos, no son lo mismo, son clases distintas, pero
00:02:42
comparten, como tú decías, mucha información, entonces efectivamente
00:02:46
desde el momento en que todos identificas que todos
00:02:49
son alumno, alumno ESO es alumno, alumno FP es
00:02:53
alumno, alumno infantil es alumno, cuando identificas
00:02:58
que todos son alumnos
00:03:02
automáticamente puedes
00:03:04
decir, vale, pues entonces
00:03:06
si todos puedo yo decir que son
00:03:07
alumno, es porque la idea de
00:03:09
alumno existe
00:03:11
luego habrá cosas que tengan
00:03:13
los alumnos, porque esa idea existe y que por tanto
00:03:15
la tengan todos los demás
00:03:18
y luego ya cada uno tendrá
00:03:19
lo suyo específico
00:03:21
entonces
00:03:23
el diseñarlo
00:03:25
de esa manera, como
00:03:28
tres clases que son
00:03:29
distintas, pero todas
00:03:32
heredan de la misma y todas
00:03:34
comparten lo que tiene la superclase
00:03:35
automáticamente
00:03:38
tiene la ventaja
00:03:39
del polimorfismo
00:03:41
que decía él, y es que ahora yo ya
00:03:44
puedo trabajar
00:03:46
con instancias de esos
00:03:47
objetos por igual, todas ellas llamarán
00:03:49
a los mismos métodos, métodos que están
00:03:52
en la superclase, todas ellas
00:03:53
pueden estar en
00:03:56
el mismo array, yo las puedo tratar a todas
00:03:58
por igual, y si todos tienen
00:04:00
el método matricular
00:04:01
pues el alumno FP
00:04:03
se puede matricular, el alumno infantil
00:04:05
se puede matricular y el alumno
00:04:07
de la ESO se puede matricular
00:04:10
¿vale? porque todos son alumnos
00:04:12
yo los trato por igual, a todos les llamo
00:04:13
el método matricular
00:04:15
pero cada uno va a ejercer ese
00:04:16
método de una manera distinta, cada uno lo va a ejercer
00:04:19
de una forma distinta
00:04:21
¿vale? entonces todos comparten
00:04:22
las llamadas a los métodos, todos
00:04:26
los trato por igual, todos los meto
00:04:27
en la misma caja, en el mismo array
00:04:29
y el mismo lista enlazada
00:04:31
los meto a todos por igual
00:04:33
pero cada uno se comporta internamente
00:04:35
de forma distinta, aunque yo los trate
00:04:37
desde arriba por igual
00:04:39
eso lo podemos hacer gracias a la herencia
00:04:40
¿vale?
00:04:43
bueno, pues esto como herramienta
00:04:45
entonces de diseño que luego facilita
00:04:47
el desarrollo de una aplicación
00:04:49
está muy bien, pero se nos
00:04:51
ha quedado un poco coja
00:04:53
os habréis
00:04:55
dado cuenta si vosotros empezáis a pensar
00:04:57
en situaciones de
00:04:59
a gestionar, pues de
00:05:01
cualquier cosa que haya que gestionar, de inventarios
00:05:03
de gestionar un taller
00:05:05
mecánico, gestionar una empresa de personal
00:05:07
si os ponéis a pensar en situaciones
00:05:09
pues veréis que con la
00:05:10
relación de herencia no se
00:05:13
puede reflejar todo
00:05:15
primero porque la herencia
00:05:16
en Java es una herencia
00:05:19
simple, entonces recordad
00:05:21
que en Java cada clase
00:05:23
solo puede
00:05:27
heredar de otra
00:05:29
Entonces, tú puedes ser una cosa
00:05:30
Pero no puedes ser otra
00:05:35
No puedes ser otra a la vez
00:05:36
¿Vale?
00:05:38
Entonces, bueno, eso tiene cierto sentido real
00:05:40
Yo soy empleado
00:05:43
Temporal
00:05:45
¿Vale? Soy empleado
00:05:46
Y ya está, pero soy empleado solamente
00:05:48
Soy empleado temporal
00:05:51
Y soy empleado y no soy nada más
00:05:52
Ni puedo ser nada más en esta jerarquía mía
00:05:55
De clases
00:05:57
¿Vale? Pues entonces, eso realmente se queda
00:05:57
un poco corto, porque luego a lo mejor puede
00:06:01
haber otras cosas
00:06:03
en la aplicación como
00:06:04
eres empleado que ficha
00:06:07
eres empleado que ejerce
00:06:09
de jefe, eres empleado
00:06:11
que hace no sé qué
00:06:13
es decir, en mi aplicación puede haber
00:06:14
una cosa, que para entendernos
00:06:17
y que quede claro, que se llamen roles
00:06:19
a lo mejor tú eres
00:06:21
un empleado, pero hay diferentes
00:06:24
papeles que puedes jugar
00:06:26
y en un momento dado puedes jugar uno
00:06:27
o a lo mejor puedes jugar otro
00:06:30
entonces tú no eres solamente una cosa
00:06:32
también
00:06:35
tú te puedes definir
00:06:36
por lo que haces, por los roles
00:06:39
¿vale?
00:06:41
y que puedes tener muchos
00:06:43
entonces esto amplía un poquito más
00:06:45
nuestras posibilidades de diseñar la aplicación
00:06:47
bueno, pues para meter esto en Java
00:06:49
para reflejar esto en Java
00:06:51
aparece una cosa que se llama
00:06:52
interfaces
00:06:55
entonces, ¿la interfaz qué es?
00:06:56
una interfaz es una clase
00:06:58
es como si fuera una clase abstracta pura, solamente tiene métodos vacíos.
00:07:00
Eso es una interfaz.
00:07:11
Se declara con la palabra interfaz, así.
00:07:12
Es como si fuera una clase, pero en lugar de poner class, se pone interfaz.
00:07:19
¿Qué nombre le da uno?
00:07:26
Pues bueno, el nombre que le dé la gana.
00:07:29
Normalmente las interfaces están asociadas
00:07:31
No es que sea obligatorio
00:07:34
Pero es la idea, para eso se usan
00:07:35
Están asociadas a funciones, comportamientos, roles
00:07:38
Papeles que uno puede jugar en la aplicación
00:07:43
Por eso sus nombres suelen acabar en hable
00:07:46
Pues soy movible, soy expulsable
00:07:49
Soy titulable
00:07:53
Es decir, cosas que yo puedo hacer
00:07:54
Suelen estar asociadas a eso
00:07:57
Por ejemplo, estamos gestionando coches, en vuestras bases de datos de coches, de bases de datos, pues no sé qué relación tendrá
00:07:58
Pero imaginaos que tenéis un taller mecánico que tiene coches, motos, carros de caballos, carruajes
00:08:10
uno podría hacer un diseño en el cual
00:08:23
todos ellos
00:08:26
hereden de vehículo
00:08:27
muy bien, todos hereden de vehículo
00:08:29
esa parte ya la tenemos controlada
00:08:31
en vehículo pondremos
00:08:34
todo aquello que tienen
00:08:36
todos los vehículos, el coche
00:08:37
la moto, el carromato, lo pondremos
00:08:39
todo, los métodos
00:08:42
que esté claro cómo van a
00:08:44
funcionar los ponemos en la superclase
00:08:46
lo que no esté claro
00:08:48
porque dependerá de cada ejemplo
00:08:49
esos los ponemos como vacíos
00:08:51
con lo cual el vehículo se convierte
00:08:55
en abstracta y ahora ya
00:08:57
cada subclase los rellena
00:08:58
con su contenido específico
00:09:01
esa parte ya la sabemos
00:09:02
pero luego puede haber más cosas
00:09:03
que haya que meter en la aplicación de alguna manera
00:09:06
que tengan que quedar reflejadas
00:09:08
por ejemplo
00:09:10
el taller mecánico tiene
00:09:11
su parte que define, tengo coches, carromatos
00:09:13
todos son vehículos
00:09:16
pero también gestiono ventas, hago cosas
00:09:18
Bueno, pues esos cacharros de ahí
00:09:21
Esos coches, esas motos
00:09:23
Además de ser vehículos
00:09:24
Además puede que necesiten ser vendidos o no ser vendidos
00:09:26
Ser alquilados o no ser alquilados
00:09:30
Es decir, desempeñar una función
00:09:32
Y cada una de ellas la que toque en cada momento
00:09:34
Entonces, por ejemplo
00:09:37
Uno podría hacer una interfaz vendible
00:09:39
Que se llamara vendible
00:09:42
Entonces tendríamos
00:09:43
La estructura que hemos hecho antes
00:09:53
Pues tendríamos vehículo
00:09:56
y de vehículo hereda
00:09:58
el coche
00:10:03
y la moto
00:10:05
¿vale?
00:10:08
aquí ya con las propiedades que sean
00:10:10
con los métodos que sean, lo que sea
00:10:12
pues coche, pues lo que fuera
00:10:14
pues mostrar datos, pintarlo
00:10:16
cambiar ruedas, moto
00:10:18
pues ponerle lo que fuera
00:10:20
lo que sea
00:10:22
luego tenemos la parte de ventas de la aplicación
00:10:23
entonces
00:10:26
puede ser
00:10:27
que los coches sean vendibles
00:10:31
se puedan vender pero las motos no, ese taller
00:10:32
solo arregle motos y no las venda, solamente
00:10:34
venda coches, entonces aquí
00:10:36
tenemos un problema
00:10:38
porque, jolines, el método
00:10:39
vender solo aplica
00:10:43
para coche, para moto no
00:10:45
vale
00:10:46
podríamos en coche poner un método
00:10:48
específico suyo que fuera vender
00:10:51
tendríamos solamente
00:10:52
el pequeño problema de que este método
00:10:56
solo estaría aquí, lógicamente
00:10:58
aquí no puede estar porque la moto no puede ser vendida
00:11:00
y yo no podría ponerlo aquí en la superclase
00:11:02
como método abstracto
00:11:05
no podría, porque si lo pongo
00:11:07
aquí en la superclase como método abstracto
00:11:09
moto se ve
00:11:11
obligada a implementarlos
00:11:13
entonces ya el diseño empieza a ser un poco
00:11:14
raro, entonces ya empieza a ser
00:11:17
feo, entonces
00:11:19
me conviene separar partes, es decir, a ver
00:11:21
esta es mi parte
00:11:23
de lo que son, coche es vehículo
00:11:25
moto es vehículo, ya lo tengo todo hecho
00:11:27
ahora, ¿qué es lo que pueden
00:11:29
hacer, este puede ser vendido
00:11:31
meter eso aquí, por lo que acabo
00:11:33
de decir, ya me estropea el diseño
00:11:35
me lo hace un poco feo, porque ¿qué lo hago?
00:11:37
¿lo pongo aquí en abstracto? no porque me obliga
00:11:39
vale, pues entonces no lo pongo
00:11:41
aquí para que esta no se vea obligada
00:11:43
pero si no lo pongo aquí, tengo el problema
00:11:45
de que un objeto coche
00:11:47
no puede llamar a vender
00:11:49
perdón, un objeto coche
00:11:53
si está declarado como vehículo
00:11:55
que será lo normal, que esté
00:11:57
declarado como vehículo, aunque esté instanciado
00:11:59
como coche, pues no puede llamar
00:12:01
a vender, tengo que hacer el casting
00:12:03
¿verdad? porque el compilador
00:12:04
me dice, perdona, pero esto está declarado
00:12:07
como vehículo, yo no puedo
00:12:09
llamar al método vender porque aquí no está
00:12:11
entonces tendríamos que hacer el casting
00:12:13
¿vale? soluciones hay
00:12:15
pero son feas, mejor si hacemos un diseño
00:12:17
más bonito
00:12:19
bueno, pues entonces, yo podría hacer
00:12:19
muy bien, saco todo esto de vender
00:12:23
de la idea de ser
00:12:25
la saco, ahora me voy a la hacer
00:12:27
¿vale? la herencia
00:12:29
sería ser que soy las interfaces serían que hago pues lo voy a sacar a la parte del que hago me
00:12:31
hago una interfaz vendible porque las cosas que yo tenga por aquí algunas serán vendibles y otras no
00:12:38
pues me hago una interfaz vendible que va por libre no tiene nada que ver con la clase vehículo está
00:12:44
de aquí empieza con la palabra clave interfaz vale y aquí ya pongo el método o los métodos
00:12:50
pueden ser muchos, que van a tener
00:13:00
que ejecutar todos
00:13:02
aquellos que quiera yo que se
00:13:04
adquieran, que se adscriban a este comportamiento
00:13:06
por ejemplo
00:13:08
pues el método vender
00:13:10
vale, la interfaz es una clase
00:13:11
abstracta como si
00:13:20
fuera una clase abstracta pura
00:13:22
puede tener uno
00:13:24
o muchos métodos, pero todos
00:13:26
los que tenga serán
00:13:28
abstractos
00:13:30
vale, con el matiz de método por defecto
00:13:31
que os digo ahora, pero eso lo digo después
00:13:34
Os estoy mintiendo cuando os digo
00:13:35
que todos son abstractos, pero no pasa nada.
00:13:38
Luego ya arreglo la mentira.
00:13:39
Pero en esencia es la idea de la interfaz.
00:13:42
La idea de la interfaz es que
00:13:44
tenga un montón de métodos vacíos.
00:13:45
Voy a vender.
00:13:48
Vendible. Cuando alguien es
00:13:49
vendible, ¿qué más nos interesa que nos haga?
00:13:51
Pues, por ejemplo, generar su factura.
00:13:54
¿Vale? Pues aquí se ponen
00:14:03
los métodos vacíos
00:14:04
que se supone que tiene que
00:14:06
implementar aquel
00:14:08
que quiera ser vendible
00:14:10
que todavía habrá que decidir
00:14:12
cómo hacer una para convertirse en vendible
00:14:14
esto se declara
00:14:16
y ya está
00:14:19
y se declara porque yo he identificado
00:14:19
que hay un comportamiento en mi aplicación
00:14:22
que va por ahí
00:14:25
que hay cosas que pueden ser vendibles
00:14:26
pues yo las recojo ahí
00:14:28
que podría no ser así
00:14:29
imaginaos que ahora mi aplicación aumenta
00:14:37
y yo en mi taller
00:14:41
incorporo otro
00:14:42
otro vehículo
00:14:44
que es un triciclo
00:14:46
vale
00:14:48
imaginaos que yo esto de las interfaces
00:14:52
lo he olvidado y no lo estoy usando
00:14:53
y paso de ello
00:14:56
resulta que
00:14:57
los coches y los triciclos pueden ser vendidos
00:14:59
los vehículos
00:15:02
no, pues con todo
00:15:04
esto que he dicho como si no existiera
00:15:06
pues tendría que hacer aquí también un vender
00:15:07
es decir
00:15:10
duplicarlo todo
00:15:12
quedaría como muy feo, de nuevo tendría el mismo
00:15:13
problema, si yo tengo un triciclo
00:15:15
instanciado como, declarado
00:15:18
como vehículo, que es la idea, que esté declarado
00:15:20
como la superclase
00:15:22
si yo ya me voy a vender, no voy a poder
00:15:23
voy a tener que hacer el casting
00:15:26
nada, mala solución
00:15:27
ir poniendo parches así, mala solución
00:15:29
bueno, pues cuál es la solución
00:15:32
hacer esta interfaz que acabo de decir
00:15:35
que recoja esas
00:15:37
cosas que tiene que hacer
00:15:40
cualquier entidad que yo quiero que sea vendible
00:15:41
y ahora
00:15:44
decir, vale
00:15:45
pues coche, que está
00:15:48
por aquí, cuando yo declare
00:15:50
coche, vale, cuando yo declare
00:15:54
coche, class coche
00:16:01
que herede de ese
00:16:04
de vehículo, pues yo no tengo
00:16:05
alternativa, lógicamente
00:16:07
este es vehículo
00:16:09
y ahora, además de heredar
00:16:12
de vehículo, yo digo
00:16:15
además de eso, tienes
00:16:17
que implementar
00:16:19
esto, tiene que adherirse
00:16:22
a este comportamiento
00:16:24
de aquí, porque es vendible
00:16:26
luego tiene que implementar
00:16:27
esto de aquí, pues entonces
00:16:30
¿qué añado después del stents?
00:16:31
después del stents añado
00:16:34
implement
00:16:35
la interfaz que sea
00:16:36
vendible
00:16:39
y ya abro
00:16:41
mis llaves y hago el código
00:16:44
¿vale?
00:16:45
entonces, una entidad
00:16:47
puede heredar
00:16:49
de otra entidad
00:16:51
solo de una y significa
00:16:52
yo soy eso
00:16:55
todo lo que tenga
00:16:56
que es todo su estado, su descripción
00:16:59
vehículo, pues su color
00:17:01
su marca, lo que sea
00:17:03
todo va a estar aquí
00:17:05
entonces heredar significa
00:17:06
coger propiedades, yo soy esto
00:17:09
está asociado al verbo ser, yo soy esto
00:17:11
vale, un segundo
00:17:13
pero además de ser tú algo
00:17:14
además de ser algo
00:17:16
tú haces cosas
00:17:18
bueno, pues esas cosas
00:17:20
si se pueden interpretar
00:17:22
como que son un rol
00:17:25
específico
00:17:27
como el rol de ser vendible
00:17:28
en lugar de esas cosas que haces tú
00:17:30
ponerlas todas aquí una detrás de otra
00:17:33
que queda un diseño patateo
00:17:34
como esas cosas están asociados
00:17:36
a un rol concreto, en este caso
00:17:38
ser vendible, pues lo sacas
00:17:40
aquí a una interfaz, donde pones
00:17:42
esas cositas
00:17:44
en vacío, obligatorio
00:17:45
y ahora dices, yo soy vehículo
00:17:48
y además
00:17:51
implemento esta interfaz
00:17:52
y además la implemento
00:17:54
entonces
00:17:56
desde el momento en que tú pones aquí
00:17:57
que implementas una interfaz
00:18:01
de nuevo el compilador te va
00:18:02
a obligar, como pasaba con las clases
00:18:05
abstractas, te va a obligar a decir, vale
00:18:07
muy bien, tú implementas vendible
00:18:09
pues por favor
00:18:11
dame código a esto
00:18:13
vale, tú le das
00:18:15
código a eso y ya está
00:18:17
esto es lo que en términos de desarrollo
00:18:18
de programación, esto es como si
00:18:25
fueran los términos de un contrato
00:18:27
aquí está, en la interfaz está el contrato
00:18:29
que es
00:18:31
esto es lo que tienes que hacer
00:18:32
el contrato
00:18:35
en general te compromete
00:18:36
a unos servicios
00:18:40
¿vale? pues eso es una interfaz
00:18:41
un contrato que te compromete
00:18:43
a que hagas esto
00:18:46
si tú
00:18:47
firmas ese contrato
00:18:49
y firmarlo es poniendo
00:18:51
implements la interfaz que sea
00:18:52
automáticamente tienes
00:18:54
que dar cuerpo, implementar
00:18:57
tú dentro de ti
00:18:59
esos métodos
00:19:00
a tu manera, como a ti te dé la gana
00:19:03
¿y esa interfaz
00:19:05
iría dentro de la clase vehículo?
00:19:07
no, es una clase aparte
00:19:09
o sea, solamente es que
00:19:11
claro, es otra clase más
00:19:12
vale, vale
00:19:14
tampoco puede ser
00:19:14
a lo largo de dos interfaces
00:19:17
Sí, entonces, la diferencia es que una clase puede implementar todas las interfaces que le den la gana.
00:19:19
Imaginaos que este taller mecánico mío, con los vehículos, con algunos sí, con otros no,
00:19:29
pues hay una actividad muy concreta que es la actividad de ir a exposición, exponible, llamémosla exponible.
00:19:36
Pues uno podría hacer aquí una interfaz
00:19:42
¿Vale?
00:19:44
Uno podría hacer aquí una interfaz que fuera
00:19:48
Exponible
00:19:50
Y en esa interfaz
00:19:52
Poner ahí dentro los métodos
00:19:56
Poner caseta
00:19:58
O yo que sé
00:20:00
O mostrar mensaje
00:20:02
Lo que fuera
00:20:04
¿Vale? Ese sería el contrato
00:20:04
Que tú tienes que satisfacer, que garantizar
00:20:08
Lo que tú tienes que hacer
00:20:10
Si eres exponible
00:20:11
¿vale? pues entonces
00:20:13
a lo mejor el coche
00:20:15
es vendible y además exponible
00:20:17
pues el coche tendría
00:20:19
implements vendible
00:20:21
coma exponible
00:20:22
como se implementa 200.000
00:20:24
heredar solo de una
00:20:26
tú solo eres una cosa
00:20:30
en Java solo eres una cosa, no puede ser más
00:20:32
tu esencia es una
00:20:35
pero lo que tú haces
00:20:37
los roles que tú tienes en una aplicación
00:20:39
como alumno, como coche
00:20:43
como pueden ser miles
00:20:46
¿vale? tú puedes implementar
00:20:47
200.000 interfaces
00:20:49
tantas como roles identifique tu aplicación
00:20:51
que tienen sentido
00:20:54
entonces pues triciclo
00:20:55
heredaría de vehículo pero a lo mejor implementaría
00:20:57
vendible, pero
00:20:59
fonible pues no la implementaría
00:21:01
¿vale? pues moto igual no implementa
00:21:03
ninguna de las dos
00:21:06
entonces de nuevo
00:21:07
es otra herramienta de diseño más
00:21:09
que facilita muchísimo
00:21:11
las cosas cuando el diseño
00:21:14
se ha planteado desde el principio
00:21:16
diseño horrible
00:21:17
todas mis clases son clases
00:21:19
separadas y ninguna relación entre ellas
00:21:22
ahí no hay polimorfismo
00:21:24
no hay nada, me complica mucho la vida
00:21:26
cada clase la hago todo lo suyo
00:21:28
ahí dentro, no puedo
00:21:30
meterlas juntas en colecciones
00:21:32
de cada clase tengo que
00:21:33
enterarme que métodos tiene
00:21:36
aquí si
00:21:37
yo tengo varias clases que implementan
00:21:40
vendible y ahora soy otra clase
00:21:43
de otro método, ah, me están pasando
00:21:45
un vendible, vale, me da igual
00:21:47
lo que me están pasando, me da igual que sea un coche, que sea una moto
00:21:49
me pasan un vendible, yo llamo a vender
00:21:51
y ya está
00:21:52
vale, si no, tendríamos que
00:21:53
hacer el método para versión
00:21:57
pásame coche, versión pásame triciclo
00:21:59
versión pásame no sé qué
00:22:01
así no, haces versión
00:22:02
pásame vendible, se acabó, como yo sé
00:22:04
que tiene un método vender
00:22:07
pues llamó a vender
00:22:08
y se acabó
00:22:09
¿no haría falta hacerle casting
00:22:11
a la hora de llamar a la empresa?
00:22:14
no, porque está aquí, es como si tú lo pones
00:22:16
en una clase abstracta
00:22:18
si está en la superclase
00:22:19
esta es como si fuera una superclase
00:22:22
abstracta, abstracta pura
00:22:24
¿vale?
00:22:28
entonces luego ya hay
00:22:30
detalles ya concretos de sintaxis
00:22:30
que ya son detallitos, pues como que
00:22:32
por defecto
00:22:34
los métodos son siempre
00:22:36
public, porque esto siempre está pensado
00:22:38
para un empaquetamiento, son diseños de paquetes
00:22:40
donde lógicamente las interfaces
00:22:42
se ponen en un paquete, las clases en
00:22:44
otras, entonces
00:22:46
los métodos
00:22:47
no se pone el public, porque
00:22:49
por defecto son siempre public, aquí no hace
00:22:52
falta ponerlo, no es como las clases abstractas
00:22:54
que la clase abstracta es como una clase
00:22:56
raruna, entonces ahí sí que lo
00:22:57
sigue todas las reglas, en la interfaz
00:23:00
aquí no pones nada
00:23:02
Ese método vender lo tenéis que meter en la subclase
00:23:03
En la subclase lo tienes que implementar
00:23:11
Obligatoriamente
00:23:13
Desde el momento en que tú pongas
00:23:14
Implements esto
00:23:18
Tienes que hacer esto de aquí
00:23:20
Porque yo estaba pensando que
00:23:23
Lo que hacía Interface
00:23:24
Era que tú hacías un método
00:23:26
En vehículo
00:23:28
Y luego lo podías meter en coche pero luego en motor
00:23:29
O sea el método ese vender
00:23:32
Yo lo podría hacer en vehículo
00:23:35
A ver
00:23:36
Si lo haces aquí en vehículo
00:23:40
Como abstracto, lo puedes, pero es que entonces
00:23:43
Bueno, como sea
00:23:45
Ya, pero el problema es que entonces lo va a tener alguien
00:23:47
Que no lo quiere
00:23:49
Cualquiera que herede de vehículo
00:23:50
Aquí el tema es dar flexibilidad
00:23:52
Hay muchas cosas que son vehículo
00:23:54
Y tienen que estar ahí
00:23:57
Porque hacen cosas de vehículo
00:23:58
Como pintarse, lo que sea
00:24:00
Pero claro
00:24:03
si pones aquí vender
00:24:05
también te queda aquí un vender
00:24:06
y eso no, eso solo
00:24:09
los que sean vendibles
00:24:11
¿vale? entonces al final
00:24:12
realmente las clases se relacionan
00:24:15
de una manera, de una jerarquía muy rara
00:24:17
tú heredas de algo pero luego
00:24:19
implementas un montón de cosas que a su vez
00:24:21
implementan otras cosas que no heredan de ti
00:24:22
porque en esta aplicación
00:24:25
podría haber otra jerarquía que no fueran vehículos
00:24:26
que fueran
00:24:29
empleados, y los empleados
00:24:31
pues aquí tratamos
00:24:33
con los empleados una trata de esclavos
00:24:35
y tú los puedes vender también, entonces el empleado
00:24:37
crearía de empleado
00:24:39
podría implementar vendible también
00:24:41
entonces pueden implementar
00:24:43
la interfaz, clases que
00:24:45
a su vez no heredan de la misma superclase
00:24:47
por supuesto, vale
00:24:49
y luego bueno
00:24:52
hay pequeños detalles ya de
00:24:58
sintaxis
00:25:00
ya de que son detalles
00:25:01
lo que nos importa es la idea
00:25:03
que bueno, que menciono un poco
00:25:05
Pues, por ejemplo, en las interfaces, por supuesto, no se pueden declarar propiedades porque la interfaz no es algo que se pueda instanciar. O sea, la interfaz no refleja un estado, no describe a nada. La interfaz está pensada solo para describir un comportamiento, un rol. Luego, aquí propiedades nunca se pueden poner.
00:25:07
Pues vendible
00:25:31
Int, vendedor
00:25:34
Propiedades como de cualquier
00:25:36
Como haces en cualquier otra clase
00:25:38
No, parámelos
00:25:39
Propiedades, campos, variables
00:25:44
Como quieras llamarlo, hemos llamado propiedades normalmente
00:25:46
Claro, solo métodos
00:25:48
¿Vale? Salvo
00:25:50
Contenido estático, sí
00:25:52
El contenido estático, sí
00:25:53
Algo estático, sí, porque el estático es como si fuera
00:25:55
Una variable global
00:25:58
entonces si tú quieres reflejar
00:25:59
una información asociada
00:26:02
al rol de vender
00:26:04
siempre y cuando sea común para todo el mundo
00:26:05
para todos los vendedores
00:26:09
para todas las cosas vendibles
00:26:10
que no te sea cada una lo suya
00:26:12
pues entonces lo puedes poner aquí como variable
00:26:14
estática
00:26:16
pero solo estático
00:26:17
admite esto y es una información
00:26:20
común que está ahí recogida
00:26:22
por si alguien no sabe dónde poner
00:26:25
una información común general
00:26:26
pues a lo mejor le pega ponerla aquí
00:26:28
pero no sería nada que describiera
00:26:29
específicamente a cada una
00:26:32
de las cosas vendibles, eso no
00:26:34
¿vale? entonces puede aparecer
00:26:36
ahí algo estático
00:26:38
que se llamaría con el nombre de la interfaz
00:26:40
vendible punto lo que fuera, pues por meter ahí
00:26:42
información, eso sí se puede
00:26:44
lo estático no se hereda, o sea cuando
00:26:45
uno pone implements
00:26:48
lo estático no se lo
00:26:49
queda
00:26:52
el que implementa, lo estático no se
00:26:52
queda, entonces imaginaos que hay una
00:26:56
variable estática x
00:26:58
aunque coche
00:27:00
implement vendible, yo no puedo
00:27:02
decir coche punto x
00:27:04
tendría que decir vendible punto
00:27:06
x, vale, lo estático
00:27:08
pertenece a la interfaz
00:27:11
solamente, no se hereda
00:27:12
y al igual que hay variables
00:27:14
estáticas puede haber propiedad
00:27:16
métodos estáticos
00:27:18
que trabajen con esas propiedades por si por
00:27:19
alguna razón, yo que sé, hay una utilidad
00:27:22
una utilidad general
00:27:24
con esta variable
00:27:26
una utilidad que a mí me interesa usar
00:27:28
que es absolutamente independiente
00:27:30
de los objetos
00:27:33
que está relacionada con este rol
00:27:34
pues yo que sé, pero no tiene que ver
00:27:37
con los objetos, pues la puedo meter ahí
00:27:39
y la llamaría con el nombre de la interfaz
00:27:40
vendible punto, la utilidad que fue
00:27:42
pero esa ni se le da ni nada
00:27:44
bueno, pues que lo sepáis, que puede haber contenido estático
00:27:46
ahí
00:27:49
que bueno, normalmente, salvo alguna constante
00:27:49
que me interese
00:27:53
a mí en toda la aplicación, es raro
00:27:55
que las interfaces tengan, usen
00:27:57
eso estático
00:27:58
¿Para los métodos?
00:28:00
¿A los métodos? Sí, claro
00:28:08
Sí, yo aquí los he puesto en vacío por
00:28:09
parámetros, devolver lo que sea
00:28:11
el método puede tener la cabecera que sea
00:28:13
vender podría tener aquí un objeto vendedor
00:28:15
lo que fuera, y devolver a lo mejor
00:28:18
dabble, que fuera el precio que te han dado
00:28:20
claro, claro, la cabecera puede ser cualquiera
00:28:22
¿Vale? El public es
00:28:23
lo que no aparece porque se asume por defecto
00:28:26
siempre. Una casi
00:28:27
última cosa, digo casi porque luego de
00:28:32
interfaces lo interesantísimo
00:28:34
viene cuando las convertimos en
00:28:36
interfaces funcionales.
00:28:38
Pero eso ya es una cosa muy complicada
00:28:40
pero maravillosa
00:28:42
que incorporamos un poco más adelante.
00:28:44
Por eso digo casi lo último
00:28:47
que os quiero decir de interfaces.
00:28:48
Es que desde no sé qué versión
00:28:51
se admite
00:28:52
meter aquí
00:28:54
una versión por defecto.
00:28:56
de los métodos
00:28:58
entonces si uno pone un default delante
00:29:00
de alguno de estos métodos
00:29:02
entonces le puede poner un cuerpo
00:29:03
y ahora esa es una
00:29:06
como si fuera una versión por defecto
00:29:08
entonces las subclases
00:29:10
si no implementan
00:29:12
ese método que
00:29:14
tenga versión por defecto, no están obligadas
00:29:16
se quedan con la versión por defecto
00:29:18
¿vale?
00:29:21
y las que
00:29:23
no estén implementadas
00:29:24
pues esas tienes que implementarlas sí o sí
00:29:26
entonces los default no se usan
00:29:28
mucho porque tienen
00:29:31
cierto peligro, porque si tú haces aquí una versión
00:29:33
por defecto
00:29:35
todas se lo quedan
00:29:35
y ni el compilador ni nadie te avisa
00:29:38
de que hay un método ahí que tienes que sobreescribir
00:29:41
entonces a lo mejor te estás quedando
00:29:42
con una versión por defecto
00:29:45
que luego alguien en otra clase
00:29:46
está llamando a ese método
00:29:48
y no hace exactamente lo que tú querrías
00:29:50
entonces tiene ese peligro
00:29:53
pero a cambio, ¿por qué se incorporó?
00:29:54
porque tiene una ventaja clarísima
00:29:56
y es que
00:29:58
te permite ampliar
00:30:00
código, escalar código
00:30:03
sin tocarte mucho las pelotas
00:30:04
porque yo empiezo aquí a añadir entidades
00:30:06
que todas van a ser vendibles
00:30:08
pero hombre
00:30:10
a lo mejor en algunas de ellas
00:30:12
hay métodos que no
00:30:14
que no quiero sobreescribir todavía
00:30:16
porque no lo sé o porque
00:30:18
pues hombre, si no hay versiones
00:30:20
por defecto en ninguno
00:30:22
cada uno que, pum, implemente
00:30:23
vendible, que se adhiera aquí
00:30:26
todos tienen que implementar el método
00:30:28
vender, todos, todos, todos
00:30:31
entonces el default
00:30:32
me permite que no
00:30:33
tengan que estar todas las clases
00:30:36
que implementan eso, pues poniéndolo
00:30:38
se quedan con su versión por defecto y ya está
00:30:40
pero hay que usarlo con cuidado
00:30:42
hay que tener cuidado en que todo
00:30:44
no genere
00:30:46
efectos extraños
00:30:48
que luego uno ejecuta
00:30:49
la aplicación, la aplicación no da ningún error
00:30:53
de ejecución, todo bien
00:30:54
pero los resultados no
00:30:56
uy, esto no tiene ninguna coherencia
00:30:58
ese es el problema más grave
00:31:00
pues eso se evita
00:31:02
con un diseño cuidadoso
00:31:05
bueno, pues esta es la idea
00:31:09
de interfaces
00:31:12
está claro, ¿no?
00:31:14
tienen la misma ventaja que tienen las superclases
00:31:19
que si algo
00:31:22
implementa una interfaz
00:31:23
lo puedes declarar
00:31:25
como
00:31:26
referencia de esa interfaz
00:31:27
pero bueno, eso vamos a verlo mejor
00:31:32
con un ejemplo
00:31:33
antes de
00:31:35
que nos
00:31:35
volvamos muy locos
00:31:38
- 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:
- 1
- Fecha:
- 25 de enero de 2026 - 17:39
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 31′ 44″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 1.47