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, como es muy útil y la miráis constantemente, pues si habláis me autorizáis a grabar vuestra voz, así luego la escucháis otra vez cuando los ponéis en casa y miráis muchas veces estos vídeos, que hemos comprobado ahora, miráis mogollón estos vídeos.
00:00:00
Muy bien. Enhorabuena.
00:00:22
Pasas, tratas.
00:00:26
Hay veces, en esta cosa de la herencia, en que creamos una jerarquía de objetos que, pero, me viene mal crear.
00:00:27
¿Qué quiere decir esto?
00:00:45
Imaginaos lo que hemos hecho el viernes.
00:00:46
Viernes hemos hecho un ejercicio sobre figuras geométricas.
00:00:50
Vale, fenomenal.
00:00:54
Cuando yo hablo de un cuadrado, yo sé que es un cuadrado, sé cómo se trata un cuadrado.
00:00:55
Sé calcular su área, sé calcular su perímetro, etc.
00:00:59
Cuando hablo de un triángulo, sé todo.
00:01:02
Cuando hablo de un trapecio, sé todo, sé mis fórmulas.
00:01:06
Si no las sé, las busco.
00:01:10
Pero si yo hablo de una figura geométrica, no sé nada.
00:01:12
Una figura geométrica en general, hasta si te digo que tiene cuatro lados,
00:01:17
tú no puedes calcular ni su perímetro ni su área hasta que yo te haya definido qué figura
00:01:21
geométrica es se entiende yo te digo un cuadro tiene cuatro lados que es un cuadrado la calcula
00:01:30
es una forma si es un rectángulo de forma si es un trapecio puede ser natural de transformó
00:01:40
Entonces, podrías tú encontrar la forma más general, o sea, al final un cuadrado es un rectángulo.
00:01:45
Es un rectángulo especial con todos los lados iguales.
00:01:55
Si tú aplicas las fórmulas de rectángulos al cuadrado funciona.
00:02:00
La fórmula de cuadrado de rectángulo no, porque el cuadrado es un rectángulo, el rectángulo no es un cuadrado.
00:02:04
Entonces, en nuestra jerarquía yo podría hacer que cuadrado herede de rectángulo.
00:02:10
Sí, pero bueno, independientemente de todas estas cosas.
00:02:15
Puede ser, cuando yo estoy tratando de figura geométrica, no puedo hacer nada.
00:02:22
Hasta que tú no hayas dicho, oye, mira, esta figura geométrica es un cuadrado o es un triángulo,
00:02:28
se queda allí, se queda como, vale, muy bien.
00:02:34
Ahora, por como lo hemos hecho hasta ahora, yo puedo crear un objeto figura geométrica.
00:02:37
Yo puedo hacer un new figura geométrica.
00:02:43
Pero luego, ¿para qué me sirve?
00:02:45
Porque si yo tengo figuras geométricas, tengo una figura geométrica,
00:02:49
¿puedo calcular su área?
00:02:53
No, porque una figura geométrica no tiene área, ¿correcto?
00:02:57
Incorrecto, todas las figuras geométricas tienen área.
00:03:04
El problema es que se calcula de forma distinta, ¿me entendéis en esto?
00:03:09
O sea, yo sé que, en general, todas las figuras geométricas tendrán un número de lados, tendrán un área y tendrán un perímetro.
00:03:14
Lo sé.
00:03:28
Pero luego, dependiendo del tipo de figura, se calcula de una forma o de otra.
00:03:30
Queda claro esto.
00:03:35
Entonces, a mí lo que me gustaría es decir, vale, muy bien,
00:03:36
hagamos algo en común
00:03:40
generalizamos las figuras geométricas
00:03:44
pillo el cuadrado, pillo el rectángulo
00:03:47
pillo el
00:03:49
pentágono
00:03:50
y digo, vale, todos estos de aquí tienen
00:03:52
algo en común
00:03:55
por ejemplo, perímetro y área
00:03:55
o sea, se puede calcular su perímetro
00:03:59
se puede calcular su área
00:04:01
pero
00:04:02
es específico de cada figura
00:04:04
como se hace
00:04:07
vale, fenomenal
00:04:08
No puedo yo crear una jerarquía de herencia en el que por arriba pongo esta figura geométrica y ya allí digo, oye, mira, cualquier figura geométrica que herede de mí va a tener la posibilidad de calcular el área y calcular el perímetro, pero sin definir cómo se hace.
00:04:09
yo quiero crear una figura geométrica
00:04:33
que no sea un objeto
00:04:39
que luego tú puedas crear una forma geométrica
00:04:41
porque una forma geométrica no me interesa
00:04:43
a mí me interesa el cuadrado, el triángulo y cosas por el estilo
00:04:44
pero en vez de repetir
00:04:46
en cada una de las formas
00:04:48
reales, de las formas concretas
00:04:50
parte de código
00:04:52
o cosas que deberían estar
00:04:54
en todas las formas geométricas
00:04:56
yo quiero definir
00:04:58
un esquema general
00:05:00
no implementable
00:05:02
que tendré como punto más alto de mi jerarquía, digamos así.
00:05:04
Y luego, a partir de este esquema general, formaré los esquemas concretos.
00:05:14
Cuadrado, triángulo, etc.
00:05:20
Constantemente quiero crear una clase que no sea concreta,
00:05:22
que no sea instanciable,
00:05:26
a que sea una clase abstracta.
00:05:29
¿Vale?
00:05:33
Una clase abstracta es una clase que puede definir lo que se llaman métodos abstractos.
00:05:35
Un método abstracto es un método que tú me dices, este método existe, pero no te lo implemento.
00:05:43
No hay una implementación.
00:05:51
No hay el código que define cómo se hace.
00:05:53
Yo te estoy diciendo que está el método calcular área, pero no te digo cómo se calcula el área,
00:05:55
porque no te lo puedo decir de una figura geométrica.
00:06:01
Cuando tú crearás un triángulo que extiende figura geométrica,
00:06:04
el triángulo tendrá que implementar el método abstracto.
00:06:10
El método abstracto calcularia, que tú has metido que todas las figuras geométricas tienen calcularia,
00:06:15
pero tú lo implementarás en una subclase, no en la clase abstracta.
00:06:21
¿Entiendes?
00:06:28
Pero a veces hay una clase que define un concepto genérico con unas características y métodos
00:06:30
que no se pueden concretar directamente.
00:06:34
Por ejemplo, una figura geométrica
00:06:36
tiene sentido que tenga un método
00:06:38
para calcular su perímetro y su área,
00:06:40
pero cómo se calculan estos
00:06:42
depende de la figura geométrica concreta.
00:06:45
O, por ejemplo, un vehículo
00:06:46
tendrá la capacidad de moverse,
00:06:48
pero cómo lo hace depende del vehículo concreto.
00:06:50
Cuando yo uso el moverse sobre un barco,
00:06:53
hará una cosa distinta que moverse sobre un avión,
00:06:56
que moverse sobre un tren,
00:06:59
que moverse sobre un coche.
00:07:00
Pero todo se puede mover.
00:07:02
¿Se entiende? Entonces, este moverse, este cálculo área, este cálculo perímetro, serán métodos abstractos.
00:07:04
Métodos que todos los que deriven de esta clase, todos los que estendan esta clase,
00:07:13
todos los que sean subclase de esta clase, van a tener que implementar, porque es normal que los tengan.
00:07:20
Pero como depende de la subclase concreta, yo ahora te digo solo que existe, pero no te digo cómo sea.
00:07:25
me lo dirás
00:07:32
si yo uso una clase abstracta
00:07:33
puedo dejar este método
00:07:36
abstracto, sin implementación
00:07:37
sin cuerpo
00:07:40
¿vale?
00:07:41
cuando tú extenderás mi clase
00:07:43
heredarás este método
00:07:45
pero lo heredarás sin cuerpo
00:07:47
y tendrás que
00:07:49
¿y cómo se llama
00:07:51
cuando yo hago el cuerpo de un método
00:07:58
que estaba en mi superclase?
00:07:59
sobrescribirlo
00:08:02
override
00:08:03
¿entiendes?
00:08:04
es como si fuera un pseudo
00:08:07
contrato en el que
00:08:09
yo te digo, mira, todas las clases
00:08:11
que van a heredar de mí
00:08:13
tienen necesariamente que tener esto, esto y esto
00:08:14
lo van a tener
00:08:17
si no lo
00:08:18
implementan, pues
00:08:21
daré un error
00:08:23
lo que puedo hacer es que tenga una clase abstracta
00:08:23
y que tenga otro nivel de abstracción
00:08:27
o sea, una clase, una subclase
00:08:29
que también sea abstracta
00:08:31
Entonces no tiene que implementar los métodos abstractos.
00:08:33
Mientras que la clase abstracta puede contener dentro método abstracto.
00:08:38
Pero una clase abstracta no se puede implementar.
00:08:41
No puede hacer una new de una clase abstracta.
00:08:45
Una clase abstracta puede declarar, además de métodos normales, también métodos abstractos.
00:08:49
Porque a lo mejor algunas cosas sí que la puede implementar.
00:08:57
Si yo tengo el método de cuenta lados y toda la figura geométrica tiene lados, pues lo puedo implementar directamente en figura geométrica.
00:09:01
No todos los métodos de figura geométrica que se trata tienen que ser abstractos.
00:09:10
Pero con que una clase tenga al menos un método abstracto, pues esa clase es abstracta.
00:09:15
Métodos abstractos.
00:09:30
Un método abstracto es aquel que no tiene más que la definición del mismo sin su implementación.
00:09:31
Es decir, que no tiene la parte de las llaves.
00:09:38
Y se declara así.
00:09:42
Public abstract int método abstracto, sus parámetros.
00:09:44
Y aquí en vez de abrir llave y poner el código, pongo directamente punto y coma.
00:09:50
Esta es la declaración de un método abstracto.
00:09:56
¿Cuál es el cuerpo? ¿Qué hace? No lo sé.
00:09:58
¿Y cuándo lo sabré?
00:10:00
Cuando una clase que extenda esa clase implemente este método sobre escribiendo.
00:10:02
Sí, figura geométrica tendrá public abstract, double, calcular área, abierta paréntesis, cerrada paréntesis, punto y coma.
00:10:08
¿Cómo se calcula el área? No lo sé, pero de una figura geométrica puedo crear un área.
00:10:23
Cuando extenderé figura geométrica creando cuadrado, cuadrado extends figura geométrica,
00:10:30
cuadrado será obligado a sobreescribir el método calcular área.
00:10:36
Y lo hará usando su fórmula para calcular el área.
00:10:42
Ahora luego esto lo hacemos prácticamente.
00:10:46
A ver, retomamos el ejercicio del viernes y lo volvemos a hacer con clase abstracta.
00:10:50
Un método abstracto debe ser obligatoriamente redefinido en las subclases, no abstractas.
00:10:57
Si la subclase es abstracta, lo puede dejar sin definir.
00:11:04
permiten declarar en la superclase
00:11:07
un comportamiento que deberán
00:11:12
complementar todas las subclases
00:11:14
pero sin decir nada
00:11:16
sobre su implementación
00:11:18
yo te estoy diciendo, todas mis subclases
00:11:19
tienen que tener calcular área
00:11:21
pero cómo se hará, pues no lo sé
00:11:23
lo sabrá la subclase
00:11:26
¿dudas?
00:11:27
¿preguntas?
00:11:30
vale, entonces aquí por ejemplo
00:11:36
tengo una superclase, cuando esas tratas
00:11:38
se le pone en cursiva. Una superclase que tiene dentro un método que es real y otro método,
00:11:40
veis que está en cursiva, que es un método abstracto. El método 2 es abstracto. Cuando
00:11:47
yo tengo la subclase que hereda de esta superclase, hereda el método 1 con ya su implementación,
00:11:53
que si quiere puede sobreescribir o si quiere puede no sobreescribir. Lo ha heredado y luego
00:11:59
tiene el método 2 que ha heredado el prototipo ha heredado el hecho que tiene que existir pero le
00:12:05
falta el método para que esta clase no sea abstracta tiene necesariamente que implementar
00:12:12
el método 2 si no lo implementa pues no funciona da un error entonces tengo dos opciones o pongo
00:12:20
que esta subclase también es abstracta y entonces puede dejar el método 2 abstracto pero no puede
00:12:29
hacer una new ni de superclase ni de subclase porque son abstractas las dos. O la otra opción
00:12:36
es que en subclase no la pongo abstracta y entonces tengo que implementar todos los
00:12:41
métodos abstractos que he regalado. Además que pueda sobreescribir los otros métodos si quiere.
00:12:46
dudas
00:12:52
una clase abstracta no se puede
00:12:54
instanciar clases abstractas
00:12:58
no puedo hacer una new
00:13:01
de una clase abstracta, me va a dar
00:13:03
error
00:13:05
se puede instanciar
00:13:05
clases heredadas siempre que no sean
00:13:09
abstractas a su vez, vale
00:13:11
entonces si yo tengo una clase abstracta
00:13:12
ahí tengo otra clase que hereda esta clase abstracta
00:13:15
y esta otra clase que hereda la subclase
00:13:17
no es abstracta
00:13:19
pues puedo hacer una new de la subclase
00:13:21
Pero no, no, ni de la superclase.
00:13:23
Se pueden instanciar subclases utilizando la referencia a la clase padre.
00:13:26
Por ejemplo, si tengo esta situación de aquí, ¿vale?
00:13:30
Clase figura donde tengo un método abstracto que es dibuja para dibujar esta figura.
00:13:33
Luego tengo la clase rectángulo que extiende figura y que implementa con su código dibuja.
00:13:38
Y la clase círculo que extiende figura y que implementa también la figura.
00:13:43
Yo puedo crear figura f es igual a niu rectángulo.
00:13:47
¿Por qué?
00:13:50
¿Por qué puedo crear figura f es igual a newRectangulo?
00:13:51
¡Exacto!
00:14:11
Porque la relación de herencia es una relación de esin
00:14:11
Y un rectángulo es una figura
00:14:16
Por lo tanto, cuando creo un rectángulo
00:14:18
Lo puedo guardar tranquilamente en una referencia de tipo figura
00:14:21
Porque todo lo que puede hacer una figura lo puede hacer un rectángulo
00:14:27
Al revés, no
00:14:29
No puede hacer rectángulo r es igual a newFigura
00:14:31
Por dos razones
00:14:34
Razón número uno
00:14:36
Primero porque una figura no es un rectángulo
00:14:37
Y segundo
00:14:47
Segunda razón de por qué no puede hacer rectángulo R es igual a new figura
00:14:48
Está escrito en negrita
00:14:54
¡Muy bien!
00:14:58
¿Cómo te has salido?
00:15:02
Yo creo que te he perdido
00:15:04
Enhorabuena
00:15:06
Vale, hasta aquí hemos entendido esto
00:15:08
esto se puede aplicar a cualquier cosa
00:15:11
yo puedo hacer personas
00:15:16
¿se acuerdan? hay personas
00:15:18
que le daban alumnos
00:15:19
y profesores
00:15:22
en una clase, en un instituto
00:15:23
a mí me interesan alumnos
00:15:26
y profesores, no me interesan
00:15:28
personas
00:15:30
la persona me interesa
00:15:31
como molde para definir
00:15:34
toda la estructura de una persona
00:15:36
que comparten alumnos
00:15:38
y profesores, pero luego cuando
00:15:40
lo uso en la escuela, yo quiero por un lado
00:15:42
alumnos y por un lado profesores. Es
00:15:44
decir, que difícilmente
00:15:46
yo crearé una persona
00:15:48
como objeto. Yo o creo
00:15:50
alumnos o creo profesores.
00:15:52
¿Entendéis?
00:15:55
Entonces, persona sería
00:15:56
abstracto.
00:15:58
De esta
00:16:03
forma no puedo crear una persona.
00:16:04
Y luego
00:16:07
herede.
00:16:08
¿Sí?
00:16:11
Bueno.
00:16:12
Dicho esto, viene otro concepto interesante que hemos usado en un ejercicio 2.
00:16:14
Hemos hecho esto en lo del viernes que me preguntabas tú, Dennis.
00:16:22
¿Qué es el concepto del polimorfismo?
00:16:27
¿Qué es el polimorfismo?
00:16:29
Dos métodos se definen como polimórficos, o sea, tienen polimorfismo,
00:16:31
Si con el mismo nombre hacen funciones distintas, aunque similares, en objetos distintos.
00:16:36
Es decir, si yo tengo la clase triangular y la clase cuadrada,
00:16:50
y los dos tienen el método calcular área,
00:16:58
calcular área hace lo mismo.
00:17:03
¿Qué hace calcular área?
00:17:04
Calcular área.
00:17:06
Calcular área.
00:17:08
La función es la misma, ¿vale? Tiene el mismo nombre, pero ¿cómo lo hacen? Es distinto.
00:17:08
El triángulo lo calculará como base por alteza dividido por 2, el cuadrado lo calculará como base por alteza, o sea, lado por lado, o lado por lado.
00:17:16
O sea, hacen lo mismo, calcular el área, en funciones parecidas, son similares porque están haciendo lo mismo,
00:17:26
pero son distintos si yo llamo calcular es un triángulo o calcular es un cuadrado.
00:17:34
¿Vale? Entonces este método se dice polimórfico, porque se adapta, adapta su forma, tiene varias
00:17:41
formas dependiendo de si lo llamo sobre un triángulo o sobre un cuadrado, sobre un coche
00:17:49
o sobre un barco, sobre un alumno o sobre un profesor. ¿Entiende? No es el mismo método,
00:17:54
Son dos métodos parecidos con el mismo nombre que hacen la misma funcionalidad de forma distinta en objetos distintos.
00:18:02
Normalmente esto deriva del hecho que yo tenía una clase superclase, he heredado de esta superclase y he especializado el método que estaba en la superclase en mis subclases.
00:18:15
Yo tenía calculadores de figuras
00:18:30
Ahora lo he pasado en triángulos
00:18:33
Y lo he especificado para triángulos
00:18:35
Lo he pasado a cuadrados y lo he especificado para cuadrados
00:18:36
Y ahora tengo dos métodos que hacen lo mismo
00:18:39
Pero que hacen cosas
00:18:41
Que como lo hacen es distinto
00:18:43
Dependiendo del objeto sobre el que lo llevo
00:18:45
¿Se entiende el polimorfismo?
00:18:48
O concepto
00:18:54
Por ejemplo, el polimorfismo es el método
00:18:55
Calcular el rectángulo del círculo
00:18:57
Polimorfismo
00:18:59
Otro método de polimorfismo sería el método moverse de coche, o sea, vehículo, coche, bar.
00:19:01
Otro método de polimorfismo es el método saludar de persona, alumno, profesor.
00:19:09
Porque el alumno dice, hola, soy el alumno Stefano,
00:19:15
y el profesor dice, hola, soy el profesor Kier.
00:19:19
¿Entiendes?
00:19:23
Hacen lo mismo, saludan.
00:19:25
Pero uno diciendo que es un alumno y diciendo que es su nombre,
00:19:27
y otro en vez dice que es un profesor y pone su apellido.
00:19:31
Por último, si hablamos de clases,
00:19:40
el polimorfismo es lo que nos permite crear una clase con la referencia padre
00:19:42
pero que apunta a una clase hija, ¿vale?
00:19:47
Como hemos visto anteriormente.
00:19:50
O sea, cuando decimos que figura F es igual a un rectángulo,
00:19:51
estamos usando una forma de polimorfismo
00:19:56
Porque estamos, sustancialmente, utilizando un puntero, un tipo de variable de tipo superclase,
00:19:58
metiendo dentro un objeto de tipo subclase.
00:20:09
Se puede hacer porque cualquier subclase antes crea un objeto para la superclase.
00:20:14
Cualquier subclase es una superclase, entonces cualquier cosa que haga una superclase,
00:20:19
la puede hacer una subclase.
00:20:24
A lo mejor de forma distinta, pero lo puede hacer. Cuando se usa un método sobre un objeto,
00:20:25
se usará el de la clase de la que ese objeto es instancia. ¿Vale? Esto lo hemos visto. Es decir,
00:20:35
que cuando yo llamo, yo tengo una cadena de herencia. Tengo, no sé, vehículo, luego tengo
00:20:43
coche y luego tengo coche fantástico, que heredan una de otra. Y tengo moverse. El vehículo tiene
00:20:51
moverse, el coche tiene moverse y el coche fantástico tiene también moverse. ¿De acuerdo?
00:20:59
Cuando yo llamo moverse sobre un objeto se puede usar el de vehículo, el de coche o el de coche
00:21:05
fantástico. El que se elige depende de la instancia, no de la referencia.
00:21:14
Si yo tengo esta cosa aquí, figura f es igual a un rectángulo, y ahora llamo
00:21:23
f.calcularia, ¿dónde voy a mirar la implementación de este método?
00:21:28
¿Qué se usa? ¿Cuál método se usa? ¿El de figura o el de rectángulo?
00:21:37
Es de la clase rectángulo porque la instancia es rectángulo.
00:21:44
¿Está claro?
00:21:50
Podemos usar una superclase como parámetro formal
00:21:54
y luego usar el método apropiado basándose sobre el objeto pasado como parámetro actual.
00:21:57
Yo parámetro formal de un método puedo decir
00:22:05
método haz algo que me pasas una figura.
00:22:07
y dentro
00:22:14
este método haz algo, calcula su área
00:22:17
para hacer no sé qué
00:22:19
ahora, si tú
00:22:21
cuando usas este método haz algo
00:22:23
que pilla una figura, me pasas un
00:22:25
rectángulo, yo usaré
00:22:27
la calcularía del rectángulo
00:22:29
cuando tú
00:22:32
si tú me pasas un triángulo, usaré la calcularía
00:22:33
del triángulo, si tú me pasas un
00:22:36
círculo, usaré la calcularía del círculo
00:22:38
pero dentro
00:22:40
en el código estoy usando figura
00:22:41
y estoy usando este. Cuando tenemos que crear un objeto de una clase heredada podemos utilizar
00:22:43
como clase referencial a la del padre o la del hijo. Tenemos una clase padre y una clase hijo.
00:22:54
Puedo usar padre object es igual a new hijo. Funciona. Padre object es igual a new padre.
00:22:59
Siempre y solo padre tiene que ser no astra. Si padre es una clase astral esto no lo puedo hacer.
00:23:07
Pero si padre, como hemos hecho hasta ahora, es una clase no abstracta, puede hacer esto.
00:23:15
E hijo object es igual a new object, new hijo. Estas tres cosas se pueden hacer, ¿vale?
00:23:21
Lo que no puede hacer es, hijo object es igual a new padre, porque el hijo,
00:23:29
el padre no es un hijo
00:23:37
el hijo es un padre
00:23:39
¿sí?
00:23:41
dicho así
00:23:44
no tiene sentido, pero me entiendo
00:23:44
vale
00:23:46
hay tres formas posibles de estanciarla
00:23:48
¿vale? hijo barra h
00:23:51
guardaño hijo barraño hijo
00:23:52
¿vale? lo que estamos diciendo ahora
00:23:54
podremos acceder a todos los métodos de atributo del hijo
00:23:56
y del padre ¿vale?
00:23:59
si hay métodos sobrescritos solo accederemos a los del hijo
00:24:00
queda claro esta cosa aquí
00:24:03
si yo tengo una
00:24:05
variable de tipo hijo
00:24:07
y un objeto de tipo hijo
00:24:10
puedo acceder a todos los métodos del hijo
00:24:11
puedo acceder a todos los métodos del padre
00:24:13
porque los tengo heredados
00:24:15
pero si tengo un método sobrescrito
00:24:17
no puedo acceder al del padre
00:24:20
solo puedo acceder al del hijo
00:24:22
si yo tengo un coche fantástico
00:24:23
que heredaba de coche
00:24:31
cuando uso el método sobre el coche fantástico
00:24:32
no puedo usar el método
00:24:37
moverse del coche.
00:24:39
Siempre se usará el método
00:24:40
moverse del coche fantástico.
00:24:42
¿Sí?
00:24:47
Si yo tengo
00:24:49
padre, padre, padre,
00:24:50
bueno, el padre puede acceder
00:24:51
solo a los métodos y atributos
00:24:53
del padre. No hay un hijo aquí
00:24:55
porque no se ha creado el hijo.
00:24:57
¿Sí?
00:25:01
Entonces es imposible acceder a los
00:25:01
del hijo. No existen ni sus
00:25:03
atributos ni sus métodos
00:25:05
Porque he creado un coche, no un coche fantástico.
00:25:07
Entonces tengo un coche, no le puedo hacer dar al botón esto que salta.
00:25:10
¿De qué estoy hablando? ¿O estoy víctima de la nostalgia?
00:25:14
¿No habéis visto nunca el coche fantástico?
00:25:19
Pues los coches normales no saltan. El coche fantástico sí, y habla también.
00:25:23
Y luego existe una cosa llamada upcasting, ¿vale?
00:25:29
Es cuando digo, el padre es un hijo.
00:25:33
O sea, tengo una referencia padre con dentro un objeto hijo.
00:25:39
¿Se puede hacer? Sí, porque la subclase es una superclase.
00:25:44
Porque se puede hacer.
00:25:50
Podemos acceder, pero solo a los métodos atributos del padre.
00:25:52
Porque cuando uso la referencia, él creerá que es un padre.
00:25:55
Entonces, no ve los métodos alternativos de hijo.
00:25:58
Si un método del padre está sobrescrito, ¿cuál se usa? El del hijo. Porque cuál se usa no depende de la referencia, sino depende de la cosa, del estado. Y ahora hacemos todas pruebas de esto.
00:26:03
solo podemos acceder a los delijos
00:26:21
si hacemos un downcasting
00:26:24
explícito, esto es un upcasting
00:26:26
estoy casteando hacia arriba
00:26:28
en la jerarquía
00:26:30
de
00:26:32
herencia
00:26:33
y yo puedo hacer un downcasting
00:26:35
explícito, o sea, castear hacia abajo
00:26:38
¿vale? siempre y cuando
00:26:40
lo pueda hacer porque si no explota
00:26:42
el downcasting
00:26:43
consiste en poner la referencia que
00:26:45
queramos bajar hacia la clase heredada
00:26:48
Por ejemplo, esto. ¿Os acordáis que aquí yo había creado var h que es un hijo, pero que es de tipo padre? Pues ahora haciendo esto le estoy diciendo, mira, tú eres de tipo hijo. Trátame esta referencia, este objeto, como si fuera un hijo. Que lo puede hacer porque en realidad dentro de esta referencia de tipo padre hay un hijo.
00:26:50
¿Vale? Si cuando lo hago
00:27:09
no es verdad que esta
00:27:11
bar h no apuntaba aquí,
00:27:13
por ejemplo, si intento hacer hijo de
00:27:15
bar p, pues me va
00:27:17
a saltar una class cast exception.
00:27:19
Estás intentando hacer un
00:27:22
casting a una clase que
00:27:23
no puedes hacer, porque
00:27:25
no eres de ese tipo de clase.
00:27:27
No, yo soy un vehículo que va a hacer
00:27:30
un downcasting a un coche.
00:27:31
No, tú eres un vehículo, no eres un coche.
00:27:33
Y aquí empezarían interfaz,
00:27:40
que hoy no va a pedir.
00:27:42
Interfaces son clases abstractas donde no hay métodos concretos.
00:27:44
Solo métodos abstractos.
00:27:48
¿Vale?
00:27:51
Pero mañana o pasado.
00:27:51
¿Sí?
00:27:58
¿Dudas hasta aquí?
00:27:58
- 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:
- 20
- Fecha:
- 19 de enero de 2026 - 11:52
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 28′ 06″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 235.73 MBytes