Interfaces - 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:
Voy a grabar esta clase, por lo tanto, si habláis, me autorizáis a grabar vuestras voces, ¿vale?
00:00:00
Nosotros hemos visto en episodios anteriores las clases abstractas.
00:00:09
Hemos visto que son clases que pueden incluir algunos métodos del que yo indico el prototipo,
00:00:14
pero sin indicar la implementación, sin indicar el cuerpo.
00:00:25
Yo digo que estas clases van a tener este método, sé cómo se utilizará este método, sé qué parámetros tendrá y sé qué devolverá, pero no sé cómo se hará, ¿vale?
00:00:29
Como es abstracto, la clase es abstracta y por lo tanto no es instanciable, no puedo crear un objeto de esa clase abstracta, no puedo hacer una new de esta clase abstracta, ¿vale?
00:00:42
cualquier clase que herede
00:00:54
que haga un extens de esta clase abstracta
00:00:57
pues tendrá necesariamente que implementar
00:01:01
todos los métodos abstractos de la clase padre
00:01:04
o declararse abstracta a su vez
00:01:09
¿vale?
00:01:13
yo podría extender una clase abstracta
00:01:14
con otra clase abstracta
00:01:17
donde añado más métodos abstractos
00:01:18
voy a hacer
00:01:21
Entonces el hijo de la segunda clase abstracta tendrá que implementar todos los métodos de la primera y todos los métodos de la segunda.
00:01:22
Pero la clase abstracta sigue siendo una clase, o sea que una parte de ella puede ser concreta.
00:01:31
Yo puedo poner algunos métodos que sí implemento allí, algunos constructores que sí implemento allí,
00:01:40
Y algunos métodos que me dejo abstractos. Es un híbrido. Tiene partes implementadas y partes no implementadas.
00:01:47
Cuando yo haré un hijo, cuando tengo una clase, una subclase, pues lo que tengo que hacer es implementar necesariamente los métodos abstractos y los métodos concretos los heredo.
00:01:57
En ese punto puedo decidir si usar directamente esos, si sobreescribirlos, overwrite completamente,
00:02:11
o hacer un overwrite, que es lo que se suele hacer, que como primera línea reúsa el método de mi padre,
00:02:20
o sea, hace esa cosa como si fuera un padre, y luego añade más cosas propias del hijo.
00:02:26
como por ejemplo un método de inscripción
00:02:33
un toString es
00:02:38
asumible que lo que haga
00:02:39
es un toString del padre
00:02:42
super.toString
00:02:43
entonces escribe toda la situación del padre
00:02:45
y a eso le añade
00:02:48
lo propio del hijo
00:02:50
los parámetros propios del hijo
00:02:51
¿dudas?
00:02:54
vale, ahora
00:02:56
puede ser
00:02:57
que haya situaciones
00:03:00
extremas en el
00:03:02
mi clase abstracta solo tenga métodos abstractos, ¿vale? Nosotros hemos visto clases que no
00:03:04
tienen ningún método abstracto, hemos visto clases que tienen algún método abstracto
00:03:12
y alguno no, ¿vale? Podría ser que haya una situación en la que yo defino solo métodos
00:03:16
abstractos. No te digo en ningún caso, oye, mira, este método es así y se hace de esta
00:03:22
forma, porque todos los métodos que estoy haciendo, sustancialmente, tendrán que ser
00:03:27
implementado por mis hijos, no por mí. En ese caso, lo que estoy definiendo no es una propia clase,
00:03:33
pero es un contrato, es un esquema en el que yo te digo, te informo de cuáles tienen que ser los métodos
00:03:43
métodos que va a implementar la clase hija. Te voy a decir, mira, cualquier clase que
00:03:55
implemente mi clase, que extienda mi clase, que herede de mi clase, tendrá necesariamente
00:04:02
que tener el método calcula área que le paso este parámetro, el método calcula perímetro
00:04:09
que no le paso parámetro, el método no sé qué, no sé cuánto. Te estoy haciendo un
00:04:15
listado de lo que podrá hacer cualquiera de las clases que heredan de estas clases abstractas.
00:04:19
Al darse cuenta de eso, Java dice, vale, vamos a hacer así. Ponemos, las clases abstractas tal y
00:04:29
como hemos visto hasta ahora siguen existiendo y son las clases donde yo tengo un poco de clase
00:04:39
desarrollada y un poco de clase
00:04:46
que se me queda así abstracta
00:04:48
y que implementaré en mis hijos.
00:04:50
Pero en el caso en el que quiera
00:04:52
hacer uno de estos contratos,
00:04:54
quiero decir, oye, mirad,
00:04:56
todos los hijos, entre comillas,
00:04:58
que van a tener
00:05:00
relación con este contrato
00:05:01
tendrán que implementar todos estos
00:05:04
métodos sin implementar ninguno.
00:05:06
En vez de hacer
00:05:09
una clase, la voy
00:05:10
a llamar interfaz.
00:05:12
¿Vale?
00:05:15
¿Tenéis una idea de que es una interfaz, no necesariamente informática, aunque se usa mucho en informática, en general, una interfaz de usuario, una interfaz de la televisión?
00:05:15
¿Qué es una interfaz?
00:05:30
Algo como muy visual para el humano, en el que es accesible para el público.
00:05:32
¿Pero para qué sirve?
00:05:42
Es, digamos, una estructura, un mecanismo que permite a alguien interactuar con otro alguien.
00:05:48
La interfaz de la televisión, hago para decir, o del móvil, o qué sé yo,
00:05:59
pues a los infinites son una serie de puntos, de botones,
00:06:04
que permiten a un usuario interactuar con el sistema operativo.
00:06:07
Tú me das una serie de opciones que yo puedo pinchar o puedo seleccionar para que tú hagas algo.
00:06:11
Si algo está en la interfaz, lo puedo hacer.
00:06:18
Si algo no está en la interfaz, no.
00:06:22
Si vosotros pensáis al Windows, el Windows tiene una serie de botoncitos, el botón de inicio, el botón de icono, el botón de no sé qué.
00:06:27
y esos son los comandos
00:06:35
que os permite hacer por debajo
00:06:37
Linux transformará
00:06:39
esta interfaz de Windows
00:06:41
esta interfaz de usuarios
00:06:43
en comandos para el kernel
00:06:44
del sistema operativo para que haga lo que
00:06:47
tiene que hacer
00:06:49
entonces tengo una interfaz de usuario
00:06:50
los botoncitos es bonito
00:06:53
en Linux esta interfaz
00:06:54
de usuario existe
00:06:57
pero muchas veces luego te la saltas
00:06:58
y te vas directamente a la interfaz
00:07:01
textual
00:07:03
que es el CMD, el PowerShell, ¿vale?
00:07:03
De Windows, pues en Linux se usa mucho más
00:07:08
y allí lo que haces es otra forma de interactuar,
00:07:11
es otra interfaz que en vez de botoncitos
00:07:14
tienes comandos largos así,
00:07:17
que tanto gustan a los frígidos de Linux,
00:07:20
pero a pocos a los que les gusta Windows,
00:07:23
porque es más fácil darle a un botón
00:07:25
que escribir un comando así, ¿vale?
00:07:27
Pero son interfaces iguales.
00:07:28
Una es una interfaz gráfica,
00:07:30
Una es una interfaz textual. Es siempre un puente entre alguien que quiere usar algo más y usa esto. ¿Qué será una interfaz aquí? Pues lo mismo. Es crear un puente, un menú de, oye, mira, la clase que implementará esta interfaz, pues podrá hacer estas cosas.
00:07:32
Cualquier clase que tú me digas que implementa esta interfaz,
00:07:57
tendrá estos métodos y tú los vas a utilizar.
00:08:00
¿Cómo? Pues está escrito aquí.
00:08:03
Está el menú, están los prototipos de los métodos que vas a poder utilizar.
00:08:05
Entonces, con los prototipos de los métodos, tú sabes cómo utilizarlo.
00:08:11
Está la cálcula área que te va a dar un double, tú sabes cómo usarlo.
00:08:14
Está la cálcula perímetro que te va a dar un int, pues tú sabes cómo utilizarlo.
00:08:18
¿Vale? Cualquier clase que implemente esta interfaz tendrá que implementarlo y por lo tanto tú podrás llamar estos métodos sobre esta interfaz.
00:08:21
Te estoy definiendo cómo se usa la clase.
00:08:31
Estoy haciendo un contrato que dice cualquier clase que cumpla con este contrato podrá hacer estas cosas, tendrá estos comportamientos.
00:08:36
pero en abstracto
00:08:44
porque no sé cómo se hace
00:08:47
no sé cómo lo va a hacer
00:08:49
yo sé que va a calcular su perímetro
00:08:52
triángulo
00:08:54
cuando implementará la interfaz
00:08:55
geometría
00:08:57
pues seguramente tendrá
00:08:59
cálculo a perímetro y cálculo a área
00:09:01
¿cómo se hace? no lo sé
00:09:03
quien implemente triángulo lo tendrá que implementar
00:09:04
pero sé que tendrá estas dos opciones
00:09:07
¿se entiende?
00:09:09
es una clase abstracta
00:09:13
pero con todo abstracto, ¿vale?
00:09:15
Y entonces deja de ser una clase, entre comillas,
00:09:18
y se transforma en una interfaz, ¿vale?
00:09:21
Es un concepto similar a una clase abstracta,
00:09:24
es decir, un molde que define una estructura formal de métodos
00:09:26
para una clase, aunque no especifica su código, ¿vale?
00:09:30
Se quedan siempre abstractos.
00:09:35
Sirven para implementar un mecanismo similar a la herencia múltiple
00:09:38
con otros lenguajes orientados a objetos en Java.
00:09:41
Hemos dicho que Java hereda solo de una clase, de una clase, se abstracta uno.
00:09:44
Puedo hacer extends de una sola clase.
00:09:51
Sin embargo, de las interfaces, puedo implementar todas las interfaces que me da la gana.
00:09:54
Entonces, si yo siempre podré tener un clase no sé qué, extend no sé cuánto,
00:10:00
implements, que es la palabra que sirve para implementar las interfaces,
00:10:06
y cuántas interfaces me da la gana.
00:10:12
No sé qué, coma no sé cuánto, coma no sé cuánto.
00:10:15
De esta forma yo, heredar como tal y heredar métodos E,
00:10:18
pues lo haré de una sola clase.
00:10:22
Si no digo nada, lo haré de objeto.
00:10:24
Pero luego, firmar contratos diciendo que mi clase va a implementar
00:10:26
este método, este método, este método,
00:10:31
podrá hacer estas cosas, esta cosa, esta cosa,
00:10:33
crear la interfaz de mi clase, crear lo que pueda hacer mi clase,
00:10:34
Pues eso de allí lo puedo hacer con cuantos contratos me da la gana.
00:10:39
Puedo firmar cuantos contratos me da la gana.
00:10:44
Puedo implementar tantas interfaces cuanto me dé la gana.
00:10:46
¿Dudas?
00:10:51
Ok.
00:10:53
Se parecen al caso de Stata, pero a diferencia de estas, todos sus métodos son obligatoriamente abstractos.
00:10:55
Y como todos son abstractos, no ponemos el abstracto.
00:11:01
¿Vale? Cuando yo declaro una interfaz,
00:11:04
hace falta que ponga este método de abstracto, este método de abstracto, lo sé que son abstractos, son todos
00:11:07
abstractos. ¿Vale? Mientras en una clase normal
00:11:11
los métodos por defecto son concretos
00:11:15
y si lo quiero abstracto lo indico, en una interfaz
00:11:19
todos los métodos por defecto son abstractos. Por lo tanto, no lo indico.
00:11:23
¿Sí? Por lo tanto, no hay que escribir abstracto
00:11:28
en ningún sitio porque se sobreentiende que todos lo son.
00:11:33
dudas, entonces declaran utilizando la palabra interface en lugar de class, o sea public interface
00:11:36
nombre de mi interfaz, vale, abro llave, pongo todos los prototipos abstractos pero sin poner abstract
00:11:48
de los métodos que implementa esta interfaz, cierro y ya, lista la interfaz, cuando otra clase
00:11:57
implements la interfaz
00:12:06
que he creado, pues tendrá
00:12:08
que implementar todos los
00:12:10
métodos que yo he declarado dentro
00:12:12
de mi interfaz.
00:12:14
¿Dudas?
00:12:16
Sí.
00:12:18
¿Con esto conseguimos
00:12:19
que cuando acercamos el programa
00:12:22
nos salga como una pantallita para
00:12:24
interactuar con botones o no tiene nada que ver?
00:12:26
No tiene nada que ver.
00:12:28
El ejemplo que he hecho antes de interfaz es para que
00:12:29
entendáis el concepto de interfaz que estoy
00:12:31
creando. Pero esta no es una interfaz gráfica.
00:12:33
es una interfaz entre objetos vale como la televisión te proporciona a ti una
00:12:36
serie de opciones para que tú interactúe con ellas pues mi objeto proporcionará
00:12:42
una serie de métodos para que otros objetos interaccionen con él vale pero
00:12:46
estos métodos no son visuales la cuadra botoncitos y cosas y lo veremos en tercer
00:12:50
trimestre en gráfica de user interface
00:12:56
Entonces, para crear una clase que escriba código para los métodos de una interfaz,
00:13:00
se usa la palabra implements en vez de extends.
00:13:09
Entonces, yo puedo crear una interfaz poniendo public interface, nombre de la interfaz, bla
00:13:12
bla bla.
00:13:18
Si otra persona crea una clase que quiere implementar esa interfaz, pues lo que hago
00:13:19
es public class
00:13:24
cocodrilo
00:13:26
implements
00:13:28
animal.
00:13:30
Si la interfaz se llama animal.
00:13:32
¿Sí?
00:13:35
Entonces, se extiende
00:13:36
en otra clase, abstractas o no,
00:13:38
se implementan
00:13:40
interfaces.
00:13:41
¿Tú das?
00:13:44
¿Qué quería decir yo?
00:13:47
¿Qué se me ha quedado?
00:13:49
Ah.
00:13:51
Muchas interfaces
00:13:53
tienen un nombre
00:13:54
que acaba en able.
00:13:56
Comparable.
00:13:59
Serializable.
00:14:03
¿Vale? Porque sustancialmente
00:14:05
es como decir, si tú implementas
00:14:07
esta
00:14:09
interfaz, adquieres
00:14:09
la posibilidad de compararte
00:14:13
con otro. Comparable.
00:14:15
Adquieres la posibilidad de
00:14:17
serializarte, mandarte por internet.
00:14:19
Serializable.
00:14:21
Entonces, no es normal, hay otras distintas, pero veremos muchos, veremos que existe la
00:14:22
posibilidad de decir que cuando tú creas una interfaz o implementas una interfaz de
00:14:33
las bien conocidas, pues éstas serán interfaz que acaban en able.
00:14:38
También si ves un nombre de una clase o interfaz que acaba en able, pues planteas la posibilidad
00:14:45
que probablemente es una interfaz. Pero bueno, no es una regla escrita en la pieza.
00:14:50
Se pueden declarar referencias a objetos cuyo tipo sea una interfaz en lugar de una clase.
00:14:56
¿Qué quiere decir? Si yo tengo la interfaz animal, que ya hemos llamado, animal, animal, animal, ¿vale?
00:15:05
puedo hacer
00:15:18
animal x
00:15:21
es igual a new cocodrilo
00:15:22
tengo
00:15:25
class cocodrilo
00:15:30
implement animal
00:15:32
puedo hacer animal x
00:15:33
es igual a new cocodrilo
00:15:36
si, es lo que dice aquí
00:15:37
puedo crear una referencia
00:15:41
a un objeto cuyo tipo sea
00:15:44
un interfaz, o sea animal x
00:15:46
vale, pero luego
00:15:49
dentro tendré que poner un new cocodrilo
00:15:50
puedo poner new animal
00:15:52
hacer animal
00:15:54
x es igual a new animal
00:15:57
¿por qué no?
00:15:58
porque como no podía hacerlo
00:16:05
con la clase abstracta, tampoco lo puedo hacer con la interfaz
00:16:06
¿por qué? porque todos sus métodos son abstractos
00:16:09
no puedo crear
00:16:11
una instancia de una interfaz
00:16:12
puedo crear referencias
00:16:14
de tipo interfaz
00:16:17
pero no puedo crear
00:16:18
no puedo crear
00:16:20
objetos
00:16:22
con interfaz
00:16:23
Y, a partir de allí, todo lo que sabemos del polimorfismo de la parte de clases de estratos se aplica también a la interfaz.
00:16:25
Aquí yo puedo hacer un array de animales y poner dentro cocodrilos y gatos y perros y luego recorrer animales y hacerlos todos hacer su sonido, porque está en animal está el método hacer sonido, pero el perro, el gato lo habrá implementado como miau,
00:16:36
El perro lo habrá implementado claramente como bau, porque es italiano, ¿vale?
00:17:00
Y el cocodrilo lo habrá implementado como...
00:17:08
Es una grande pregunta, en que en italiano hasta tenemos una canción,
00:17:13
que os cantaría, pero no, porque eso no ha grabado.
00:17:20
Pero podéis buscarla, el cocodrilo come fa, ¿eh?
00:17:23
Mucho en eso no que lo sabe.
00:17:26
Muy bien
00:17:28
Esta forma de proceder
00:17:30
Tiene sentido para definir un objeto
00:17:33
En función de un tipo más genérico
00:17:35
Para utilizar mecanismos como el polimorfismo
00:17:37
Su principal función es establecer
00:17:40
Y estabilizar las interfaces
00:17:43
Prototipos de métodos de una clase
00:17:45
Que está por desarrollar
00:17:47
Y así coordinar varios equipos de trabajo
00:17:50
¿Qué quiere decir esta frase?
00:17:52
Una cosa importante
00:17:53
Con esto de la interfaz
00:17:54
Yo puedo organizar equipos de trabajo sin tener listo lo que voy a tener listo en un futuro,
00:17:56
pero sin bloquear los equipos de trabajo, no puedo seguir adelante.
00:18:06
O sea, si yo pillo una interfaz, la interfaz animal, y se la doy tanto a los desarrolladores de animales
00:18:12
como al desarrollador
00:18:18
de parque natural
00:18:20
¿vale?
00:18:22
el desarrollador de parque natural
00:18:23
interactuará con los animales
00:18:25
usando su interfaz
00:18:28
podrá hacer con los animales
00:18:30
lo que la interfaz dice
00:18:32
que pueden hacer los animales
00:18:34
sin saber luego cómo lo hacen
00:18:35
no se han implementado todavía los métodos
00:18:38
pero yo sé que puedo hacer
00:18:40
un array de animales y pedirle
00:18:42
que coman, pedirle que corran
00:18:44
pedirle que hagan su sonido. ¿Vale? Cuando luego el otro equipo de trabajo habrá generado cocodrilo
00:18:46
que implementa animal, gato que implementa animal y perro que implementa animal, yo dentro de mi
00:18:55
parque natural podré utilizar gato, perros y cocodrilos metidos en arrays utilizándolos con
00:19:01
referencias de animal. Está claro que no podré hacer lo que hace un gato de verdad, pero podré
00:19:09
Podré utilizar los datos como anual.
00:19:14
¿Se entiende?
00:19:18
Eso es muy importante.
00:19:19
Porque si lo hago bien, estoy definiendo los puntos de contacto entre módulos,
00:19:21
los puntos de contacto, las interfaces entre objetos,
00:19:26
los mensajes que se pueden mandar los objetos,
00:19:30
las acciones que pueden hacer los objetos,
00:19:32
o que un objeto puede pedir a otro objeto.
00:19:35
Las defino sin implementar cómo se hace,
00:19:37
pero defino qué se hace en una interfaz
00:19:40
Y a este punto puedo paralelizar el desarrollo en varios equipos de trabajo.
00:19:44
¿Dudas?
00:19:51
Yo lo que entiendo de interfaz es como que estás separando las clases abstractas
00:19:52
para no mezclar los métodos abstractos dentro de una clase abstracta.
00:19:57
Y los pones en una interfaz y no sé si en una práctica ya vas a usar ambas cosas
00:20:02
o separas los métodos.
00:20:08
Sí y no.
00:20:10
¿Vale? No necesariamente.
00:20:11
O sea, el concepto de clase abstracta sigue existiendo.
00:20:14
A lo mejor tú, cuando nosotros hacemos el vehículo, a lo mejor moverse es abstracto porque cada vehículo se mueve distinto.
00:20:16
Pero velocidad máxima o, no sé, calcula velocidad máxima, imagínate.
00:20:29
Pues eso a lo mejor lo puedes calcular independientemente de qué vehículo sea.
00:20:35
Porque hay una velocidad máxima que es la constante de la luz.
00:20:40
No sé.
00:20:42
Me voy por la rama.
00:20:44
Pero a lo mejor hay cosas que se aplican a todos los vehículos y eso lo implementas ahí.
00:20:44
Hemos hecho algunos ejemplos que hemos desarrollado la cosa allí directamente en la clase abstracta y otras cosas en vez que no.
00:20:49
Pero esas cosas van juntas y yo quiero que estén en el mismo bloque, en la misma clase.
00:20:59
Entonces necesito una clase abstracta, no lo puedo hacer con una interfaz.
00:21:05
Lo digo porque podrías separarlo e igualmente tendrías el mismo resultado.
00:21:08
Lo puede hacer, pero no.
00:21:11
Porque a lo mejor yo no quiero que se pueda crear clases
00:21:13
que tengan la parte de la interfaz sin tener lo que he hecho en la clase abstracta.
00:21:18
Si yo te creo una clase abstracta, cuando tú la extendes,
00:21:25
te traes la parte abstracta que tendrás que implementar,
00:21:28
pero te estás también heredando lo concreto.
00:21:31
Si yo lo he separado en una interfaz,
00:21:35
tú podrías implementar la interfaz sin extender la otra clase.
00:21:37
Entonces, te he dado la posibilidad de implementar lo que tenías que implementar sin haberte llevado el extra.
00:21:41
Pero si yo no quiero que eso pueda pasar, si yo quiero que todo lo que implementen estos métodos abstractos
00:21:49
también tenga este método concreto que se hace así, como por ejemplo el constructor,
00:21:54
para que conte cuántos animales he creado, pues entonces no lo puedo hacer en el extra.
00:21:59
no es que son
00:22:06
o esto o esto
00:22:09
son dos mecanismos
00:22:10
tres, clases concretas
00:22:13
clases abstractas e interfaces
00:22:15
que son
00:22:16
parecidos, son similares
00:22:18
se pueden, cooperan
00:22:21
y hay algunos casos en que necesito una cosa
00:22:22
o una cosa no, las clases abstractas
00:22:25
son más raras que las interfaces
00:22:27
es más probable
00:22:29
encontrar interfaces y hacer lo que dices tú
00:22:31
que me lo separe
00:22:33
cuando quiero añadir un cierto comportamiento
00:22:34
implemento una interfaz y cosas así
00:22:36
que las clases abstractas
00:22:38
pero no es que
00:22:40
las clases abstractas te dan esta posibilidad
00:22:41
de decir en paquete
00:22:44
porque estoy hablando por objetos, cuando modelizo el objeto
00:22:46
pues quiero que todo lo que
00:22:48
representa el objeto y todo lo que esté
00:22:50
relacionado con el objeto esté en la misma clase
00:22:52
entonces le estoy midiendo
00:22:55
cosas concretas que se hace así
00:22:56
con cosas abstractas que dime tú
00:22:58
cómo se hace
00:23:00
entonces es una
00:23:02
filosofía distinta
00:23:03
Estos son términos, más que de programación pura, de diseño.
00:23:05
Entonces, es lo que yo quiero poder hacer con estas clases.
00:23:10
Lo que yo quiero que las clases hijas, las subclases,
00:23:14
quieran hacer con respecto a las otras.
00:23:20
En el constructor también hay mucha diferencia.
00:23:25
En el constructor de una clase de una interfaz, creo que no se puede hacer.
00:23:31
creo que no se puede
00:23:35
implementar un constructor
00:23:38
en un encendido, ahora
00:23:40
lo debería comprobar, pero diría que no
00:23:41
¿vale? ahora de todas formas
00:23:44
al final de esto hay un par de transparencias
00:23:46
de que diferencia hay entre interfaz
00:23:48
de clases abstractas y a lo mejor
00:23:50
allí descubrimos algo
00:23:52
¿vale?
00:23:53
vale, esto es siempre sobre este tema
00:23:59
aquí ¿vale? el equipo que tiene que
00:24:01
utilizar objetos que
00:24:03
implementen dicha interfaz, basta con que
00:24:05
declara en su código una referencia
00:24:07
dicha interface, ¿vale?
00:24:09
O interfaz.
00:24:12
Aunque no está todavía compilada,
00:24:13
ninguna de las clases que la implementa.
00:24:15
O sea, yo trabajo
00:24:17
con la interfaz, cuando
00:24:18
trabajo en mi código, lo que hago
00:24:21
es crear referencias a esta interfaz,
00:24:23
me da igual qué clase esté dentro.
00:24:25
¿Ok? Entonces puedo
00:24:28
trabajar en paralelo
00:24:29
mientras otro está implementando
00:24:31
clases que implementan
00:24:33
estas
00:24:35
interfaces que luego
00:24:35
serán las que utilizaré de verdad
00:24:38
yo en mi parque
00:24:39
natural estoy trabajando con animales
00:24:42
en un futuro
00:24:44
alguien implementará perro
00:24:47
y entonces cuando llamo cosas
00:24:48
sobre animales pues lo ejecutará este perro
00:24:50
creará gatos
00:24:53
y entonces trabajará con gatos
00:24:54
creará lince pues trabajaré también con las lince
00:24:56
pero desde mi
00:24:58
programa, desde la perspectiva
00:25:00
del parque natural estoy trabajando con animales
00:25:02
los equipos que creen clases
00:25:04
que implementan dicha interfaz están a su vez
00:25:10
desacoplados de los
00:25:12
equipos que la utilizan y pueden escribir
00:25:14
sus códigos independientemente
00:25:16
tengo una independencia
00:25:18
un desacoplamiento que es interesante
00:25:20
dentro del mundo de la informática
00:25:22
porque me evita
00:25:24
vínculos, me evita dependencias
00:25:26
y por lo tanto puedo paralelizar
00:25:28
cuanto más paralelizo, más puedo avanzar
00:25:30
rápidamente
00:25:32
Cuanta más codependencia tengo entre dos módulos o dos bloques, peor es el desarrollo porque hasta que él no ha hecho esta parte no puedo seguir adelante.
00:25:33
Si fuera necesario que exista un objeto real detrás de una referencia o una interfaz que todavía no se ha programado el otro equipo, se podría utilizar un objeto mock.
00:25:43
mock es como falso
00:25:55
es como
00:25:57
de mentira
00:25:57
y es una técnica que se hace
00:26:02
a lo mejor yo tengo que probar mi mecanismo
00:26:04
pero no lo puedo probar porque tengo solo referencias
00:26:07
animal y necesito
00:26:09
un objeto que haga algo
00:26:11
pues me implemento una clase
00:26:13
yo que implementa
00:26:15
animal pero que hace solo
00:26:17
métodos mock
00:26:19
que dice el animal
00:26:20
está hablando cuando hace su sonido
00:26:22
el animal se está moviendo cuando
00:26:24
podamos mover. No está haciendo
00:26:26
de verdad las cosas, pero me está
00:26:28
mandando mensajes para ver
00:26:30
si esto funciona. Cuando yo llamo las cosas
00:26:32
pues me da un retorno de
00:26:34
un son básico falso
00:26:36
que no es real. A lo mejor
00:26:38
hay un método que debería
00:26:40
acceder a una base de datos. Si todavía no está
00:26:42
lista toda esa parte allí, pues simplemente
00:26:44
me devuelve datos falsos como si lo hubiese
00:26:46
pillado de una base de datos.
00:26:48
Pero me devuelve siempre los mismos métodos en vez
00:26:50
de ir a acceder a un
00:26:52
acceso a la base de datos. ¿Entiendes? Son todos mecanismos para poder programar en equipos
00:26:54
desacoplados y poder ir en paralelo. Un ejemplo concreto de una interfaz que será vuestro íncubo
00:27:01
en los próximos días es la interfaz Comparable. Sirve para dotar de un orden natural a los
00:27:10
objetos de una clase determinada. Por ejemplo, imaginaos que yo tengo
00:27:20
la clase gato, muchos gatitos, con dentro sus propios
00:27:24
atributos de gato, ¿vale? El nombre del gato,
00:27:28
la raza del gato, la guapura del gato, que siempre es 10,
00:27:32
porque son los animales más bonitos, pues, ¿qué se le va a hacer?
00:27:35
Ahora, imaginaos que yo quiera ordenar los gatos,
00:27:40
¿vale? Como es una cosa que creo yo,
00:27:44
yo tengo que definir cuál es el concepto
00:27:48
de orden de gato. ¿Cómo se ordenan los gatos?
00:27:52
¿Se ordenan por nombres? ¿Se ordenan por guapura? ¿Se ordenan por raza?
00:27:55
No lo sé. No tienes que decir tú. Como yo he creado
00:28:00
este objeto, que puede ser gato, puede ser otra cosa, puede ser coche.
00:28:04
¿Cómo ordeno los coches? ¿Vale? Pues tengo que
00:28:08
definir cómo se ordenan los coches. Para eso
00:28:12
pues implemento
00:28:15
la clase, la interfaz
00:28:17
comparable. Todas
00:28:20
aquellas clases que implementan
00:28:21
la interfaz comparable
00:28:23
adquieren la capacidad
00:28:25
de poder comparar
00:28:28
dos objetos de esa clase
00:28:29
y decir, este viene antes
00:28:31
que este.
00:28:33
¿En base a qué? En base a la definición
00:28:35
de orden que yo definiré
00:28:38
en comparable.
00:28:40
¿Está claro?
00:28:42
O sea, si yo digo los números
00:28:44
pensad en la clase number que existe
00:28:45
o la clase integer
00:28:48
la hemos usado, integer.parts.int
00:28:50
que representa los enteros
00:28:52
vosotros me sabéis ordenar
00:28:55
el integer o el objeto integer 3
00:28:56
y el objeto integer 5
00:28:59
¿cuál viene antes?
00:29:01
3, ¿por qué?
00:29:02
porque el orden de los números los tenemos aquí
00:29:04
pero cuando voy a comparar
00:29:07
dos mochilas
00:29:09
¿viene antes esta mochila de aquí
00:29:11
o esta mochila de aquí?
00:29:13
No sé. Hay dos opciones. O no hay un orden y entonces no implemento comparable y no puedo establecer cuál viene antes. O implemento comparable, me dirá que tengo que implementar el método compareTo, que es el método que está dentro de comparable, solo como productivo.
00:29:14
es abstracto, lo tengo que implementar yo, y dentro de la implementación de este de aquí,
00:29:42
tengo que pillar estas dos mochilas y decidir cuál viene primera y cuál viene segunda,
00:29:47
en base a lo que yo he decidido que es el orden. Para mí el orden puede ser el color. Lo paso a
00:29:52
hexadecimal, miro cuál es el que viene antes, en base a eso, pues si viene antes o una otra.
00:30:02
si pillo negro, que es 0, 0, 0, 0, 0
00:30:10
y otra mochila que es blanca, que es
00:30:17
negro viene antes que blanco
00:30:19
porque es un número hexadecimal más bajo
00:30:21
lenguaje de marcas
00:30:24
pero no, digo, no
00:30:27
lo quiero ordenar por
00:30:33
capacidad
00:30:35
pues capacidad
00:30:36
entonces miro esto de aquí, esto tiene
00:30:40
13 litros, este tiene 12 litros, pues
00:30:42
este viene antes que este.
00:30:44
Lo quiero ordenar por
00:30:49
nombre de la marca. Pues esta aquí es
00:30:51
marca, no tengo ni idea. Esa es marca
00:30:53
otra marca, pues
00:30:54
N
00:30:57
viene antes que O, por lo
00:30:58
tanto viene antes el de, no sé su
00:31:01
marca, que el de otra marca.
00:31:02
¿Se entiende?
00:31:06
¿Quién define esto? Yo. ¿Por qué?
00:31:06
Porque soy yo el que crea esa clase.
00:31:09
He creado esta clase, he definido
00:31:11
que va a poder ser comparable,
00:31:13
o sea, que yo puedo pillar dos objetos
00:31:15
entre ellos y puedo comparar quién viene
00:31:17
antes y quién viene después, porque luego
00:31:18
los quiero ordenar, dame una definición
00:31:20
de orden.
00:31:23
Es parecido este problema
00:31:24
a cuando veíamos el equals.
00:31:26
¿Verdad? Que nosotros decíamos, tengo
00:31:29
dos objetos, pues tengo que definir
00:31:30
la relación de identidad. ¿Cuándo estos
00:31:33
dos objetos son iguales? ¿Cuando tengan el mismo
00:31:35
DNI? ¿Cuando tengan el mismo DNI
00:31:36
en nombre? ¿Cuando tengan el mismo...?
00:31:38
¿Sí? Pues aquí es lo mismo.
00:31:41
Cuando comparo dos objetos, ¿cómo se comparan estos señores?
00:31:43
Se comparan en base a su nombre, su color, su...
00:31:47
Pero el concepto fundamental es que cuando yo quiero comparar,
00:31:52
quiero que mis objetos sean comparables,
00:31:56
lo que hago es implementar, public class, ya habíamos dicho,
00:32:00
implements comparable.
00:32:04
Esto me fuerza a implementar el método compareTo.
00:32:07
Compertur necesita dos elementos
00:32:11
Por un lado, el objeto
00:32:19
Que es un objeto de los dos que voy a comparar
00:32:22
¿Vale?
00:32:27
Tú me pasas, me dices, compáralo a este señor
00:32:28
Vale, ok, perfecto
00:32:32
Lo voy a comparar con este objeto de aquí
00:32:33
¿Vale?
00:32:35
Es el segundo objeto
00:32:36
¿Cuál es el primero?
00:32:37
Sobre el que se llama método
00:32:43
es decir? No, ese es el segundo. ¿Cómo hago referencia al objeto sobre el que se ha llamado
00:32:44
el método? This. O sea, que este método de aquí está haciendo una comparación entre
00:32:58
this y el objeto. Entonces, aquí dentro, en la implementación del compareTo, yo tendré
00:33:04
dos opciones. Acceder a this.nombre y a objectO, ¿no? O.nombre para comparar los nombres.
00:33:15
o a dis.color y a o.color para comparar los colores, o a las dos cosas.
00:33:24
Aquí tengo que compararlo solo según un factor.
00:33:32
Yo podría decir que se ordenan como primer factor según el color,
00:33:36
y si dos tienen el mismo color, según la capacidad.
00:33:40
Lo codifico.
00:33:44
Tened en cuenta, pero, que aquí yo estoy comparando un dis,
00:33:47
que en mi ejemplo era un gato
00:33:53
con un objeto.
00:33:55
El gato tiene nombre
00:33:58
y tiene raza y tiene
00:33:59
guapura, ¿no?
00:34:01
Pero objeto no.
00:34:03
Objeto no tiene nombre. Si yo hago
00:34:05
o.nombre no me funciona.
00:34:07
Entonces, ¿qué tendré que hacer?
00:34:09
Pero yo tengo
00:34:19
un disk que seguramente es un gato, porque estoy
00:34:20
dentro de gato. Y un objeto.
00:34:22
¿Qué hago con este objeto?
00:34:24
Os lo mimo si queréis.
00:34:26
Downcasting.
00:34:40
Eso ha sido porque lo han animado muy bien, ¿verdad?
00:34:42
Downcast. Lanzar casting.
00:34:46
Muy bien. Tengo que hacer un downcasting, o sea, pillar...
00:34:51
Por un lado tengo el disc que es un gato.
00:34:55
Ahora tengo un objeto O.
00:34:57
Este objeto O tendré que hacer un downcasting a gato, si puedo.
00:34:59
¿Vale? Y a este punto...
00:35:04
Tened en cuenta que si yo intento comparar un gato y le paso como parámetro aquí un cocodrilo,
00:35:07
pues tiene que explotar algo, porque gatos y cocodrilos no se pueden comparar.
00:35:15
¿Qué viene antes? ¿3 o K?
00:35:20
¿3 como entero o K como letra?
00:35:24
Vale, entonces, además, la interfaz comparable me dice,
00:35:33
oye mira, tengo este método, lo tienes que implementar así, no es que hay que ponerle gato,
00:35:38
no, tiene que ser int compareObject.Dentro harás un, si yo, una, como se dice, un instance of gato,
00:35:44
pues entonces da un cast a gato y haz lo que tienes que hacer, si no explota. Vale, y además
00:35:58
de decirme el método que tengo que implementar, me describe cómo se implementa. O sea, cuando yo
00:36:05
implemento con Parable y tengo que implementar este método, tengo que cumplir esta regla. Tengo
00:36:13
que dar un número negativo si this es menor que o. Si en el orden viene antes this y luego o,
00:36:21
el resultado tiene que ser negativo
00:36:34
si son iguales
00:36:36
a nivel de orden
00:36:40
por ejemplo tienen el mismo color entonces son iguales
00:36:42
hasta si son objetos distintos pero
00:36:44
a nivel de ordenación da igual si viene
00:36:46
uno antes, pues tendré que devolver
00:36:48
cero
00:36:50
y si this viene después
00:36:51
de o
00:36:54
pues entonces tengo que dar
00:36:56
un número positivo
00:36:58
este número positivo puede ser
00:36:59
o simplemente menos uno cero
00:37:02
y 1. Suficiente.
00:37:03
Pero si yo devuelvo siempre
00:37:06
menos 1, 0 y 1,
00:37:07
no sé cuánto distintos son.
00:37:09
Imaginaos siempre
00:37:14
con los colores. Si yo tengo
00:37:15
negro y blanco estando al extremo,
00:37:17
son muy distintos.
00:37:19
Pues, y imaginamos que
00:37:21
this sea negro y o
00:37:23
sea blanco, pues entonces
00:37:25
como this viene antes que o,
00:37:27
me devolvería menos 1.
00:37:29
Y ahora tengo
00:37:31
this que es negro y 1
00:37:32
que es gris, ¿qué me devolvería?
00:37:35
Siempre menos uno. Porque dices
00:37:41
negro, viene antes que el gris. Por lo tanto, siempre
00:37:44
menos uno. O sea, que sea muy cerca,
00:37:47
que sea un gris muy oscuro, sea un gris muy claro, o sea
00:37:50
blanco, siempre me devuelve menos uno. No sé a qué distancia
00:37:52
están. No sé cuánto distinto son.
00:37:55
¿Lo sé ordenar? Sé que negro viene antes que gris,
00:37:58
pero no sé cuánto antes.
00:38:02
Si en vez me busco otra forma, por ejemplo, hago
00:38:04
una resta entre
00:38:07
el número
00:38:09
en esta decimal
00:38:10
y el otro número en esta decimal.
00:38:13
Los restos.
00:38:16
Entonces, cuando hago 0, 0, 0
00:38:17
que es negro menos un gris,
00:38:19
me dará un valor negativo,
00:38:21
pero más pequeño,
00:38:24
o sea, más grande,
00:38:25
que si hago 0
00:38:26
menos el blanco,
00:38:29
que es el máximo número que tengo que hacer.
00:38:32
O sea, 0 menos gris
00:38:33
me dará menos 50
00:38:35
hago para decir, y 0 menos
00:38:37
blanco me dará menos
00:38:39
5.000. Entonces sé que hay una
00:38:41
diferencia. Los dos son negativos, sé
00:38:43
quién viene antes y quién después, pero además
00:38:45
me da una indicación de cuánto antes
00:38:47
o después llega. ¿Se entiende?
00:38:49
Esto depende
00:38:53
de cómo lo hago. No me lo dice aquí.
00:38:53
No me dice, oye, mira, tienes que
00:38:55
decir cuánto antes y cuánto después.
00:38:57
No. A mí lo importante es que siga
00:38:59
esta regla. Lo que está diciendo
00:39:01
es que dependiendo de cómo lo digo,
00:39:03
de cómo lo hago, puede tener
00:39:05
más o menos información
00:39:07
este número negativo.
00:39:08
O positivo.
00:39:11
¿Vale?
00:39:13
Es muy recomendable
00:39:13
que con perturbe
00:39:15
sea consistente
00:39:16
con igual.
00:39:17
O sea,
00:39:20
si yo tengo
00:39:21
dos objetos
00:39:22
o,
00:39:24
pero me está de vez,
00:39:25
si tengo dos objetos
00:39:26
que igual
00:39:27
se me dice true,
00:39:28
pues también
00:39:31
con perturbe
00:39:32
tiene que estar cero.
00:39:33
¿Ves?
00:39:37
No.
00:39:37
No es necesario.
00:39:38
Pero si dos objetos son el mismo objeto, su comparable, o sea, su convertu, tiene que dar cero.
00:39:40
Si son el mismo objeto, no puede ir uno antes que otro.
00:39:49
Ahora, si dos objetos como convertu dan cero, podrían no ser iguales.
00:39:52
Por ejemplo, mis mochilas negras.
00:39:59
Tengo dos objetos que son mochilas negras, son distintas, pues a nivel de convertu no hay uno que viene antes que otro, pero no son el mismo objeto.
00:40:01
Por lo tanto, equals daría false.
00:40:10
¿Entiendes?
00:40:15
Esto es una cosa que tenéis que considerar.
00:40:17
Si implementáis comparable, tenéis que toquetear también equals.
00:40:18
Y definir que si dos objetos son equals, cuando dos objetos son equals, pues comparable tiene que devolverse.
00:40:23
Ejemplo.
00:40:33
¡Ejemplo!
00:40:39
¡Uy, ejemplo animal!
00:40:40
Fíjate tú, no me acordaba que aquí era un ejemplo de un animal.
00:40:42
Pues, public interface animal, ¿vale? Convoida habla, ¿cómo no?
00:40:45
Public class perro, implementa animal, ¿vale?
00:40:49
Fijaos que es una interfaz, ¿vale?
00:40:53
Entonces, esto quiere decir que tengo que implementar necesariamente habla.
00:40:55
Entonces, hago guau, ¿vale?
00:40:59
Este es español.
00:41:01
Y luego tengo gato, que como animal hace miau, ¿sí?
00:41:04
Entonces, ¿cómo lo uso?
00:41:07
Puedo crear un animal con dentro un perro, un animal con dentro un gato y hacer dog.habla cat.habla.
00:41:09
Puedo crear un array de animales con dentro ponerle un gato y perro tranquilamente. Luego
00:41:19
hago que hablan todos y le paso el array de animales. Entonces este es un método que hablen
00:41:27
todos con un array de animales. Lo que hace es recorrer el array y llamar el habla. Aquí no
00:41:32
necesita hacer downcasting ni nada por
00:41:40
porque usa
00:41:42
polimorfismo
00:41:45
y entonces cuando yo lo llamaré
00:41:47
sobre un animal.habla
00:41:50
aun si un animal es de tipo animal
00:41:52
se usará el habla
00:41:54
de la instancia
00:41:56
de ese objeto, no de la
00:41:58
referencia a ese objeto, entonces
00:42:00
usará o gato o perro
00:42:02
si es un gato o si es un perro
00:42:04
si lo he definido como un gato
00:42:06
dudas, para complicar
00:42:07
un poco las cosas
00:42:17
existen los métodos
00:42:18
default en una interfaz
00:42:20
que es un método default
00:42:23
como en una clase abstracta
00:42:24
los métodos son
00:42:27
normales, pero puedo definir
00:42:28
algunos abstractos
00:42:31
en una interfaz los métodos son
00:42:32
abstractos, pero puedo definir
00:42:34
algunos concretos
00:42:36
entonces
00:42:37
si esta es una interfaz animal
00:42:42
que tiene void habla, este es un método abstracto
00:42:44
¿vale? pero puedo definir
00:42:47
un default void correr, ¿qué me está diciendo? Mira, oye,
00:42:48
todos los animales pueden hablar y correr.
00:42:52
Todos. Porque cuando implementan un animal, estos son los métodos que tiene.
00:42:56
Te voy a dar una implementación
00:43:00
por defecto que tú puedes usar o no.
00:43:05
Si quieres, esta ya la tienes,
00:43:09
pero si luego la quieres especificar
00:43:12
en tu animal, pues lo puedes hacer.
00:43:16
Entonces, por ejemplo, puedo tener un perro
00:43:18
que solo implementa habla
00:43:19
y tiene corre por defecto
00:43:21
pasada,
00:43:24
y puedo implementar un gato que
00:43:25
implementa habla y que
00:43:27
sobreescribe en un cierto sentido
00:43:29
corre. Entonces, cuando luego
00:43:31
lo llamaré sobre un perro,
00:43:33
usará la implementación
00:43:36
por defecto.
00:43:38
Cuando lo llamo sobre el gato,
00:43:40
usará la del gato.
00:43:42
¿La interfaz animal no sería posible en una clase abstracta porque está combinando o es lo mismo?
00:43:46
Es lo mismo.
00:43:52
Pero es lo que decía antes.
00:43:54
Mientras una clase abstracta es una clase que deja abstracto algún método,
00:43:56
la interfaz es, defino todo abstracto y puedo concretar alguno.
00:44:02
Es filosofía un poquito distinta.
00:44:08
La diferencia fundamental es que una clase abstracta solo puede heredar una,
00:44:10
Mientras la interfaz, puedes implementar cuanto sea la gana.
00:44:16
Y acordaos que está también el concepto de ISEP.
00:44:24
Cuando tú creas, cuando tú extendes otro elemento, otra clase, tú eres una diversa clase.
00:44:29
Para crear jerarquía como tú quieras.
00:44:36
Tienes las dos herramientas, al fin y al cabo son muy parecidas.
00:44:39
Y ahora llegamos a ver posibles diferencias.
00:44:42
Pero la esencia fundamental, básica e importante, es que de clases abstractas puedes extender una sola,
00:44:45
de clases de interfaces puedes implementar cuantas quieras.
00:44:53
Es una forma de hacer algo parecido a la herencia múltiple en Java.
00:44:58
No. Es parecido a una clase abstracta.
00:45:03
Sí, no sé si formalmente lo es, debería ser, ¿vale?
00:45:22
No te pide que te lo sacore porque usará su implementación por defecto.
00:45:39
Que, repito, vispa sí, es muy parecido a hacer una clase abstracta donde esto es un método normal, esto es un método abstracto.
00:45:46
¿Sí? El problema es que si tú eres gato y quieres extender felino, ahora tienes un problema si esta es una clase strata, porque no puedes extender también animal, ¿sí?
00:45:52
Y entonces puedes hacer esta trampa de aquí y haces extendo felino e implementa animal.
00:46:09
¿Listo? ¿Dudas?
00:46:17
Clases, estas son las interfaces, ¿vale?
00:46:24
¿Qué problemas, o sea, qué aspectos tenemos que tener en cuenta cuando vamos a mirar clases abstractas y interfaces y qué relaciones tienen?
00:46:28
Juegan en la misma liga, porque son muy parecidas, tienen cosas que no es fácil decir, uso esto, uso otro, cosas por el estilo.
00:46:40
La cosa principal y importante que penséis es que si tengo que extender, si estoy obligado a extender ya una, pues todas las demás tienen que ser interfaces.
00:46:50
Eso es una cosa que me...
00:47:01
Cuando yo tengo que decir, quiero hacer algo de ese estilo, ¿qué hago? ¿Una clase abstracta o una clase interfaz?
00:47:02
En base a eso, tendría que pensar, oye, mira, la clase que luego he heredado aquí, ¿ya he heredado de otras clases o no?
00:47:11
Porque si quiero ir a otra clase, tengo que ir por interfaz de seguro.
00:47:18
Si no, no lo puedo pensar.
00:47:22
Entonces, ¿qué puntos tengo en mente cuando tengo que comparar o pensar si usar una clase abstracta o una interfaz?
00:47:24
Primero, el propósito.
00:47:32
Una clase abstracta se utiliza para proporcionar una estructura básica para una jerarquía de clases.
00:47:34
Mientras que una interfaz se utiliza para definir un contrato que debe cumplirse por una clase que implementa la interfaz.
00:47:42
¿Qué quiere decir?
00:47:51
Cuando se usan clases y clases abstractas y conceptos de herencia, yo estoy creando un árbol de herencia.
00:47:52
Estoy creando clases que tienen que ver una con otra.
00:47:58
Las interfaces suelen ser algo un poco más independiente.
00:48:03
Las interfaces no entran en esta construcción jerárquica que me estoy creando para mi contexto de mi problema, ¿vale?
00:48:07
Yo creo las personas, luego los alumnos, los profesores, todas estas son clases que entran dentro del problema escuela que estoy gestionando, ¿vale?
00:48:15
Entonces, persona la hago abstracta y luego uso solo profesores y alumnos como concretizaciones de esta clase abstracta,
00:48:24
pero están relacionadas entre ellos de esta jerarquía que tienen, etcétera, etcétera, ¿vale?
00:48:33
O empleado, o profesor, o lo que sea, ¿vale?
00:48:39
La clase, la interfaz, no está en esta construcción.
00:48:43
Está un poco más al margen.
00:48:49
Cuando tú dices comparable, ¿vale? La interfaz comparable que permite luego comparar alumnos o comparar profesores, ¿esto dónde la pondríais en esta jerarquía?
00:48:51
A un lado, es como al lado, ¿vale? Un profesor puede implementar comparable, un alumno puede implementar comparable, una persona podría implementar comparable, no lo sé, ¿vale?
00:49:03
si quisiera poder comparar estas cosas.
00:49:13
Como una cosa un poquito al margen,
00:49:16
no está en esta estructura de definición de problema,
00:49:18
del contexto del problema que estoy creando.
00:49:23
Entonces, cuando lo que quiero crear
00:49:25
es un elemento de esta construcción,
00:49:27
es algo que modeliza las entidades
00:49:29
que están trabajando dentro de mi contexto del problema,
00:49:33
pues posiblemente usaría una clase abstracta.
00:49:39
Si en vez de ser algo que puedas reutilizar en otros contextos o en contextos distintos, pues es más intérprete.
00:49:41
¿Sí? Entonces, ¿qué propósito tiene esta nueva cosa que voy creando?
00:49:48
Vaya esto, pues, clases abstractas e intérpretes.
00:49:54
Implementación de métodos.
00:49:58
Una clase abstracta puede proporcionar una implementación para algunos de sus métodos,
00:49:59
mientras que las clases que la heredan deben implementar los métodos restantes.
00:50:03
Por otro lado, en una interfaz, los métodos son solo declaraciones y no tienen una implementación, a menos que no se utilice el método de Paul.
00:50:08
Esto quizás es más débil, porque dice más o menos lo mismo.
00:50:15
Pero tú lo piensas así y dices, ¿qué quiero hacer yo?
00:50:19
¿Me sale mejor pensar que esto es una clase con métodos implementados y alguno que no puedo implementar, que dejaré como abstracto?
00:50:24
o es más bien un contrato
00:50:33
un algo que yo digo, todos los que
00:50:36
implementan esto tienen que cumplir
00:50:37
con estas cosas y además como
00:50:40
bonus
00:50:42
alguno de estos te doy una
00:50:43
definición estándar
00:50:45
por defecto que normalmente
00:50:48
se hace así, pero que si tú quieres
00:50:49
lo haces como tú quieras y si no pillas
00:50:52
la que tú quieras, ¿vale?
00:50:53
como filosofía es un poquito distinta
00:50:55
una es
00:50:57
me centro en lo que puedo hacer
00:50:59
y dejo para hacer lo que no puedo
00:51:02
y otra es
00:51:04
clarifico lo que se tiene que poder
00:51:05
hacer y a lo mejor te doy
00:51:08
alguna solución ya hecha.
00:51:10
Filosóficamente es un poquito distinto.
00:51:13
Como diseño es un poquito distinto.
00:51:15
Herencia
00:51:20
lo que es más importante y más clave.
00:51:20
Una clase puede extender
00:51:23
solo una clase abstracta pero puede implementar
00:51:25
múltiples interfaces. Esto significa
00:51:27
que una clase puede heredar la característica
00:51:28
de varios contratos diferentes
00:51:31
al implementar múltiples interfaces.
00:51:32
Entonces, lo que decíamos antes, si yo ya estoy forzado a extender una cosa, si yo soy alumno y ya seguramente tengo que extender persona, si quiero darle más cosas, pues tengo que crear interfaces, no puedo crear una clase abstracta.
00:51:35
Si quiero crear evaluable, que me permite, que tiene el método hacer un examen y que así puede, todos los objetos que sean evaluables pueden hacer un examen, pues no lo puede hacer como clase astrata, porque si alumno ya extiende personal, no podría extender también evaluable como clase astrata.
00:51:50
Tendrá que ser una interfaz.
00:52:16
Entonces, a veces tengo constricciones necesarias. Si tengo las dos posibilidades, porque alumnos todavía no heredan nada, pues lo pienso. Y si es posible, yo iría hacia... Si tenéis la posibilidad, si no está claro, iríais hacia clase astrata o interfaz.
00:52:20
interfaz. Porque así no me pillo
00:52:40
los dedos y mañana me doy cuenta que tengo
00:52:45
que extender.
00:52:47
Y también variables.
00:52:50
Las variables en una clase abstracta
00:52:53
pueden ser estáticas o no estáticas.
00:52:55
Mientras que en una interfaz
00:52:58
solo pueden ser
00:52:59
estáticas o finales.
00:53:01
O sea, constantes.
00:53:04
Esto también es otra cosa importante.
00:53:05
Cuando yo defino
00:53:08
las variables en una clase abstracta
00:53:08
son variables del propio objeto,
00:53:11
que luego heredará quien estén de este objeto.
00:53:13
Sin embargo, en una interfaz, las variables no son del objeto,
00:53:16
solo son variables estáticas, o sea, de la clase.
00:53:21
Entonces, allí también es una pista para ver si uso clase abstracta o no, o interfaz.
00:53:26
La interfaz solo, sustantivamente, me trabaja sobre los métodos,
00:53:32
mientras la clase abstracta, perdón, la interfaz solo sobre los métodos,
00:53:36
Mientras se explota, me puede también jugar sobre algunas características propias de este objeto que no es técnico.
00:53:39
Vamos a ver si está funcional, que no tengo la fuerza de algo.
00:53:50
Entonces la vemos en luz o en base, porque esta cosa aquí os hace daño, ¿vale?
00:53:56
¡Duda!
00:54:05
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 1
- Fecha:
- 23 de enero de 2026 - 14:04
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 54′ 17″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 455.39 MBytes