Clases Abstractas y polimorfismo - 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 dais el permiso de grabaros, ¿vale?
00:00:00
Y os invito a hablar y preguntar, ¿vale?
00:00:06
Entonces, una vez vista herencia y cómo funcionan los objetos,
00:00:09
hemos empezado en la clase anterior, en el ejercicio anterior,
00:00:15
hemos visto algunos ejemplos de cómo funciona la clase y las herencias
00:00:19
y han salido algunos temas, como por ejemplo las clases abstractas
00:00:24
y aún si no lo sabéis, el polimorfismo, ¿vale?
00:00:29
Entonces, vamos a darle un poquito más de concepto.
00:00:32
La clase abstracta la hemos visto, la hemos hecho un ejemplo ahora y más o menos ha entendido, ¿vale?
00:00:36
Es que hay veces en que una clase está definiendo un concepto, como siempre hacemos,
00:00:42
pero es un concepto muy genérico, un concepto que no se puede instanciar como tal, ¿vale?
00:00:46
Es tan genérico lo que estamos modelizando que no tiene sentido tener un objeto de ese tipo, ¿vale?
00:00:52
Es una cosa más bien abstracta, ¿vale?
00:00:59
Ejemplos de esto pueden ser una figura geométrica, que es el ejemplo que hemos hecho nosotros,
00:01:02
una figura geométrica por sí misma puede hacer muchas cosas.
00:01:06
Yo puedo calcular el área adecuada de las figuras geométricas,
00:01:09
puedo calcular el perímetro de las figuras geométricas,
00:01:12
pero no sé cómo hasta que no especifico qué tipo de figura geométrica es, ¿sí?
00:01:14
Lo mismo puede ser un vehículo.
00:01:21
El vehículo puede tener la capacidad de moverse, la velocidad con que se mueve,
00:01:23
muchas características.
00:01:28
Hay muchas funcionalidades, pero hasta que no especifico qué vehículo concreto es,
00:01:29
tampoco puedo saber mucho, sí, sí, su velocidad, su tipo de movimiento,
00:01:36
qué puede juntar, qué ciudades o qué sí, ¿vale?
00:01:41
Entonces, la idea es, hay una forma de hacer una clase abstracta,
00:01:46
que sustancialmente es una mezcla entre cosas implementadas,
00:01:53
¿vale?
00:01:57
¿Vale?
00:01:57
¿Vale?
00:01:57
¿Vale?
00:01:57
¿Vale?
00:01:58
¿Vale?
00:01:58
¿Vale?
00:01:58
¿Vale?
00:01:58
¿Vale?
00:01:58
¿Vale?
00:01:58
¿Vale?
00:01:58
¿Vale?
00:01:58
¿Vale?
00:01:58
¿Vale?
00:01:58
¿Vale?
00:01:58
¿Vale?
00:01:58
¿Vale?
00:01:59
¿Vale?
00:01:59
¿Vale?
00:01:59
¿Vale?
00:01:59
¿Vale?
00:02:00
¿Vale?
00:02:00
¿Vale?
00:02:00
¿Vale?
00:02:00
Atributos, o sea, datos implementados y métodos implementados,
00:02:02
y algunos métodos que en vez de, tú dices, mira, en este concepto,
00:02:07
tiene sentido que esté este método,
00:02:12
tiene sentido implementar esta funcionalidad,
00:02:14
pero no a este nivel de extracción.
00:02:17
A este nivel de extracción es todavía demasiado abstracto
00:02:20
para saber cómo se hace.
00:02:23
Por lo tanto, lo pongo allí,
00:02:25
Como si fuera un
00:02:28
Un contrato
00:02:30
Que ponga allí, oye mira
00:02:31
Aquí tiene que haber el calcular la área
00:02:34
De las figuras geométricas
00:02:36
Pero no lo voy a implementar yo
00:02:37
Lo voy a dejar allí para que cualquier
00:02:40
Clase
00:02:43
Que en un futuro me extienda a mi
00:02:45
Sea obligada
00:02:46
A implementar este método
00:02:48
Si no esas trata ella también
00:02:50
¿Si?
00:02:52
Cuidado que
00:02:55
Yo podría hacer una clase
00:02:56
Extracta que implementa
00:02:58
Algunos de los métodos
00:03:01
Extractos de las superclases
00:03:03
Y deje abstractos
00:03:04
Otros y cree otros
00:03:07
Más abstractos
00:03:08
No es que necesariamente si es abstracta no implementa nada
00:03:10
Puede haber una implementación
00:03:12
De una parte
00:03:15
Pero no de todos
00:03:16
Siempre que aparezca al menos un método abstracto
00:03:17
Pues la clase tiene que ser abstracta
00:03:21
Si la clase no es abstracta
00:03:23
Tengo que implementar todos los métodos
00:03:24
¿Si?
00:03:27
Entonces ¿Cómo se define
00:03:29
Un método abstracto?
00:03:31
Pues poniendo la palabra reservada abstract
00:03:32
Después de public
00:03:35
¿Vale? Esto me está diciendo
00:03:36
Oye mira, este método tiene que existir
00:03:38
Pero como no tengo
00:03:41
La capacidad actual de
00:03:43
Hacer una implementación concreta
00:03:44
Porque los datos siguen siendo
00:03:47
Demasiados abstractos
00:03:49
Para poder hacer
00:03:51
Para poder hacer una implementación real
00:03:52
¿Si?
00:03:54
Pues te lo pongo aquí
00:03:54
Sin el cuerpo
00:03:56
Esto es como si estoy definiendo
00:03:59
El prototipo del método
00:04:01
¿Vale?
00:04:03
Esto es el prototipo del método
00:04:04
Sin poner el cuerpo del método
00:04:06
Falta la implementación
00:04:08
¿Quién tendrá que hacer la implementación?
00:04:10
Las clases que hereden de mi
00:04:12
Si no son abstractas
00:04:14
Las clases
00:04:17
No abstractas
00:04:19
Que hereden de mi
00:04:21
¿Si? ¿Se entiende?
00:04:22
Y fijaos que si yo
00:04:24
Heredo de una clase abstracta
00:04:27
Estoy obligado
00:04:30
A implementarlo
00:04:31
Si yo no quiero ser abstracto
00:04:32
¿Se entiende o no?
00:04:34
¿Dudas?
00:04:38
Este es un mecanismo para
00:04:39
Modelizar conceptos más complejos
00:04:41
¿Vale? Y es siempre
00:04:43
Acordaos porque la idea viene un poco por allí
00:04:45
Para organizar
00:04:47
Y reutilizar
00:04:50
Lo máximo posible
00:04:51
El código que yo creo
00:04:53
¿Vale? Entonces
00:04:54
Dentro del vehículo
00:04:56
Habrá algunos métodos implementados
00:04:57
Y algunos datos que son propios
00:05:00
De todos los vehículos del mundo
00:05:03
Y eso es interesante
00:05:04
Porque cuando yo heredaré
00:05:06
De estos vehículos
00:05:08
Pues seguramente
00:05:09
Esas cosas implementadas
00:05:11
Ya las estoy heredando y las puedo utilizar
00:05:15
¿Vale?
00:05:17
La clase abstracta deriva del hecho que
00:05:18
Vale, pero cuando intento hacer estas generalizaciones
00:05:20
A veces
00:05:23
No puedo implementar todo
00:05:24
Entonces me dejo como
00:05:26
Trabajo futuro, hago un contrato
00:05:28
Diciendo a que cualquier persona
00:05:30
Que quiera implementar
00:05:32
Una clase que utilice lo que yo ya he creado
00:05:34
Pues necesariamente
00:05:37
Tendrá que implementar
00:05:38
Una cosa concreta
00:05:40
De mis métodos abstractos
00:05:42
Una implementación concreta
00:05:45
De mis métodos abstractos
00:05:46
¿Se entiende?
00:05:48
¿Dudas?
00:05:50
¿Se entiende?
00:05:54
¿Se entiende?
00:05:56
¿Se entiende?
00:05:56
¿Se entiende?
00:05:57
¿Se entiende?
00:05:57
¿Se entiende?
00:05:57
Sustancialmente, formalmente
00:05:57
Permiten declarar en la superclase
00:05:58
Un comportamiento, un método, unas funciones
00:06:01
¿Vale?
00:06:04
Que deberán cumplimentar
00:06:04
Todas las subclases
00:06:06
Pero sin decir nada sobre su implementación
00:06:07
Esto lo tendrás que hacer
00:06:10
Pero no te digo cómo
00:06:12
Todas las figuras geométricas
00:06:13
Tendrán que ser capaces de calcular
00:06:16
Su área
00:06:18
Pero no te digo cómo
00:06:19
El círculo la calculará de una forma
00:06:21
El cuadrado de otra forma
00:06:23
El triángulo de otra forma
00:06:24
Todos serán capaces de calcular su perímetro
00:06:25
Pero no sé cómo se calcula cada uno con su fondo
00:06:28
¿Sí?
00:06:31
¿UML?
00:06:36
¿Habéis visto algo de UML?
00:06:37
Lo veréis, espera
00:06:39
¿Vale?
00:06:41
En UML que son como gráficos y diagramas
00:06:42
Que permiten
00:06:45
Definir un sistema
00:06:46
Y cómo interaccionan las clases
00:06:49
Entre ellas
00:06:51
Pues hay un diagrama
00:06:52
Que es el diagrama de clases
00:06:53
Donde se definen las clases
00:06:54
Que son parecidas a estas
00:06:56
Cajitas así
00:06:57
A veces lo hemos visto
00:06:58
En los ejercicios que he puesto
00:06:59
¿Vale?
00:07:00
El nombre
00:07:01
Aquí los atributos
00:07:02
Y aquí los métodos
00:07:03
¿Vale?
00:07:04
Formalmente si estás utilizando UML
00:07:05
Universal Modeling Language
00:07:07
Pues lo que van en cursiva
00:07:10
Nombres o métodos en cursiva
00:07:13
Son abstractos
00:07:16
¿Sí?
00:07:18
Entonces si yo puedo definirte
00:07:19
Una superclase así
00:07:21
Sé que esto lo tengo que implementar
00:07:22
Mientras este de aquí
00:07:23
Lo tengo que declarar como abstracto
00:07:24
Y se implementará
00:07:26
Cuando una clase herede de esta aquí
00:07:27
La herencia es una flecha
00:07:30
¿Sí?
00:07:31
Lo deberíais ver en algún momento
00:07:34
En entornos de desarrollo
00:07:36
¿Vale?
00:07:38
Particularidades de la clase abstracta
00:07:42
No se pueden instanciar
00:07:44
Si la clase abstracta
00:07:46
No puedo hacer
00:07:48
Figura X es igual a new figura
00:07:49
New figura
00:07:51
No puede existir
00:07:53
No se puede hacer un new
00:07:54
De una clase que sea abstracta
00:07:56
¿Por qué?
00:07:58
Porque le faltan cosas
00:07:59
¿Sí?
00:08:00
Yo puedo crear un objeto concreto
00:08:02
De una subclase que herede de allí
00:08:04
Que implemente todos los métodos
00:08:06
Pero no de esta abstracta
00:08:08
Porque luego si amarra
00:08:09
Uno de los métodos abstractos
00:08:11
No sé qué hacer
00:08:12
Porque no tengo la implementación
00:08:13
De ese método
00:08:16
Por lo tanto no se puede hacer
00:08:17
Ahora veremos qué se puede hacer
00:08:19
¿Vale?
00:08:21
¿Qué es?
00:08:22
¿Qué es?
00:08:22
Se pueden instanciar clases heredadas
00:08:23
Siempre que no sean abstractas a su vez
00:08:25
¿Sí?
00:08:27
Y se pueden instanciar subclases
00:08:28
Utilizando la referencia a clases padre
00:08:30
O sea figura F es igual a new rectángulo
00:08:33
Lo hemos hecho
00:08:36
Esto me vale
00:08:36
¿Sí?
00:08:38
F podrá utilizar los métodos abstractos
00:08:39
Por lo que sabemos ya
00:08:43
Que en realidad no se utilizarán
00:08:45
Los métodos de F
00:08:47
Sino que se utilizarán los métodos de rectángulo
00:08:49
Y como rectángulo
00:08:51
Al extenderme
00:08:53
Ha tenido que implementar
00:08:55
Los métodos abstractos
00:08:57
Pues ese método lo tiene
00:08:58
¿Me explico?
00:09:00
Repito
00:09:03
Si aquí la clase figura
00:09:04
Tiene el método abstracto dibuja
00:09:08
Yo sé que cualquier hijo de figura
00:09:09
Tendrá que implementar dibuja
00:09:12
Porque dibuja es abstracto
00:09:14
Entonces cuando hago rectángulo
00:09:16
Pues él tendrá que implementar eso
00:09:18
Si no da error
00:09:20
Entonces cuando hago una cosa como esta
00:09:20
De figura F es igual a new rectángulo
00:09:23
Yo sé que rectángulo al crearse
00:09:25
Tiene este método de aquí
00:09:29
Y no obstante yo lo use como figura
00:09:32
Entonces F dirá
00:09:34
¿Qué métodos tendrá?
00:09:36
Pues F tendrá el método dibuja
00:09:37
Pero por eso que es el polimorfismo
00:09:38
Que veremos dentro de un rato
00:09:42
Pero por esa funcionalidad
00:09:43
Que hemos visto en Java
00:09:45
Que siempre se utiliza el método
00:09:46
Más específico a la instancia
00:09:48
Java no va a usar
00:09:50
El dibujar
00:09:52
De figura
00:09:53
Que sería abstracto
00:09:53
Y no existiría
00:09:54
Va a utilizar el dibujar de rectángulo
00:09:55
Porque tú dentro de esta referencia figura
00:09:57
Tienes un objeto rectángulo
00:10:00
La instancia de rectángulo
00:10:02
Entonces usas el método más específico
00:10:03
La sobrescriptura más específica
00:10:06
Para ese método
00:10:08
O sea este
00:10:09
Que no es abstracto
00:10:10
Si también rectángulo fuera abstracto
00:10:13
No podrías hacer new rectángulo
00:10:17
¿Sí?
00:10:19
¿Qué es el método polimorfismo?
00:10:23
¿Vale?
00:10:28
El polimorfismo es el concepto
00:10:28
Que dos métodos son polimórficos
00:10:30
Si con el mismo nombre
00:10:32
Hacen funciones distintas
00:10:35
Aunque similares en objetos distintos
00:10:36
Es el concepto de
00:10:39
Yo tengo el método
00:10:40
Calcular área
00:10:41
Y este método hace cosas parecidas
00:10:44
Porque es calcular el área
00:10:47
Pero de forma distinta en objetos distintos
00:10:48
No es lo mismo
00:10:51
Calcular el área del cuadrado
00:10:53
Que calcular el área del triángulo
00:10:54
Que calcular el área de otra cosa
00:10:55
¿Vale?
00:10:57
Entonces cuando yo luego pillo un objeto
00:10:58
Y le digo calcula tu área
00:11:01
El polimorfismo es lo que me permite
00:11:03
Seleccionar el método
00:11:05
Más
00:11:07
Concreto para esa instancia
00:11:08
¿Sí?
00:11:12
Que va de la mano con las clases abstractas
00:11:13
Por esta razón de aquí
00:11:15
Figura
00:11:17
Me está diciendo que existe dibuja
00:11:19
¿Vale?
00:11:21
Luego yo tengo rectángulo
00:11:21
Con dibuja
00:11:23
Y círculo con dibuja
00:11:24
Y dependiendo de si la instancia
00:11:25
Que tengo
00:11:28
Que estoy trabajando
00:11:29
Es una instancia de rectángulo
00:11:30
O una instancia de círculo
00:11:32
Utilizaré este dibujo de aquí
00:11:34
Esta implementación de aquí
00:11:36
O esta implementación de aquí
00:11:37
Y eso lo hace de forma automática Java
00:11:39
Java va a pillar la referencia
00:11:41
¿Vale?
00:11:45
En este caso ignora el tipo de la referencia
00:11:46
Lo único que mira para el tipo de referencia
00:11:49
Es a ver qué método puede utilizarla
00:11:51
Utilizar
00:11:53
Es lo que hemos hecho antes con
00:11:54
Con triángulo ¿No?
00:11:56
Hemos visto que si yo pillaba la figura geométrica
00:11:58
Pues no me daba el método
00:12:00
Que solo existía en
00:12:02
En triángulo
00:12:04
¿Os acordáis?
00:12:05
Sin embargo
00:12:08
F sí que tiene dibuja
00:12:09
De forma abstracta
00:12:11
Pero por polimorfismo
00:12:12
Cuando se va a ejecutar
00:12:14
Este F.dibuja
00:12:16
Él elegirá
00:12:20
Cual es la forma de dibujar
00:12:22
El método digamos
00:12:23
Más apropiados
00:12:25
En base al tipo de la instancia
00:12:26
No al tipo de la referencia
00:12:30
¿Entendéis?
00:12:31
Vale
00:12:37
Un ejemplo de polimorfismo
00:12:37
Es el método calcular
00:12:38
De rectángulo de círculo
00:12:40
¿Vale?
00:12:41
Si hablamos de clases
00:12:42
Es lo que nos permite crear una clase
00:12:47
Con la referencia padre
00:12:49
¿Vale?
00:12:50
Pero que apunta a una clase hija
00:12:51
Esta cosa aquí
00:12:53
En un cierto sentido
00:12:54
Polimorfismo es muchas formas
00:12:55
Muchos aspectos
00:12:57
En un cierto sentido
00:12:59
Y lo que me permite hacer es
00:13:00
Intercambiar
00:13:03
O sea poner
00:13:04
Allá donde debería ir una figura
00:13:05
Otra cosa
00:13:07
Que pero es una figura
00:13:08
¿Vale?
00:13:10
Lo que me permite decir
00:13:11
Pongo una subclase
00:13:13
Dentro de una referencia superclase
00:13:15
Lo puedo hacer
00:13:18
Porque hay polimorfismo
00:13:19
Porque esta figura
00:13:20
En realidad es una versión más genérica
00:13:23
Más abstracta del rectángulo
00:13:28
Entonces un rectángulo es una figura
00:13:30
Y todo lo que puede hacer sobre una figura
00:13:33
Lo puede hacer sobre un rectángulo
00:13:35
El rectángulo puede hacer más cosas
00:13:36
¿Vale?
00:13:39
Pero estoy seguro que todo lo que hace figura
00:13:41
Lo hace un rectángulo
00:13:44
Porque el rectángulo es una figura
00:13:45
¿Si?
00:13:46
No va al revés
00:13:49
No puede hacer rectángulo R
00:13:50
Es igual a R
00:13:52
A ningún figura
00:13:53
Porque estaría diciendo que
00:13:53
Puede hacer métodos de rectángulo
00:13:56
Que pero en figura no existe
00:13:58
¿Me explico?
00:14:00
Hasta si figura no fuera abstracta
00:14:02
Cuando se usa un método sobre un objeto
00:14:04
Se usará el de la clase
00:14:08
La que objeto de instancia
00:14:10
¿Vale?
00:14:12
O sea lo que decíamos antes
00:14:13
No cuenta la referencia
00:14:14
Más cuenta la instancia que estoy trabajando
00:14:17
¿Si?
00:14:19
Y usaré el método más específico
00:14:20
Esa instancia
00:14:23
Si se ha sobrescrito en rectángulo
00:14:23
El método que estoy utilizando
00:14:26
Uso S
00:14:27
Si no se ha sobrescrito
00:14:27
Será el de figura
00:14:29
El que está definido en figura
00:14:30
Recordaros que la clase abstracta
00:14:31
Algunos métodos puede implementarlo
00:14:33
Seguramente
00:14:35
Si el método en figura es abstracto
00:14:37
En rectángulo he tenido que sobrescribirlo
00:14:40
Si no me daría error
00:14:44
Entonces usaré siempre el de rectángulo
00:14:45
Si pero el método en figura no es abstracto
00:14:48
Pues si no lo he sobrescrito
00:14:51
En rectángulo usaré el de figura
00:14:53
Si si lo he sobrescrito en rectángulo
00:14:55
Pues entonces usaré el de rectángulo
00:14:58
¿Dudas?
00:15:00
Vale
00:15:05
Podemos usar la superclase como parámetro formal
00:15:06
Y luego usar el método apropiado
00:15:10
Basándonos sobre el objeto pasado
00:15:12
Como parámetro actual
00:15:13
¿Vale?
00:15:14
Es decir
00:15:15
Puedo utilizar figura como parámetro formal
00:15:16
Una relación
00:15:19
Lo que viene a decir
00:15:20
Lo que acabamos de decir
00:15:22
Otra vez
00:15:23
¿Vale?
00:15:23
Sin embargo luego como parámetro actual
00:15:24
Cuando luego se va a utilizar eso
00:15:26
Pues lo que estáis mirando
00:15:28
Es el objeto propio
00:15:29
¿Sí?
00:15:31
Cuando tenemos que crear un objeto
00:15:33
En una clase de edad
00:15:35
Podemos utilizar como clase referenciada
00:15:36
La del padre o la del hijo
00:15:38
¿Vale?
00:15:39
Estas tres opciones de aquí
00:15:40
Que son las tres opciones
00:15:42
Que hemos probado antes
00:15:43
Con triángulo
00:15:44
Y
00:15:45
Y figura geométrica
00:15:46
¿Vale?
00:15:48
En el vídeo anterior
00:15:49
O en
00:15:50
Esta mañana
00:15:50
Antes en la clase secundaria
00:15:51
Anteriores
00:15:53
Pues hemos hecho estas cosas aquí
00:15:53
Utilizando como padre
00:15:55
Figura geométrica
00:15:57
Y como hijo
00:15:58
Triángulo
00:15:59
Entonces
00:16:00
Puedo poner
00:16:00
Una instancia subclase
00:16:01
Dentro de una referencia
00:16:04
Superclase
00:16:05
Se puede hacer
00:16:07
Puedo poner
00:16:08
Una instancia superclase
00:16:09
Dentro de una referencia superclase
00:16:11
Siempre y cuando
00:16:13
La superclase
00:16:15
No sea abstracta
00:16:16
Si padre fuera abstract
00:16:18
Pues no puede hacer ni un padre
00:16:20
Pero por ejemplo nosotros
00:16:23
Cuando hemos empezado al principio
00:16:25
Y no hemos puesto que
00:16:27
Figura geométrica fuera abstracta
00:16:28
Si que lo hemos hecho
00:16:30
Os acordáis que luego
00:16:31
Lo he tenido que borrar del main
00:16:32
Y finalmente puedo poner
00:16:34
Una instancia hijo
00:16:37
Dentro de una referencia hijo
00:16:39
Todas estas tres cosas
00:16:40
Lo puedo hacer
00:16:41
Lo que no puedo hacer
00:16:42
Es la cuarta opción
00:16:43
O sea crear
00:16:45
Un padre
00:16:46
Y ponerlo en una instancia hijo
00:16:47
¿Vale?
00:16:49
Porque un padre no es un hijo
00:16:51
Un hijo es un padre
00:16:52
¿Sí?
00:16:53
¿Dudas?
00:16:55
Vale
00:16:59
Tres formas posibles de instanciarla
00:17:00
Que son las que hemos visto ahora
00:17:02
¿Vale?
00:17:04
Entonces
00:17:05
Esta de aquí es la más obvia
00:17:05
Tengo un hijo
00:17:08
La pongo en un variable hijo
00:17:09
¿Vale?
00:17:10
Puedo acceder a todos los métodos del hijo
00:17:10
A todos los métodos del padre
00:17:13
Y si hay métodos sobre escritos
00:17:16
Solo se accede a los del hijo
00:17:19
No del padre
00:17:21
Hasta si hago upcasting
00:17:23
O sea si casteo a la del padre
00:17:25
Lo vimos aquí en un ejemplo anterior
00:17:27
Pues sigo utilizando la del hijo
00:17:29
¿Sí?
00:17:31
Si hago esta de aquí
00:17:34
Puedo acceder a todos los métodos
00:17:36
Y atributos del padre
00:17:39
¿Vale?
00:17:40
Pero es imposible acceder a los del hijo
00:17:42
Porque esto no los tiene la parte del hijo
00:17:45
No tiene ni los métodos
00:17:47
Ni los atributos del hijo
00:17:48
¿Sí?
00:17:49
¿Vale?
00:17:50
Cuando tengo una cosa de este estilo en vez
00:17:50
¿Vale?
00:17:54
Hasta aquí es más claro
00:17:55
Porque creo un hijo y lo meto en un hijo
00:17:57
Creo un padre y lo meto en un padre
00:17:59
Cuando hago esto de crear un hijo
00:18:00
Y ponerlo en una instancia
00:18:03
De tipo del padre
00:18:05
De tipo de una superclase
00:18:06
Pues puedo acceder
00:18:08
A los métodos y atributos del padre
00:18:10
No del hijo
00:18:13
Es lo que veíamos antes
00:18:14
Cuando hicimos una instancia FG
00:18:16
Y hacemos FG
00:18:19
Y no aparecía el método del hijo
00:18:20
¿Sí?
00:18:23
Pero si hay un modo
00:18:25
Para acceder a las cosas del hijo
00:18:27
Que es hacer un downcasting
00:18:29
¿Vale?
00:18:31
Para poder acceder al del hijo
00:18:32
Tendré que decirle específicamente
00:18:35
Oye, trátame esta variable
00:18:37
Como si fuera de tipo hijo
00:18:39
Y ahora sí que me aparecerán
00:18:41
Los métodos
00:18:43
Y las funciones
00:18:44
Y los atributos del hijo
00:18:46
¿Sí?
00:18:49
Lo que viene a ser
00:18:50
El downcasting
00:18:52
¿Sí?
00:18:53
¿Cómo se hace el downcasting?
00:18:55
Así
00:18:56
Si var h es
00:18:56
De tipo padre
00:19:00
En el momento en que le digo
00:19:03
Hijo
00:19:06
Pues lo que estoy diciendo es
00:19:07
Trátame esto como hijo
00:19:08
Entonces si luego accedo
00:19:10
A ver que hay allí
00:19:12
Pues me saldrán las variables del hijo
00:19:15
Me saldrán los métodos del hijo
00:19:18
¿Dudas?
00:19:20
Cuidado que si intento hacer esto
00:19:24
Y no puedo hacerlo
00:19:26
Porque no se puede hacer la conversión
00:19:28
Porque el objeto real dentro de esta variable
00:19:30
No es lo que estoy casteando
00:19:32
Pues me salta una excepción
00:19:35
Un error que es la class cast exception
00:19:37
Class cast exception
00:19:38
¿Dudas?
00:19:40
Si una clase
00:19:48
Que solo tiene métodos abstractos es una cosa un poquito distinta y es una interfaz. Tiene que ser un contrato puro en el que yo digo, mira, yo no te implemento nada, pero si alguien quiere implementar mi interfaz, esto es lo que tiene que hacer.
00:19:49
Y todas las clases del mundo que implementen mi interfaz seguramente podrán hacer estas cosas, podrán tener estos métodos. Esto se usa mucho en términos de cuando hay un sistema muy grande y tengo que dividir el trabajo en varios grupos de trabajo, ¿vale?
00:20:12
Como no puedo yo hacer que un grupo dependa de lo que está desarrollando el otro, le digo, mira, el otro implementa...
00:20:35
El otro implementará esta interfaz. Es decir, que los objetos que están creando el otro grupo podrán hacer esto, esto, esto, esto con estos parámetros.
00:20:42
Ahora tú, en tu parte, en tu módulo, puedes hacer todas las llamadas a objetos de ese tipo con estos métodos porque ellos luego lo implementarán.
00:20:51
Ahora no están implementados, pero ellos sí que lo implementarán. Y te permite organizarse entre el grupo de trabajo.
00:21:02
Pero las interfaces...
00:21:10
Las interfaces las vamos a ver con más detalle la próxima vez, ¿vale?
00:21:11
Y ya está.
00:21:18
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial - Sin obra derivada
- Visualizaciones:
- 10
- Fecha:
- 7 de febrero de 2024 - 12:21
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 21′ 22″
- Relación de aspecto:
- 4:3 Hasta 2009 fue el estándar utilizado en la televisión PAL; muchas pantallas de ordenador y televisores usan este estándar, erróneamente llamado cuadrado, cuando en la realidad es rectangular o wide.
- Resolución:
- 960x720 píxeles
- Tamaño:
- 59.33 MBytes