Herencia 4 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Vale, entonces, ya estamos grabando, etc, etc, si me dais la autorización, si habláis
00:00:00
Hasta aquí hemos visto el estructura de constructores, la herencia, etc, etc, como se llaman, vale
00:00:06
Cuando hablamos de herencia, tenemos en mente también, o sea, se crean también algunos efectos, algunos conceptos, vale
00:00:16
Que tenemos que tener en cuenta para poder usar de forma eficiente la herencia
00:00:24
Uno de estos son el concepto de shadowing y overriding, vale, que son más o menos lo mismo
00:00:30
Pero uno pensado sobre las variables y otro pensado sobre los métodos, si
00:00:37
La idea es de poder modificar los elementos de la clase base, o sea, lo que tengo en la clase base
00:00:45
Sobrescribiendo, reescribiendo una frase
00:00:52
Una parte del código en una clase hija, vale
00:00:54
Si esto lo hago haciendo un atributo de la clase hija, de la clase, de la subclase
00:00:57
Que tiene el mismo nombre de un atributo de una superclase, esto se llama shadowing, vale
00:01:05
Estoy ocultando en un cierto sentido, haciendo sombra al atributo de la superclase
00:01:12
Renombrándolo, creando un nombre
00:01:22
Con el mismo nombre en la subclase, vale, y ahora hacemos un ejemplo
00:01:24
Si en vez de esto lo hago con el método, o sea, en una subclase creo un método que tiene la misma
00:01:30
La misma signatura, la misma firma, que un método de la superclase
00:01:36
Lo que estoy haciendo es overriding, que es lo que acabamos de hacer en el ejemplo este de aquí
00:01:42
Que si, lo veis, vale, aquí, donde ya he creado animal, que tiene el método presentarse
00:01:47
Y luego en felino, que es una subclase de animal, he creado otra vez el mismo método con la misma firma
00:01:54
Lo que estoy haciendo es sobreescribir el otro método, vale
00:02:03
Y entonces los felinos usarán esto en vez de utilizar el de animal
00:02:08
Como el de toString, cuando nosotros teníamos el toString de object
00:02:13
Y lo que hacíamos es poner un toString nuestro con ese formato y con esa firma
00:02:19
Y allí le hacemos hacer lo que nos da la gana, lo que estamos haciendo es sobreescribir el toString
00:02:24
De esa forma, cuando otros métodos llaman el toString pensando que sea un object
00:02:29
Si yo soy una clase que hereda de object, porque toda clase hereda de object al fin y al cabo
00:02:35
Y he sobreescrito el toString, voy a utilizar el toString de mi clase en vez que el de object
00:02:41
Y entonces me escribe las cosas bonitas, exactamente, vale
00:02:47
Y aquí, entonces, shadowing, ejemplo de shadowing, vale
00:02:54
Tengo una clase persona que tiene como nombre un string, vale
00:03:01
Y luego me creo una clase alumno que extiende persona
00:03:10
Y dentro de aquí, sobreescribo, oculto, nombre con un atributo distinto
00:03:15
O sea, que si yo lo considero como persona, el nombre es un string
00:03:24
Pero si lo considero como alumno, el nombre ya no es un string, es un int
00:03:29
¿Vale? Porque los alumnos no tienen nombre, tienen un número de identificación
00:03:34
Puede ser también un mismo
00:03:38
Lo que cambia es el nombre del atributo
00:03:42
El nombre del atributo hace como sombra al otro, porque cuando yo ahora estoy en alumno y pido nombre
00:03:47
Voy a buscar este nombre, no el otro
00:03:52
Entonces, si ahora en un test lo que creo es un alumno y una persona, vale
00:03:54
Y luego llamo para alumno y para nombre, fijaos que en este caso sí tiene que ver, vale
00:04:03
Tiene que ver el tipo de la referencia, no el tipo de la instancia
00:04:11
Este es un alumno, pero he guardado en una clase persona
00:04:19
Este señor de aquí
00:04:23
Me devuelve Juan
00:04:24
Este señor de aquí
00:04:26
Me devuelve un numerito
00:04:28
¿Sí?
00:04:30
O sea, que es parecido al otro
00:04:33
Pero en este caso
00:04:34
No cuenta la instancia por sí mismo
00:04:36
Sino la referencia a la que estoy utilizando
00:04:39
¿Sí?
00:04:41
Justo para complicar
00:04:42
En mi experiencia, el shadowing se ve bastante menos
00:04:43
¿Vale?
00:04:47
Con respecto al overreading
00:04:48
El overreading sí que se ve un montón
00:04:49
Pero el shadowing
00:04:51
Existerá
00:04:52
¿Vale?
00:04:54
Pero normalmente
00:04:55
Tiene un sentido un poco raro
00:04:56
¿Sí?
00:04:58
¿Sí?
00:04:58
Sí
00:05:06
De hecho
00:05:06
Vale, si definimos
00:05:07
Aquí tenéis ejemplo de cómo se llama la cosa
00:05:10
Si definimos una subclase con un atributo que es el mismo nombre
00:05:13
Y tipo que la superclase
00:05:17
¿Vale?
00:05:19
La de la superclase que es de oculta
00:05:20
¿Sí?
00:05:22
También se puede cambiar el tipo
00:05:23
Podemos acceder a la variable de la subclase
00:05:24
O de la superclase usando disesuper
00:05:28
¿Vale?
00:05:30
Esto quiere decir que
00:05:31
Si yo tengo una situación como esta aquí
00:05:32
¿Vale?
00:05:35
Que tengo transporte
00:05:35
Que puede ser tren o un vehículo
00:05:36
Y dentro del vehículo puede ser moto y coche
00:05:38
¿Vale?
00:05:40
Entonces tengo estos tres
00:05:41
Si yo uso nombre
00:05:42
Este es el nombre del coche
00:05:45
Ah, perdón
00:05:46
Esto son
00:05:47
Es el mismo
00:05:47
Redeclaro nombre
00:05:49
En cada uno de estos tres
00:05:51
Niveles
00:05:53
¿Vale?
00:05:55
Entonces si yo uso nombre
00:05:56
Estoy accediendo al nombre del coche
00:05:58
Si yo uso dis.nombre
00:06:01
Estoy utilizando siempre el coche
00:06:03
¿Vale?
00:06:05
Estoy en la clase coche
00:06:06
Si uso super.nombre
00:06:07
Me estoy yendo al vehículo
00:06:09
Entonces es como si estuviera utilizando este
00:06:11
Atributo en vez que este de aquí
00:06:15
¿Sí?
00:06:18
Y si hago algo como esto
00:06:20
Vehículo
00:06:22
De dis.nombre
00:06:23
Accedería al vehículo del nombre
00:06:24
Que es lo que he intentado hacer con el
00:06:26
Overriding
00:06:28
¿Vale?
00:06:30
Con el ejercicio de antes
00:06:30
Que pero como usa la instancia
00:06:32
En vez de utilizar el tipo de vínculo
00:06:34
Pues no funciona
00:06:36
¿Sí?
00:06:37
Si quisiera
00:06:39
Subir hasta este nivel de aquí
00:06:40
O sea hacer
00:06:43
Pillar esta
00:06:44
Variable de aquí
00:06:46
Este atributo de aquí
00:06:48
Debería hacerlo de esta forma
00:06:49
Cuidado que es super.super
00:06:51
No se puede hacer
00:06:52
No existe super.super
00:06:53
Pero existe el
00:06:55
Píllame el dis
00:06:56
Tráctamelo como un transporte
00:06:57
Acceder al número
00:06:59
Vehículo de super
00:07:00
No
00:07:08
No creo
00:07:09
No creo que
00:07:10
Que tendría mucho sentido
00:07:11
A lo mejor hasta se funciona
00:07:13
Pero
00:07:14
En el momento que haces un cast explícito
00:07:14
Te compensa decir cast explícito
00:07:17
De este objeto
00:07:19
De esta instancia que tienes
00:07:20
¿Vale?
00:07:21
No sé si
00:07:23
Si vehículo de super te funcionaría
00:07:25
Puede ser
00:07:27
No lo sé
00:07:28
No le probo
00:07:30
¿Vale?
00:07:31
La otra cosa es la reescritura de método
00:07:32
¿Vale?
00:07:35
Que me sirve normalmente
00:07:36
Como lo que hemos visto nosotros
00:07:38
Tú cuando
00:07:39
Cuando tienes una clase ya hecha
00:07:42
Y la extendes
00:07:44
Estás importando sus métodos
00:07:45
Pero es posible
00:07:47
Que la clase que estás extendiendo tú
00:07:48
Estos métodos se queden cortos
00:07:50
Tanto por eso
00:07:52
Que a lo mejor quieres añadir
00:07:53
Algo de funcionalidad
00:07:54
O porque quieres especificar más
00:07:56
La funcionalidad de este método
00:07:58
Me explico
00:08:00
En el ejemplo que hemos hecho nosotros
00:08:01
Los animales decían solo su nombre
00:08:02
Porque tenían acceso solo a su nombre
00:08:04
En el momento que tú estás en el gato
00:08:06
El gato tiene acceso a más información
00:08:08
Entonces
00:08:10
Quieres poder hacer más cosas
00:08:11
A lo mejor con la información que tiene
00:08:13
Puede hacer búsqueda de una base de datos
00:08:15
Que se yo
00:08:17
Puede hacer cosas más adelantadas
00:08:18
O simplemente utilizar también
00:08:20
Sus propias propiedades
00:08:22
Sus propios atributos
00:08:23
Para decir
00:08:24
Oye mira y son esta cosa también
00:08:25
En nuestro método
00:08:27
Que era una presentación
00:08:28
Era una descripción
00:08:29
Pues un gato claramente
00:08:30
Tiene más información para dar
00:08:32
Que un animal
00:08:34
Y por lo tanto
00:08:34
Se puede sobre escribir en esta forma
00:08:35
¿Vale?
00:08:38
Fijaos que
00:08:40
Con arrancar
00:08:41
Usa el método de coche
00:08:43
Con dispunta arrancar
00:08:44
El método de coche
00:08:45
Con superpunta arrancar
00:08:46
El método del vehículo
00:08:47
Pero por arriba del vehículo
00:08:49
Pues
00:08:51
Parece ser
00:08:52
Que es más complejo llegar
00:08:53
¿Vale?
00:08:54
Ahora luego
00:08:55
Miraremos como se puede hacer
00:08:56
Si se puede hacer
00:08:58
¿Vale?
00:08:59
Entonces
00:09:01
Ejemplo de
00:09:01
Overriding
00:09:02
¿Vale?
00:09:04
Y aquí imaginaos que tengo esta
00:09:05
Recursos
00:09:07
Aula y ordenador
00:09:09
Pero que
00:09:10
Decir descripción de aula
00:09:11
Es distinto de los demás
00:09:14
Pues entonces en recurso
00:09:15
Pongo decir descripción
00:09:18
El azul
00:09:19
¿Vale?
00:09:20
Y el ordenador
00:09:21
Heredará directamente este de aquí
00:09:22
Tendrá
00:09:25
Hará lo mismo que el recurso
00:09:25
Pero en el aula
00:09:27
Hago un
00:09:29
¿Cómo se dice?
00:09:30
Una sobrescripción
00:09:32
¿Vale?
00:09:34
Sobrescribo
00:09:35
Entonces
00:09:35
Ahora tengo mi propio método
00:09:36
¿Vale?
00:09:39
Si dentro de aula
00:09:39
Un objeto aula
00:09:41
Uso this.decir descripción
00:09:42
Estaré usando este método de aquí
00:09:44
Si uso super.decir descripción
00:09:46
Estaré usando este método de aquí
00:09:49
¿Sí?
00:09:52
Normalmente dentro
00:09:54
La aula está en un recurso
00:09:56
Puede usar el suyo
00:09:57
O
00:09:59
El método
00:10:00
Que estaba sobrescribiendo
00:10:02
Cuando tú heredas desde otra
00:10:04
Ella tendrá sus métodos
00:10:07
Y tú puedes decidir de sobrescribir sus métodos
00:10:09
¿Vale?
00:10:12
De hecho
00:10:14
Probablemente tendría poco sentido
00:10:15
Irse por arriba todavía más
00:10:17
¿Vale?
00:10:19
Porque si tú eres un aula
00:10:19
Y
00:10:20
Ehm
00:10:21
, sobrescribes un método de recurso
00:10:22
Es porque tú quieres hacer algo más específico de recurso
00:10:25
Y puedes elegir si usar el tuyo más específico
00:10:28
O el de tu padre
00:10:30
Pero el de tu abuelo tendría poco sentido
00:10:31
Será el tu padre que
00:10:34
Si quieres usar
00:10:35
Usará el del abuelo
00:10:36
Con super.er
00:10:37
Entonces al mandar un mensaje a un objeto
00:10:38
El método seleccionado
00:10:46
Depende de la clase real
00:10:47
De la que el objeto es instancia
00:10:49
¿Vale?
00:10:51
Lo que decíamos antes
00:10:52
¿Vale?
00:10:53
Que no es lo que pasa en el shadowing
00:10:54
En el shadowing
00:10:56
Hemos visto que depende
00:10:58
Del tipo de
00:10:59
Ehm
00:11:01
Del tipo de variable que tú tienes
00:11:03
De la referencia
00:11:06
Digamos en un cierto sentido
00:11:08
Sin embargo
00:11:09
Aquí en el overreading
00:11:10
Se va a mirar
00:11:12
El tipo de la instancia real
00:11:13
¿Vale?
00:11:16
La clase de referencia
00:11:18
La que está asignado
00:11:19
¿Vale?
00:11:20
Como es el caso de los intubos
00:11:21
¿Sí?
00:11:22
Entonces en los atributos
00:11:23
En los shadowing
00:11:24
Se hace referencia
00:11:25
Al tipo de la variable
00:11:27
Mientras aquí se hace referencia
00:11:31
Al objeto de la instancia real
00:11:33
¿Sí?
00:11:35
Super
00:11:39
¿Vale?
00:11:40
Este de aquí ya lo hemos visto más o menos
00:11:41
Es una referencia al objeto actual
00:11:42
Como si fuera una instancia de una superclase
00:11:45
¿Vale?
00:11:47
Es como un dis
00:11:48
Pero pensado como
00:11:48
Soy de la clase real
00:11:50
Sé que extendo
00:11:52
¿Sí?
00:11:52
Y
00:11:55
Y podemos utilizar por ejemplo
00:11:55
Super punto imprime
00:11:57
Para utilizar el imprime
00:11:59
Como si fuera
00:12:00
De la
00:12:01
De la
00:12:02
De la clase persona
00:12:03
Por ejemplo
00:12:04
¿Sí?
00:12:05
Tenemos dos ideas
00:12:09
Dos funciones del super
00:12:11
¿Vale?
00:12:13
El super como método así
00:12:14
Que en realidad está llamando
00:12:15
El constructor
00:12:17
De la
00:12:18
De la superclase
00:12:19
O superase
00:12:20
Y casi en paréntesis
00:12:22
Que es una referencia
00:12:23
Es como el dis
00:12:24
Pero para la superclase
00:12:25
Considerando el dis
00:12:27
Como una instancia de la superclase
00:12:28
¿Sí?
00:12:30
Entonces podemos hacer
00:12:31
Super punto método
00:12:32
Super punto atributo
00:12:33
Esto para acceder a un método
00:12:34
De la superclase
00:12:36
O esto para acceder
00:12:38
A un atributo
00:12:39
De la superclase
00:12:40
¿Sí?
00:12:42
Y finalmente
00:12:48
¿Vale?
00:12:50
No es
00:12:52
Últimas dos referencias
00:12:52
Overriding versus overloading
00:12:55
¿Vale?
00:12:57
Nosotros tenemos dos conceptos
00:12:57
Ahora con over
00:12:59
Uno es
00:13:00
Sobrescribir
00:13:01
Y uno es sobrecargar
00:13:02
¿Vale?
00:13:04
Hemos visto los dos
00:13:04
Cuando hago sobrescribir
00:13:05
Lo que estoy haciendo es
00:13:07
Modificar la implementación
00:13:09
De un
00:13:11
De un
00:13:11
Método que ya existe
00:13:13
¿Vale?
00:13:15
El método de la superclase
00:13:16
Mientras que cuando hago overloading
00:13:18
Lo que estoy haciendo es
00:13:20
Que el método de la superclase
00:13:21
Tiene el mismo método
00:13:22
Con el mismo nombre
00:13:22
Tiene distinta firma
00:13:24
Tiene distintas
00:13:26
¿Cómo se dice?
00:13:27
Distinto parámetro
00:13:31
Gracias
00:13:33
Y de esta forma estoy sobrecargando
00:13:33
La funcionalidad de este método
00:13:36
Este método puede hacer cosas un poquito distintas
00:13:38
Dependiendo de que
00:13:40
Parámetros les pongo
00:13:41
¿Sí?
00:13:43
Vale
00:13:46
Y finalmente
00:13:47
Instance of
00:13:49
¿Vale?
00:13:52
Instance of es un comandito
00:13:52
Es un operador
00:13:54
¿Vale?
00:13:55
Que me permite preguntarme
00:13:55
Si una cierta
00:13:57
Variable
00:13:59
Si una cierta referencia
00:14:01
Si un cierto objeto
00:14:03
Es una instancia
00:14:04
De una clase
00:14:05
¿Vale?
00:14:06
Por ejemplo
00:14:08
Si yo aquí tengo
00:14:08
Gato, gato
00:14:10
Que es un gato
00:14:12
¿Vale?
00:14:13
Y tengo que gato
00:14:14
Extende animal
00:14:15
Y perro
00:14:15
Extende animal
00:14:16
Me puedo preguntar
00:14:17
Gato
00:14:18
Instance of
00:14:19
Animal
00:14:20
Y esto me da true
00:14:21
Si gato es una instancia del animal
00:14:23
False
00:14:26
Si gato
00:14:27
Esta variable aquí
00:14:28
No es una instancia del animal
00:14:29
Y el resultado es true
00:14:30
¿Sí?
00:14:32
Porque gato es un animal
00:14:34
Porque a veces tú te
00:14:35
Te quieres preguntar
00:14:41
Tienes una variable
00:14:42
Pero no sabes esta variable
00:14:43
De que instancia es
00:14:45
Y te quieres preguntar
00:14:46
¿Es de esta instancia o de esta?
00:14:48
¿Vale?
00:14:50
Entonces dependiendo
00:14:51
Esto daría true
00:14:53
Esto daría true
00:14:54
Esto daría false
00:14:55
Creo
00:14:56
Ahora lo miramos
00:14:56
Ahora hacemos la prueba
00:14:59
¿Vale?
00:15:00
¿Por qué esto?
00:15:02
Por lo que viene después
00:15:03
Que es el polimorfismo
00:15:05
¿Vale?
00:15:07
Dudas hasta aquí
00:15:10
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial - Compartir igual
- Visualizaciones:
- 4
- Fecha:
- 7 de febrero de 2024 - 11:12
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 15′ 16″
- 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:
- 79.43 MBytes