20260112 Herencia_2 - 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, el proyecto hecho, pues venga, voy a hacer un paquete para trabajar siempre en paquetes, pues yo que sé, cualquiera, pues venga, mi paquete, entonces resulta que yo aquí tengo mi clase cliente, estoy en un proyecto nuevo solamente, repito, para poner ejemplos de herencia.
00:00:00
Pues yo tengo aquí mi clase cliente, que era con la que he hecho yo mi aplicación, cualquiera, que tiene solamente estas propiedades, NIF por ejemplo, podría tener su constructor, getter, setter, modificador privado, todo eso, pero bueno, ahora vamos a ver de forma muy aislada lo de la herencia, para que quede claro cómo funciona.
00:00:27
Vale, entonces mi aplicación está hecha con esta clase cliente, su nombre, su NIF, sus cosas y ahora es cuando necesito incorporar una nueva entidad que son los clientes VIP.
00:01:02
vale, pues entonces
00:01:14
me hago yo una clase
00:01:16
ala, me hago esta clase
00:01:19
y esta clase en el momento de hacerlas
00:01:29
cuando digo, a ver
00:01:31
cuidado que cliente VIP
00:01:33
es un cliente
00:01:35
luego al ser cliente VIP
00:01:37
un cliente va a tener nombre y NIF
00:01:39
y todo lo que tiene cliente, porque lo es
00:01:41
entonces en lugar de
00:01:44
poner aquí otra vez, nombre, NIF
00:01:46
los métodos que sean, todo
00:01:48
en lugar de hacer eso
00:01:49
digo, vale, como es un cliente
00:01:51
porque sé que lo es a todos los efectos
00:01:54
porque ya he analizado
00:01:56
mi aplicación, he visto todos los casos
00:01:57
todas las situaciones, la tengo muy analizada
00:02:00
y he visto que lo es
00:02:01
pues entonces
00:02:02
hago mi Stents
00:02:04
¿Dijiste que no?
00:02:06
¿Que llevan en mayúscula?
00:02:13
Que es una
00:02:15
es muy habitual, porque normalmente
00:02:16
son datos constantes
00:02:18
para que usen todas las, entonces es
00:02:21
relativamente habitual que los encontréis
00:02:22
escritos con mayúsculas
00:02:24
¿Todo mayúscula o qué pi?
00:02:25
Todo, todo mayúscula.
00:02:26
Vale.
00:02:30
Vale.
00:02:31
Depende de lo que representen, claro.
00:02:32
Bueno, pues cuando representan constantes,
00:02:35
que es la mayoría de los casos,
00:02:37
pues como pi, el número e,
00:02:38
todos esos que vimos en la clase más del último día,
00:02:42
pues ya vemos que van con mayúsculas.
00:02:45
Vale, a ver, entonces,
00:02:48
yo tengo esta nueva entidad, cliente VIP,
00:02:49
al darme cuenta de que un cliente VIP
00:02:52
a todos los efectos de mi aplicación,
00:02:53
para todos los efectos
00:02:56
y todo esto viene porque he hecho un buen análisis
00:02:57
yo no tendría que estar aquí sentada
00:03:00
escribiendo si antes
00:03:02
no he hecho un buen análisis en el que he entendido
00:03:04
exactamente qué es cada entidad
00:03:06
por qué se caracteriza
00:03:08
qué va a hacer
00:03:10
en mi aplicación, hasta que no tenga
00:03:12
todo eso entendidísimo, no tiene sentido que uno se siente
00:03:14
que hay que hacer nada, bueno, como ahora lo tengo
00:03:16
entendidísimo, ya he visto que a todos los efectos
00:03:18
un cliente VIP
00:03:20
es un cliente también, no hay nada que le distinga
00:03:22
de un cliente, a todos los objetos es un cliente
00:03:24
pero además
00:03:26
añade algo particular
00:03:28
¿qué añade?
00:03:29
pues bueno, añade en este caso
00:03:32
nos dicho por ejemplo la dirección
00:03:34
añade esto
00:03:36
vale, pues ahora ya tengo
00:03:40
dos clases
00:03:44
dos clases de las que yo instancio
00:03:45
objetos completamente
00:03:48
distintos
00:03:50
uno es de la clase cliente y otro es de la clase
00:03:51
cliente VIP, instancio todos los objetos
00:03:54
que quiera de cada clase
00:03:56
bueno, pues vamos a hacer
00:03:57
un main ahora
00:04:00
vale, pues yo tengo aquí mi main
00:04:01
por supuesto puedo crear objetos cliente
00:04:14
normales y corrientes, como siempre
00:04:17
cliente c1
00:04:19
new cliente
00:04:21
vale
00:04:26
se ha creado
00:04:27
con su constructor por defecto
00:04:29
porque no he hecho ningún constructor
00:04:31
aquí, entonces recordad
00:04:33
que si uno no especifica
00:04:35
un constructor es ahí
00:04:37
se supone que hay uno por defecto
00:04:38
sin parámetros que no hace nada
00:04:41
vale
00:04:42
vale, pues igual que puedo hacer
00:04:44
un cliente o dos o tres o mil
00:04:46
pues puedo hacer también
00:04:49
objetos cliente VIP
00:04:50
también tranquilamente
00:04:52
ah, que no he puesto nombre en la variable
00:04:53
vale, y aquí está
00:05:09
mi cliente VIP
00:05:18
hasta ahí, todo como siempre
00:05:19
y C1 es
00:05:22
completamente independiente de C2
00:05:24
C1 tiene sus dos propiedades
00:05:26
Nombre y NIF
00:05:29
Y
00:05:30
C2 tiene sus
00:05:32
Tres propiedades
00:05:34
Nombre, NIF y
00:05:35
Y dirección
00:05:38
¿Vale?
00:05:40
Entonces yo aquí podría, estoy pasando de los
00:05:42
Getter y los Setter y todo un poco por comodidad
00:05:44
Pero sería igual, pues yo aquí podría
00:05:46
Ponerle a mi cliente 1 su NIF
00:05:48
Podría ponerle
00:05:51
A mi cliente 1 su nombre
00:05:55
No es que aún no es VIP
00:05:57
Es que no es VIP
00:06:06
No está destinado a ser VIP
00:06:08
Es un cliente C1
00:06:09
Y solo tiene estas dos propiedades
00:06:11
Y ya está y no tiene más
00:06:13
Las que tiene aquí
00:06:14
Vale
00:06:16
Pues este de aquí
00:06:16
Este de aquí, C2
00:06:26
Como vemos
00:06:28
Este sí que tiene tres propiedades distintas
00:06:30
pues yo le puedo poner su if
00:06:33
el que me dé la gana
00:06:35
y estos son dos objetos
00:06:36
independientes, este tiene
00:06:58
sus propiedades y este tiene
00:07:00
sus otras, o sea la herencia
00:07:03
no establece entre ellos una relación
00:07:05
en tiempo de ejecución
00:07:07
o sea la herencia no es una relación entre objetos
00:07:08
este es
00:07:11
un objeto y este es otro y van por libre
00:07:13
la herencia
00:07:15
en realidad es una relación en tiempo
00:07:16
de escritura de código
00:07:19
stents, lo que me permite
00:07:20
es ahorrarme el copia y pega
00:07:23
pero son dos objetos independientes
00:07:25
¿vale? no tienen nada que ver el uno con el otro
00:07:26
bueno pues hasta ahí
00:07:29
tampoco hemos ganado
00:07:33
nada respecto a olvidarnos de la herencia
00:07:35
¿no? porque yo
00:07:37
podría haber hecho aquí en cliente VIP
00:07:39
haber hecho mi copia y pega
00:07:41
si yo hago mi copia y pega
00:07:43
lo pongo aquí y quito
00:07:45
el stents, estoy en la misma
00:07:47
situación ¿verdad?
00:07:49
¿no?
00:07:52
podría decir, mira voy a pasar de la
00:07:52
claro que hasta aquí
00:07:54
tampoco es que hayamos aportado nada especialmente
00:07:55
estupendo, porque podría decir
00:07:58
bueno hombre, solo el copia y pega
00:08:00
pues para eso
00:08:01
te haces esto
00:08:04
te haces esto, quitas el stents
00:08:05
y estás haciendo
00:08:09
exactamente lo mismo, pues sí
00:08:12
efectivamente, estamos haciendo
00:08:14
exactamente lo mismo
00:08:16
lo mismo, vale
00:08:17
pero
00:08:20
como hemos identificado que un cliente
00:08:22
viper era de cliente, pues hemos dicho, bueno,
00:08:24
pues voy a marcarlo
00:08:26
y además
00:08:27
ya no copio esto aquí.
00:08:29
Pero es una cuestión de copia y pega hasta ahora.
00:08:32
Nada más.
00:08:34
Luego estos objetos son absolutamente independientes.
00:08:36
C2 no tiene ninguna
00:08:39
relación con C1. Absolutamente ninguna.
00:08:40
C1 tiene su NIF y su nombre
00:08:42
y C2 tiene su NIF, su nombre
00:08:44
y su dirección. No tiene ninguna
00:08:46
relación uno con el otro.
00:08:48
¿Qué es lo que sí que ganamos?
00:08:52
Pues
00:08:55
esto de aquí
00:08:55
yo tengo un objeto
00:08:57
ahora mismo
00:08:59
C3
00:09:01
que voy a instanciar en algún momento
00:09:02
en algún momento lo crearé
00:09:06
es un espacio ahí para un cliente
00:09:08
que aparecerá
00:09:10
pero todavía no sé qué tipo de cliente va a ser
00:09:11
no tengo ni idea
00:09:14
bueno
00:09:14
pues lo declaro como cliente
00:09:16
porque no sé si va a ser cliente normal
00:09:19
o cliente B, pero un cliente va a ser
00:09:22
porque recordemos que cliente VIP
00:09:24
en realidad es un caso particular
00:09:26
luego un cliente, no sé qué tipo de cliente va a ser
00:09:28
pero un cliente va a ser
00:09:30
pues yo lo declaro como cliente
00:09:31
y ahí
00:09:35
puede pasar lo que sea, cualquier cosa
00:09:35
ahora toca el momento de crear el cliente
00:09:38
pues al objeto
00:09:40
C3 puedo guardar
00:09:42
cualquier tipo de objeto
00:09:45
eso es lo importante
00:09:47
que puedo guardar
00:09:49
objetos de la
00:09:55
clase
00:09:56
cliente
00:09:58
o de cualquier subclase
00:09:59
de cualquier subclase
00:10:08
entonces ahora llega el momento en que ya
00:10:09
C3 va a cobrar valor
00:10:11
ahora ya C3 va a aparecer en mi programa
00:10:13
y va a cobrar valor
00:10:15
por supuesto puede recibir un cliente normal
00:10:16
pero es que C3 también puede recibir
00:10:19
un cliente VIP
00:10:21
si a mi me da la gana
00:10:23
y no hay ningún problema
00:10:24
aunque esté declarado como cliente
00:10:26
puede recibir un objeto
00:10:29
de la propia clase cliente
00:10:31
o de cualquiera de las subclases
00:10:33
me da igual
00:10:35
porque el cliente VIP es un objeto
00:10:36
también
00:10:39
entonces
00:10:40
esto sobre todo
00:10:49
lo vemos más utilidad
00:10:52
cuando tenemos que hacer muchos objetos
00:10:54
que es lo habitual
00:10:57
yo tengo un array de clientes
00:10:58
un montón de array de clientes
00:11:00
voy a trabajar con 100 por ejemplo
00:11:01
con 100
00:11:06
y ahora
00:11:09
Cada cliente del array
00:11:11
Puede ser del tipo que le dé la gana
00:11:13
Por ejemplo
00:11:15
Por ejemplo
00:11:17
Clientes 0
00:11:18
Pues aquí quiero meter o me toca meter
00:11:20
O me han dicho que meta o lo que sea
00:11:23
Un cliente normal
00:11:25
Vale, pues ahí va un cliente normal
00:11:26
Pero en clientes 1
00:11:28
Toca meter o
00:11:31
Me han dicho o lo que sea
00:11:32
Toca meter un cliente VIP
00:11:34
Bueno, pues ahí puede ir
00:11:36
Un cliente VIP
00:11:39
Y ningún problema.
00:11:39
Entonces, esta es la utilidad fundamental.
00:11:56
Luego ya, claro, tiene detalles para que todo esto encaje dentro de la aplicación completa.
00:11:59
Pero la idea es esta.
00:12:06
Dentro de una referencia de la superclase, puedo meter objetos de cualquiera de las subclases.
00:12:07
Esta es la idea.
00:12:15
Vale, lo único es que, claro, ahora tenemos un pequeño problemilla.
00:12:18
si yo lo he trabajado así
00:12:23
si he declarado la referencia
00:12:25
como cliente, porque
00:12:28
todavía no sé, todavía no sé
00:12:29
qué tipo de cliente va a ir, no sé si va a ir
00:12:31
VIP, si va a ir no sé qué, no sé qué tipo de cliente
00:12:33
va a ir, le he declarado como C3
00:12:35
ahora yo
00:12:38
quiero por ejemplo rellenar el nombre
00:12:39
eh
00:12:41
ningún problema, nombre, vale
00:12:46
pues este nuevo cliente, venga
00:12:49
ya está
00:12:51
ahora, quiero
00:12:52
rellenar el NIF
00:12:55
muy bien, ningún problema
00:12:57
aquí está el NIF
00:12:58
pero ahora de este objeto C3 que acabo de crear
00:13:00
de este objeto
00:13:03
como lo he creado como cliente VIP
00:13:05
tiene espacio para sus tres campos
00:13:07
pues ahora quiero yo
00:13:08
rellenar la dirección
00:13:10
y quiero poner ahí lo que sea
00:13:12
pues el compilador aquí
00:13:18
se queja
00:13:23
y te protesta
00:13:25
y no te deja
00:13:27
porque el compilador
00:13:29
trabaja con reglas muy estrictas
00:13:30
y dice, vamos a ver, C3
00:13:32
C3 voy a buscar
00:13:34
cómo está declarado
00:13:36
el compilador mira cómo está declarado
00:13:38
no cómo está instanciado, eso no le importa
00:13:40
porque puede estar instanciado de cualquier manera
00:13:42
eso le da igual, puede estar instanciado como
00:13:44
BIP, como, él mira cómo
00:13:46
está declarado, dice, a ver C3
00:13:48
tú cómo estás declarado
00:13:50
estás declarado como cliente
00:13:52
vamos a ver qué tiene cliente
00:13:54
qué tiene nombre y NIF, no tiene más
00:13:56
con lo cual lo siento mucho
00:13:58
no te dejo
00:14:00
acceder a esta propiedad
00:14:03
porque C3 lo has declarado
00:14:05
como cliente
00:14:07
y aquí
00:14:08
no hay cliente, entonces no puedo
00:14:11
físicamente
00:14:13
el objeto claro que tiene ese espacio
00:14:17
lo tiene porque yo lo he instanciado como no cliente
00:14:19
físicamente está
00:14:21
pero a nivel de escritura de código
00:14:22
el compilador no me deja
00:14:25
porque él sigue sus reglas y sus reglas
00:14:27
son claras. Si C3 es de clase cliente, lo siento mucho, pero no te
00:14:29
dejo acceder a una propiedad que no está. Claro, es que
00:14:33
aquí entra a hacer el diseño correcto, pues con getter y setter.
00:14:37
Porque los métodos también se heredan.
00:14:41
Entonces, ¿cómo haríamos esto? No lo haríamos así.
00:14:45
¿Cómo haríamos esto si lo hiciéramos bien hecho? Cliente tendría
00:14:49
sus get y sus set. Estas serían propiedades privadas
00:14:53
y cliente
00:14:56
tendría sus get y set
00:14:59
vale, aquí tendría sus get y sus set
00:15:00
entonces ahora cliente vip
00:15:12
vale
00:15:13
esas propiedades las tiene
00:15:15
aunque aquí no aparezcan, las tiene
00:15:18
y además yo le añado
00:15:20
esta, vale
00:15:23
entonces no solo tiene estas
00:15:25
propiedades, aunque yo no las vea físicamente
00:15:27
no solo las tiene
00:15:30
aquí
00:15:31
sino que además
00:15:33
tiene los get y los set
00:15:35
porque todos los métodos
00:15:37
se heredan, salvo los constructores
00:15:39
también los tiene
00:15:41
entonces ya aquí en cliente VIP
00:15:42
con hacer el get y el set de dirección
00:15:44
que es el único que tengo que añadir, suficiente
00:15:47
ah, la tengo yo, mi get y set
00:15:49
de dirección
00:15:56
y ahora ya a través de esos get y set
00:15:57
heredados
00:16:02
ya accedo a las propiedades, que es lo que debería hacer
00:16:02
a través de los get y set heredados
00:16:06
entonces ahora
00:16:07
¿qué problema tengo yo aquí?
00:16:09
Y lógicamente, que no puedo acceder a la propiedad directamente, pues que quiero setNif, ala, ya está, del cliente C1.
00:16:11
Ahora quiero ponerle un nombre a este cliente, setNombre, pues el que fuera, vale.
00:16:22
Ahora, este cliente VIP
00:16:35
Este cliente VIP
00:16:37
Puede tranquilamente
00:16:39
Poner aquí su NIF
00:16:42
Estoy rehaciéndolo de arriba
00:16:44
Set NIF igual a esto
00:16:46
Este cliente C2
00:16:48
Puede, por supuesto
00:16:58
Poner su nombre
00:16:59
Y puede poner
00:17:02
Su dirección a través del
00:17:07
Set suyo
00:17:09
Vale
00:17:10
Y ahora, este que era el caso problemático
00:17:23
este que era el caso problemático
00:17:26
cliente declarado como
00:17:29
clase cliente
00:17:31
C3, declarado como clase cliente
00:17:33
pero instanciado como subclase
00:17:36
cliente VIP, entonces al estar
00:17:39
instanciado como subclase
00:17:41
cliente VIP, al estar instanciado así
00:17:43
él tiene sus
00:17:45
tres propiedades ahí en memoria, eso sí
00:17:47
que no falla, tiene sus tres
00:17:49
ahora las tres accesibles
00:17:50
pero accesibles a través de
00:17:53
esto de aquí
00:17:55
setNif
00:17:58
era nombre lo que tenía aquí
00:17:59
setNombre
00:18:06
vale
00:18:07
cliente
00:18:08
setNif, vale
00:18:14
y ahora
00:18:26
a ver, perdonad que se me ha ido la pinza y os he dicho una cosa mal
00:18:27
vale
00:18:36
que no la tiene accesible tal cual
00:18:36
vale, entonces ahora nos viene
00:18:39
el problema este
00:18:41
c3.setDirección
00:18:42
Set dirección.
00:18:45
No sale.
00:18:48
Si yo la forzara y la pusiera,
00:18:50
set dirección,
00:18:52
oslo.
00:18:54
Si yo la forzara y la pusiera,
00:18:57
el compilador vuelve a hacer lo mismo otra vez.
00:18:59
Me vuelve a decir, espérate,
00:19:01
C3 está declarado como cliente,
00:19:03
vamos a ver si tienes un método set dirección aquí.
00:19:06
Si lo tienes.
00:19:11
Pues no.
00:19:14
No lo tienes, entonces no te lo puedo permitir.
00:19:15
Entonces, ¿qué es lo que tenemos que hacer?
00:19:21
Pues como hemos visto que la instanciación es de cliente VIP
00:19:24
y aquí ya estamos después de la instanciación,
00:19:28
lo que aquí tenemos que hacer es un casting.
00:19:32
Entonces, recordad lo que era un casting.
00:19:54
Un casting era delante de una variable
00:19:57
poner un tipo de dato
00:20:01
al que le
00:20:03
al que le convierto
00:20:04
vale
00:20:06
entonces
00:20:08
yo aquí delante de C3
00:20:10
pongo cliente VIP
00:20:12
eso significa
00:20:15
que le estoy diciendo al compilador
00:20:17
le estoy diciendo
00:20:20
oye
00:20:21
trata C3
00:20:21
como si fuera cliente VIP
00:20:23
es lo que le estoy diciendo
00:20:24
trata C3
00:20:26
como si fuera cliente VIP
00:20:27
vale
00:20:28
pues él lo trata
00:20:29
como si fuera cliente VIP. ¿Hay algún problema
00:20:31
en que lo trate como si fuera cliente VIP?
00:20:33
No hay ningún problema porque lo es.
00:20:35
Entonces, este casting
00:20:37
tiene que ser un casting controlado.
00:20:38
Solo tiene sentido si C3 está
00:20:41
instalado, instanciado previamente
00:20:42
como cliente VIP. Si no está instanciado
00:20:45
como cliente VIP, esto
00:20:47
sería un desastre.
00:20:49
¿Vale? Entonces, están diciendo, oye,
00:20:51
trátalo como cliente VIP.
00:20:53
Entonces, al tratarlo como cliente VIP,
00:20:54
ya me habilita todo
00:20:57
lo que tenga cliente VIP.
00:20:58
Pero este casting, este decirle trátalo como si fuera cliente BIT, tiene que estar conectado a que realmente esté creado como cliente BIT, porque si no, sería un desastre. El compilador lo tragaría, pero sería un desastre.
00:21:01
Es decir, cuidado, imaginaos que… Bueno, sí, dime.
00:21:19
claro, es que lo de los constructores
00:21:29
lo vamos a ver ahora, porque los constructores al no heredarse
00:21:40
hay que hacerlos de forma específica, ahora nos metemos
00:21:42
vale, ahora nos metemos
00:21:44
vale, entonces esta es la primera idea
00:21:46
vale, entonces
00:21:48
la clase heredera tiene
00:21:49
copias y pegas de todo lo de arriba
00:21:53
excepto constructores
00:21:55
que ahora nos metemos con constructores
00:21:57
excepto constructores
00:21:59
¿Qué implicaciones tiene?
00:22:00
Que yo puedo instanciar
00:22:04
Puedo instanciar
00:22:05
Objetos de cualquier subclase
00:22:07
Y meterlos en referencias de la superclase
00:22:10
Pero
00:22:12
Esto me trae un problema
00:22:14
A la hora de escribir el código
00:22:17
Por un tema de protección
00:22:19
De que no hagas burradas
00:22:21
¿Qué es?
00:22:22
Vale, muy bien
00:22:24
Por ganar flexibilidad
00:22:25
Por ganar flexibilidad
00:22:27
hay veces que es imprescindible
00:22:28
lo has declarado como cliente C3
00:22:30
muy bien
00:22:33
y luego lo has instanciado como cliente VIP
00:22:34
bien, ningún problema
00:22:36
pero entonces el compilador
00:22:38
cuando tú trates de acceder
00:22:41
a algo que está en cliente VIP
00:22:43
no te lo va a permitir
00:22:44
porque solo te va a permitir acceder
00:22:47
a lo que esté aquí arriba
00:22:48
tal y como se ha declarado
00:22:50
entonces si queremos acceder
00:22:53
a lo que tiene
00:22:55
él como objeto instanciado
00:22:57
a lo que tiene como objeto instanciado
00:22:59
hay que decirle mediante un casting
00:23:00
trátale como si fuera
00:23:02
así, aunque esté declarado
00:23:04
de la otra manera
00:23:07
¿vale? con este casting le decimos
00:23:08
al compilador que lo considere
00:23:25
como
00:23:27
objeto
00:23:29
de clase
00:23:31
clase VIP
00:23:33
¿vale? es lo que le decimos con ese casting
00:23:37
oye, consideralo pero para
00:23:45
esta línea, solo de código, claro, para esta línea.
00:23:47
Considéralo como objeto de clase
00:23:50
VIP, de clase, perdón, cliente
00:23:51
VIP. ¿Vale? Solo para esta línea
00:23:53
de código. Considéralo como clase
00:23:58
cliente VIP. Entonces, ahora ya
00:24:00
podemos acceder a todo lo que hay adentro.
00:24:02
¿Vale?
00:24:11
Entonces, claro, vosotros podéis decir,
00:24:13
hombre, pero entonces
00:24:15
si hay que decirle
00:24:17
al compilador, porque el compilador
00:24:19
se te queja y se te pone pesado,
00:24:20
cuando quieres acceder a algo propio
00:24:23
del objeto, algo propio y no heredado
00:24:24
algo propio, hay que decirle
00:24:27
que lo trate
00:24:29
como objeto de esa clase
00:24:30
pues para eso
00:24:32
declarémoslo directamente como objeto de esa clase
00:24:34
y nos ahorramos problemas
00:24:37
si aquí lo hubiéramos
00:24:38
declarado directamente como objeto
00:24:41
cliente VIP
00:24:43
me habría ahorrado tener que hacer
00:24:44
todo esto, ¿verdad?
00:24:46
es lo que hemos hecho arriba, si yo lo
00:24:50
declaro como cliente VIP
00:24:52
directamente no tengo que
00:24:53
decirle al compilador, oye, trátalo como cliente VIP.
00:24:56
Entonces, ¿por qué no lo hacemos
00:24:59
siempre así? En lugar de declararlo
00:25:00
como la superclase,
00:25:02
luego ya instanciarlo como la
00:25:04
subclase y entonces complicarnos
00:25:06
la vida, porque no nos va a
00:25:08
quedar más remedio que
00:25:10
hacerle el casting.
00:25:12
Para decirle, trátalo.
00:25:14
Porque, primero,
00:25:16
porque hay veces que no queda más remedio.
00:25:18
Por ejemplo, ahora.
00:25:20
Y segundo, en situaciones
00:25:22
como esta, esta es la clave
00:25:24
cuando tú quieres guardar
00:25:26
un montón de objetos de diferentes
00:25:28
tipos en una misma colección
00:25:30
de datos, en este caso un array
00:25:32
que es la misma colección de datos que conocemos
00:25:34
cuando queremos guardar muchos
00:25:36
en un mismo array
00:25:38
es que aquí no hay tu tía, tienen que ir
00:25:39
declarados todos como cliente, aquí no puedo elegir
00:25:42
aquí no puedo elegir
00:25:45
entonces
00:25:46
aquí
00:25:48
sí que tendría el problema
00:25:49
que cliente es uno
00:25:53
si clientes 1 le quiero fijar su dirección
00:25:54
aquí por ejemplo
00:25:57
a clientes 1
00:25:59
le quiero fijar su dirección
00:26:01
con set dirección
00:26:03
pues no puedo
00:26:04
tendría que hacer el casting
00:26:06
vale
00:26:13
pero claro
00:26:16
tiene que ser un casting controlado
00:26:18
ahora veremos un poco más
00:26:20
también como controlarlo para no cargar
00:26:22
no cargarnos el programa en ejecución
00:26:23
porque yo puedo hacer casting
00:26:26
a lo que me dé la gana, pero si no encaja
00:26:27
¿qué miráis con ese interés?
00:26:30
Ah, no sabía que limpiaban eso.
00:26:33
Bueno, ¿es más interesante
00:26:39
eso que esto?
00:26:40
No creo.
00:26:42
Vale.
00:26:44
Bueno, está
00:26:48
claro que en esta situación
00:26:49
que en esta situación
00:26:51
es que no tenemos alternativa.
00:26:53
Vamos a tener que hacer el casting
00:26:56
porque todos los objetos que van aquí
00:26:58
están declarados de este tipo.
00:26:59
Entonces, no me queda más remedio.
00:27:01
Pero hay otras situaciones en las cuales
00:27:03
el declarar como la superclase es básico también.
00:27:05
Por ejemplo, vamos a hacer un método
00:27:09
para mostrar el nombre del cliente.
00:27:11
Un método cualquiera que está por aquí
00:27:16
para mostrar datos cliente.
00:27:18
Vale.
00:27:32
Entonces, mostrar datos cliente,
00:27:33
El cliente hay que pasárselo como parámetro
00:27:35
Bueno, pues aquí de nuevo nos viene la duda
00:27:38
A ver, este método
00:27:41
Quiero yo que me valga solo para clientes VIP
00:27:43
Porque entonces a este método
00:27:47
Le paso cliente VIP
00:27:49
Vale
00:27:52
Quiero que me valga para cualquier tipo de cliente
00:27:54
Que este método lo pueda llamar
00:27:59
Para mostrar datos de un cliente VIP
00:28:01
Mostrar datos de un cliente
00:28:02
sí, quiero poder llamar a este método
00:28:04
para cualquier tipo de cliente.
00:28:06
Pues entonces no te queda más remedio que llamarlo así.
00:28:08
Entonces, este
00:28:11
método le puedes pasar
00:28:12
un objeto cliente normal,
00:28:13
un objeto cliente VIP,
00:28:17
porque también encaja ahí,
00:28:18
un objeto cliente moroso,
00:28:20
si tienes tú una subclase,
00:28:22
cliente moroso de cliente, lo que te dé la gana.
00:28:24
Entonces, esta es otra
00:28:27
situación
00:28:28
en la que es que no puedo elegir.
00:28:28
Si yo quiero que este método
00:28:32
sea usable, utilizable
00:28:33
para cualquier tipo de cliente
00:28:35
para cualquiera, tengo que poner
00:28:38
aquí la referencia de la superclase
00:28:40
porque si no tendría
00:28:42
que hacer un método específico para mostrar datos
00:28:44
cliente VIP, y aquí poner cliente VIP
00:28:46
mostrar datos específicos
00:28:47
cliente moroso, y ahí poner cliente moroso
00:28:50
entonces no tiene sentido un método
00:28:52
mostrar datos
00:28:54
para cada tipo de cliente
00:28:55
a mí me interesa más en mi aplicación
00:28:57
un dato, mostrar dos clientes, le paso
00:28:59
a un cliente y él ya
00:29:02
que muestre, me da igual que sea BIP, que sea
00:29:04
genérico, que sea lo que sea.
00:29:06
Luego
00:29:10
me voy a ver
00:29:11
en muchas situaciones en las de
00:29:13
situra de haber declarado
00:29:15
una variable de una
00:29:18
superclase y luego
00:29:19
haberla instanciado como la subclase.
00:29:21
Pues si eso ha ocurrido
00:29:24
para acceder
00:29:26
al contenido de la subclase
00:29:27
tengo que hacer
00:29:29
este casting.
00:29:31
Tengo que hacer este casting
00:29:33
¿Te has muerto?
00:29:35
Vale
00:29:42
Ya vamos a
00:29:42
Ya vamos a callarnos en breve
00:29:45
Que no tenía nada que ver con programación
00:29:47
Vale, entonces
00:29:51
Ahora vosotros que estáis ahí
00:29:53
Al quite de cualquier cosa
00:29:55
Me diréis
00:29:57
Ay, perdona
00:29:58
Esta vez no va a pasar
00:30:00
que ya estabais ahí con la incógnita
00:30:05
diréis vosotros
00:30:08
vale, estupendo, con esto
00:30:10
de que la subclase
00:30:12
cabe en la superclase, que bien
00:30:14
un único método
00:30:16
para mostrar datos de cualquier cliente
00:30:17
estupendo, vale, pero ahora vienen los problemas
00:30:20
cuando nos pongamos aquí dentro
00:30:22
ahora vienen los problemas
00:30:23
porque decimos, espérate, yo hago este método
00:30:25
y es que no tengo ni idea
00:30:28
de V que mostrar
00:30:30
es decir, la dirección
00:30:32
la puedo mostrar seguro.
00:30:34
¿Verdad?
00:30:37
Es decir, v voy a poder
00:30:38
mostrar su nif, perdón.
00:30:40
Mucha dirección.
00:30:43
Vale, hasta aquí sin problema.
00:30:44
El
00:30:47
nombre también
00:30:48
estupendamente.
00:30:50
Pero ahora me viene aquí un problema gordo
00:30:53
que es, tú me has pasado un objeto
00:30:54
cliente v
00:30:56
y yo no sé
00:30:58
si es un cliente normal
00:31:00
o si es un cliente v.
00:31:02
Porque en el caso de que sea un cliente VIP, la hemos liado, voy a necesitar mostrar aquí el otro dato que me falta. Si quiero que este método sea completo y funcione para todos, si quiero que sea completo y funcione para todos, tengo que averiguar de alguna manera si este que me has pasado se ha creado, se ha instanciado como VIP para además añadir lo que falta.
00:31:04
pues así me he quedado
00:31:26
¿tengo alguna herramienta
00:31:28
para ver cómo se ha instanciado
00:31:31
un objeto
00:31:33
de una superclase?
00:31:35
sí que la tengo, que es el
00:31:37
instance of
00:31:38
entonces yo ahora, aquí he mostrado
00:31:39
esto me vale, me da igual que v
00:31:42
bueno, esto de v es que es muy feo
00:31:44
me da igual que c
00:31:47
sea genérico o v
00:31:53
porque estas dos propiedades las tiene
00:31:54
estas las voy a mostrar sí o sí
00:31:56
pero ahora
00:31:57
yo hago lo siguiente
00:31:59
si c
00:32:02
instance of
00:32:03
cliente
00:32:06
vip
00:32:09
¿y qué es el instance of?
00:32:10
pues es un operador maravilloso
00:32:14
que te dice
00:32:17
si este objeto
00:32:18
se instanció como esta clase
00:32:20
si se instanció
00:32:23
como la clase que pongas aquí
00:32:25
eso te devuelve true
00:32:27
si no te devuelve false
00:32:28
entonces si el objeto que me han pasado aquí
00:32:30
se instanció como cliente
00:32:33
VIP, maravilloso
00:32:35
ya sé que le puedo hacer ese casting
00:32:37
y ya muestro lo que me falta
00:32:39
entonces ahora ya podríamos hacer
00:32:40
tranquilamente
00:32:43
cliente VIP de C
00:32:44
punto get dirección
00:32:52
y ahora todo esto
00:32:55
al system
00:32:57
Me falta uno aquí
00:32:58
Ese, me falta
00:33:41
Pues este ahora ya es un método
00:33:42
Como es la idea
00:33:51
Que me vale para cualquier tipo de cliente
00:33:52
Que esa es la idea
00:33:54
Poder hacer una relación entre clases
00:33:55
De forma que pueda yo tratar conjuntamente
00:33:57
A todos los clientes
00:34:00
Sean bien morosos
00:34:02
a todos los animales
00:34:03
sean gatos, perros, ratones
00:34:04
así tengo que hacer los diseños
00:34:06
entonces yo tengo un método, vamos a ver esto del cliente
00:34:08
y le paso a un cliente
00:34:11
que puede ser de cualquier
00:34:12
tipo, de este
00:34:15
o de las subclases, de cualquiera
00:34:16
pero claro
00:34:18
voy a tener que tirar de este operador
00:34:20
no me va a quedar más remedio
00:34:22
para ahora ya, una vez
00:34:24
metida en las tripas del método
00:34:26
pues distinguir en función
00:34:28
del tipo que sea, hacer ya una cosa u otra
00:34:30
porque serán objetos distintos, lógicamente
00:34:32
bueno, pues la combinación de estas ideas
00:34:35
es lo fundamental, luego a partir de aquí
00:34:46
ya son detallitos
00:34:48
pues de constructores, de no sé qué, de ciertas
00:34:49
cosas, pero lo importante es tener
00:34:52
la idea clara
00:34:53
las ideas claras siguientes
00:34:55
que
00:34:57
la herencia con Stents
00:34:59
lo que te facilita
00:35:02
es, primero
00:35:04
la escritura del código porque te permite
00:35:05
crear otra clase distinta
00:35:07
otra clase distinta
00:35:09
copiando y pegando las propiedades de otra
00:35:11
otra clase distinta
00:35:14
pero claro, solamente la uso
00:35:15
si realmente puedo enunciar
00:35:18
cliente VIP
00:35:20
es cliente
00:35:21
si puedo sustituir extents por es
00:35:23
entonces pues sí, tiene sentido
00:35:25
si no puedo sustituir
00:35:27
si esto no lo puedo
00:35:29
sustituir
00:35:32
por es
00:35:33
y no me pega
00:35:35
y me queda ahí una frase absurda
00:35:36
pues ese diseño te lo tiras a la basura
00:35:39
porque ese diseño está muy mal hecho
00:35:41
¿vale? eso por un lado
00:35:42
bueno, pues entonces
00:35:45
una vez que yo he establecido relaciones de herencia
00:35:46
ya correctamente
00:35:49
ahora yo puedo tratar a todos los objetos
00:35:50
de las subclases
00:35:53
a todos de forma común
00:35:54
¿vale? como aquí
00:35:56
todos mis clientes
00:35:58
todos mis clientes
00:36:01
están metidos en referencias
00:36:03
de tipo cliente
00:36:05
y están tratados de forma común
00:36:06
y ahora ya, que yo quiero mostrar datos
00:36:08
de un cliente
00:36:11
vale, pues por ejemplo
00:36:12
mi método mostrar datos cliente
00:36:20
que está aquí, pues le puedo pasar
00:36:22
cualquier cliente
00:36:27
le puedo pasar mi cliente
00:36:28
C1, que era cliente normal
00:36:31
vale
00:36:32
se lo puedo pasar
00:36:34
y mostrar los datos del C1
00:36:36
Pero es que también a ese método
00:36:39
También le puedo pasar el C2
00:36:41
Que era de otro tipo
00:36:45
Y me mostrará en ese caso
00:36:46
Los datos del otro
00:36:49
Y le puedo pasar cualquier objeto
00:36:50
Que sea de la clase cliente o de las subclases
00:36:52
¿Vale?
00:36:55
Aquí en este caso
00:36:56
Voy a ver las C1 y C2
00:36:57
Que C1 tenía esto y C2 tenía esto
00:37:00
Pues voy a ver
00:37:03
Las cinco líneas cuando ejecute esto
00:37:04
El primer mostrar datos me ha hecho esto, los datos del primer cliente que era cliente normal y el segundo mostrar datos, este de aquí, me ha hecho esto, me ha mostrado el segundo, o sea, son dos objetos distintos de clases distintas, pero las he podido tratar con el mismo método.
00:37:06
Y esto sin la herencia tendría que haber hecho mostrar datos cliente general, mostrar datos cliente VIP. Sin la herencia tendría que duplicar un método por cada subclase, una colección por cada subclase, ¿vale?
00:37:33
Vale, venga, pues ahora ya sí que paramos aquí.
00:37:53
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 1
- Fecha:
- 12 de enero de 2026 - 21:12
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 37′ 56″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 147.18 MBytes