20260114 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:
A ver, que estábamos aquí, estábamos aquí. Una forma es poner el get, pero a ver, esto en realidad también es un poco feo, porque a lo mejor en mi entidad cliente, pues yo no quiero hacer los dos públicos, porque solamente quiero dar permiso de lectura para las clases que están fuera, etc.
00:00:00
entonces la heredera
00:00:20
es que es una clase especial, la quiero distinguir
00:00:22
de las demás, entonces que la
00:00:24
heredera entre por el mismo camino
00:00:26
que entran los extraños
00:00:28
pues hombre es feo
00:00:30
más que nada porque a lo mejor yo ni siquiera
00:00:32
he habilitado los dos caminos
00:00:34
a lo mejor he habilitado solamente el get
00:00:36
y el set no
00:00:38
o he habilitado
00:00:39
solamente el get de nombre pero el de nid
00:00:42
no, entonces
00:00:44
¿cuál es la alternativa habitual?
00:00:46
Pues poner el cuarto
00:00:48
Modificador de datos
00:00:51
Que mencionamos que existía
00:00:53
Pero que dijimos, tiene que ver con la lección y lo dejamos
00:00:55
¿Qué era?
00:00:58
Nadie habrá tenido
00:00:59
Una visión en la cabeza
00:01:00
Que de repente
00:01:03
Se ha acordado
00:01:05
De hace dos meses que lo mencionamos, ¿verdad?
00:01:06
No, a ver, que era una tontería
00:01:12
¿Quién se va a acordar de eso?
00:01:13
¿Os acordáis que mencioné esto?
00:01:15
Y dije, nos falta este modificador de acceso
00:01:17
pero todavía no podemos entender
00:01:20
qué significa, perdón, no es aquí donde quiero
00:01:22
ponerlo, perdón, no era aquí
00:01:24
lo quiero poner
00:01:26
en aquí, es decir
00:01:28
problema que estoy tratando de resolver
00:01:30
esta es la clase
00:01:32
cliente, que está diseñada
00:01:34
como Dios manda
00:01:36
propiedades privadas, get y set
00:01:38
¿vale?
00:01:40
entonces, ¿qué significa?
00:01:42
que ninguna clase
00:01:44
que no sea cliente puede hacer referencia
00:01:46
a nombre y nif
00:01:49
pero se nos queda una situación absurda
00:01:49
que es la que acabamos de ver
00:01:52
que cliente VIP es una clase
00:01:53
diferente a cliente
00:01:56
pero ella claro que tiene nombre y NIP dentro
00:01:57
los tiene dentro porque los ha heredado
00:02:00
los tiene, pero se da la situación
00:02:02
absurda de que no puede hacer
00:02:04
referencia a ellos, no puede porque hay un
00:02:06
private aquí y el compilador
00:02:08
es muy estricto
00:02:10
bueno pues para eso existe el modificador
00:02:11
protected
00:02:14
y ya es el último modificador de acceso
00:02:15
que es igual
00:02:19
a todos los efectos que private
00:02:21
igual, pero
00:02:23
deja como excepción
00:02:25
a las subclases
00:02:27
luego, con el modificador protected
00:02:28
nadie puede acceder a nombre
00:02:31
inif, salvo
00:02:33
las subclases
00:02:35
con lo cual
00:02:36
tiene todo el sentido, ahora yo ya desde cliente
00:02:39
vip, cuando yo quiera
00:02:41
acceder a mi nombre, que lo tengo
00:02:43
porque lo he heredado, yo tengo mi nombre
00:02:45
¿vale? pues ya podré
00:02:46
Y cuando yo quiera acceder a mi NIF
00:02:49
Que lo tengo, lo tengo dentro, lo he heredado
00:02:52
Es que forma parte de mi objeto
00:02:54
Pues ya podré
00:02:56
¿Vale?
00:02:58
Sí, dime
00:03:10
¿No has dicho tu profe, Diego?
00:03:11
Yo sí que tengo una voz en la cabeza
00:03:16
Lo ha dicho, pero no lo sabe
00:03:17
Bueno, pues esto sería lo más normal
00:03:22
ala pues volvemos
00:03:32
otra vez
00:03:37
entonces este método es un método
00:03:38
que está sobre escrito
00:03:41
es un método sobre escrito
00:03:43
y yo ya lo puedo dejar así
00:03:44
tranquilamente y ya está y ya sabemos
00:03:47
las implicaciones que tiene esto
00:03:48
que cuando desde cualquier sitio
00:03:50
por ejemplo desde este main
00:03:52
yo llame a este se llamará
00:03:54
la versión de cliente
00:03:56
pero sin embargo cuando lo llame
00:03:58
desde C2 se llamará
00:04:00
a la versión de este otro
00:04:02
ya lo sabemos, por eso es un método
00:04:04
polimórfico que tiene diferentes formas
00:04:06
para efectos de
00:04:08
clarificar el código
00:04:11
lo que se suele hacer es incluir
00:04:13
cuando uno sobrescribe un método
00:04:15
como aquí que lo hemos sobrescrito
00:04:18
estaría
00:04:20
estupendo
00:04:22
poner
00:04:22
algo que lo explicara
00:04:26
me diríais
00:04:28
pues un comentario, pues si los comentarios siempre
00:04:30
vienen bien, pero los comentarios son para los humanos
00:04:31
los comentarios luego cuando
00:04:34
las clases se compilan
00:04:36
los comentarios lógicamente desaparecidos son para los humanos
00:04:38
entonces existe otra cosa
00:04:40
que
00:04:42
este año prácticamente lo tendremos que utilizar
00:04:44
pero el año que viene continuamente
00:04:47
pero hay que configurarlo todo, existe otra cosa que se llaman
00:04:48
anotaciones
00:04:50
y las anotaciones no es que sea
00:04:51
no es código que se ejecuta
00:04:54
pero si es información
00:04:56
relacionada con el código
00:04:59
que el compilador tiene en cuenta
00:05:00
vale
00:05:03
y la máquina virtual también tiene en cuenta
00:05:04
para generar ciertas cosas
00:05:07
aunque ahora todavía no podamos
00:05:08
tener ningún ejemplo
00:05:11
y las anotaciones
00:05:12
empiezan por un arroba
00:05:14
y en este caso la anotación
00:05:16
que nos vendría maravillosa
00:05:19
es
00:05:20
uy la he puesto en cliente, perdón
00:05:22
aquí no, control x
00:05:24
aquí
00:05:26
entonces
00:05:28
yo he sobrescrito este método
00:05:29
lo he sobrescrito, este es un método sobrescrito
00:05:32
esto si es un comentario
00:05:35
super clase
00:05:42
vale, pues si además
00:05:47
soy tan hábil y me acuerdo
00:05:50
de avisar
00:05:52
de que este es un método sobrescrito
00:05:54
con esto que es
00:05:56
una anotación
00:05:58
que empieza con un arroba y hay
00:05:59
millones de miles de anotaciones
00:06:02
en particular la anotación que expresa
00:06:03
sobrescritura es overwrite
00:06:06
¿vale?
00:06:08
Pues si yo me acuerdo de poner la anotación
00:06:10
Diréis, pues ya está, no pasa nada
00:06:12
Hombre, pasa un montón
00:06:14
Es decir, el código funciona exactamente igual
00:06:16
Todo se ejecuta igual
00:06:19
No hay ningún cambio
00:06:20
Pero, ostras, el código es muchísimo mejor
00:06:21
Queda mucho más claro
00:06:25
Este es un método sobrescrito
00:06:26
Entonces yo ya sé
00:06:28
Que esto está ocultando la versión de la superclase
00:06:30
Ya sé eso
00:06:33
Entonces ya tiene cierto interés
00:06:35
¿Para qué me vale tan bien?
00:06:38
por ejemplo, imaginaos que yo mi intención era
00:06:40
sobre escribir el método, mostrar datos
00:06:44
porque no me gusta la versión de cliente
00:06:47
no me gusta nada esta versión
00:06:49
o más que no me gusta, no me vale
00:06:50
esta no me vale porque se queda corta
00:06:52
entonces yo la sobre escribo
00:06:55
y me equivoco
00:06:56
y pongo una S de más
00:06:58
por poner un ejemplo tonto
00:07:00
pues ahí me quedo tan tranquila
00:07:02
pensando que he sobre escrito el método
00:07:05
y ya está
00:07:07
mi método está sobre escrito
00:07:08
y yo luego cuando yo ofrezca esto
00:07:10
mi main, pues mi main llama
00:07:12
a mostrar datos
00:07:14
y no hay ningún error
00:07:15
claro, no hay ningún error, pero a qué mostrador estará llamando
00:07:17
ahora, al de la superclase
00:07:20
porque no lo ha sobrescrito
00:07:26
es decir, si yo me he equivocado
00:07:27
y me he creado este método con esta otra S
00:07:31
ahora en cliente
00:07:33
tengo dos que están
00:07:35
coexistiendo, el heredado
00:07:37
que yo no lo veo, que es este
00:07:39
el heredado que yo no lo estoy
00:07:41
viendo
00:07:43
pero que está aquí
00:07:43
y este nuevo
00:07:45
que es otro distinto
00:07:47
¿por qué? porque tiene otro nombre
00:07:49
luego es otro distinto, tiene dos
00:07:50
¿vale? no es sobrescrito nada
00:07:53
ha hecho otro distinto porque la firma es distinta
00:07:55
en este caso el nombre
00:07:58
entonces, ahora ya
00:07:59
mi clase tiene dos métodos
00:08:03
y cuando yo desde mi main
00:08:04
llame a mostrar datos, estaré llamando
00:08:06
al de la superclase
00:08:08
y si llamara a este otro, que no lo haría
00:08:10
porque se supone que ha sido por
00:08:12
error, ¿vale?
00:08:14
Estaría llamando
00:08:19
al de...
00:08:20
No, bueno, aquí no puedo porque en este ejemplo no puedo.
00:08:24
¿Vale? Y si llamo a este otro,
00:08:32
estoy llamando al otro.
00:08:35
Es decir, tengo dos versiones.
00:08:36
Esta y esta.
00:08:42
Tengo dos. ¿Vale?
00:08:43
Esta es la heredada y esta es esta otra.
00:08:45
¿Vale? ¿Pero qué situación
00:08:48
estaba recreando yo? Que yo no
00:08:49
quería esto. Yo no quería esto. Me he equivocado.
00:08:51
Yo creía que estaba sobrescribiendo,
00:08:53
pero me he equivocado y he puesto otra S
00:08:55
y yo tiro con mi aplicación para adelante
00:08:56
con lo cual esto no está
00:08:58
y digo, jolines, pero ¿por qué no funciona?
00:08:59
¿por qué no funciona? ¿por qué está llamando al de la superclase?
00:09:02
¿por qué está llamando al de la superclase? ¿por qué no me funciona?
00:09:04
tú no
00:09:08
no es fácil detectar el error, no es fácil
00:09:08
y el error ha sido que no has puesto la
00:09:10
cabecera igual, con lo cual al compilador le da igual
00:09:12
dice, pues será que estás haciendo otro nuevo
00:09:15
al compilador que más le da
00:09:16
será que estás haciendo otro
00:09:18
bueno, pues si nosotros
00:09:19
nos acostumbráramos a poner
00:09:22
la anotación overwrite
00:09:24
en todos los métodos
00:09:26
que nuestra intención es que sean sobrescritos
00:09:28
si nos acostumbráramos
00:09:31
aquí ya
00:09:33
sí que se produce una validación
00:09:34
porque el compilador
00:09:36
dice, ah, que tu
00:09:38
intención con esto
00:09:40
es sobrescribir un método
00:09:42
de arriba
00:09:44
porque has puesto la anotación, entonces se le hace ya una
00:09:45
validación en tiempo de compilación
00:09:48
ah, espérate, que tu intención
00:09:50
era sobrescribir un método de arriba
00:09:52
va y dice, uy, pues mal vas
00:09:54
porque es que arriba no hay ningún método que se llame así
00:09:57
entonces tú ya
00:09:59
puedes detectar
00:10:01
en tiempo de
00:10:03
compilación, puede detectar que te has
00:10:04
equivocado, y dices, pero ¿cómo puede ser?
00:10:07
pero que sí que hay un método que se llama
00:10:09
mostrar datos, ¿por qué no me dejas sobreescribirlo?
00:10:11
ah, vale, es que no lo he
00:10:13
escrito bien, luego
00:10:15
poner esta anotación
00:10:22
no es que sea obligatorio
00:10:23
y el programa va a funcionar exactamente igual
00:10:25
pero me permite detectar en tiempo de escritura
00:10:27
mía de código, me permite detectar
00:10:30
cosas que a lo mejor estoy haciendo mal
00:10:32
por error y que el compilador no se va a enterar
00:10:34
como ese ejemplo que he dicho antes
00:10:36
llamar a esta mal
00:10:38
entonces yo me creo que estoy sobre escribiendo
00:10:40
la de arriba pero estoy
00:10:42
haciendo otro añadido, otro adicional
00:10:44
y luego cuando
00:10:46
llame al de arriba se va a llamar al original
00:10:48
no al sobre escrito, lógicamente porque el sobre escrito
00:10:50
no existe
00:10:52
y esos errores
00:10:53
no que sean errores
00:10:55
Sino que
00:10:57
Hemos hecho mal la aplicación
00:10:59
Con lo cual la aplicación funciona perfectamente
00:11:01
Pero no está haciendo lo que nosotros queremos
00:11:03
Porque recordad
00:11:05
Hay tres situaciones
00:11:11
La que la facilonga
00:11:12
Errores de compilación, estupendo
00:11:15
Todavía no he entregado mi aplicación
00:11:17
Y es que el compilador me dice que hay algo mal
00:11:19
Yo los arreglo con sus indicaciones
00:11:21
Y sobre todo con mis conocimientos
00:11:23
Pues sus indicaciones pueden ser más confusas
00:11:25
Que otra cosa
00:11:27
Ahora mi aplicación ya no tiene errores de compilación
00:11:28
Creo que está bien
00:11:30
la llevo a fase
00:11:31
de pruebas o lo que sea
00:11:33
ahí ya me pueden salir dos tipos de errores
00:11:35
de ejecución
00:11:37
es decir, yo la arranco
00:11:39
y me sale una excepción, no funciona, errores de ejecución
00:11:41
esos también son buenos
00:11:43
porque los puedo detectar
00:11:45
porque la aplicación no funciona
00:11:48
porque, ¿qué ha pasado? y los arreglo
00:11:49
pero luego ya está el escenario
00:11:51
horrible, que es mi aplicación
00:11:53
no tiene errores de compilación, no tiene errores de ejecución
00:11:55
pero no hace
00:11:57
lo que tiene que hacer
00:11:59
hace otra cosa
00:12:02
pues ese es el problema
00:12:03
y este sería un caso en el cual
00:12:05
ni de error de compilación
00:12:07
ni de error de ejecución funciona
00:12:09
pero lo que hace no tiene nada que ver
00:12:11
con aquello que me han pedido
00:12:13
que es el peor escenario posible
00:12:14
el que tendríamos que evitar
00:12:16
y se evita con un buen análisis
00:12:19
un buen diseño, etc.
00:12:21
y se evita
00:12:25
pues cuando
00:12:29
te retiran el proyecto y dices
00:12:30
o espabilo o me muero de hambre
00:12:33
vale
00:12:35
dudas
00:12:40
no hay dudas, es que para poder ya hacer algo
00:12:43
y hacer alguno de los ejercicios de los que os voy a subir
00:12:50
ya sé que es mucho rollo y mucho hablar
00:12:52
mucho, tenemos que incorporar
00:12:54
lo de los constructores
00:12:56
pero eso es muy rápido
00:12:57
os lo prometo
00:12:59
si de repente quieres transformar
00:13:01
un objeto que tenías un cliente normal
00:13:03
de repente ha hecho tres pedidos
00:13:05
pues entonces, vale, por ejemplo
00:13:07
este cliente C1
00:13:12
que es un cliente normal
00:13:13
pues has verificado cualquier cosa
00:13:15
¿no? entonces imagínate que la aplicación
00:13:18
viene por aquí y ha pasado
00:13:20
algo
00:13:22
que se está cumpliendo
00:13:22
¿eh?
00:13:25
bueno
00:13:30
esto sustituye a esa
00:13:30
condición de pedidos, no sé qué
00:13:34
la que sea y tú le quieres
00:13:35
hacer VIP
00:13:37
pues porque resulta
00:13:39
vamos a poner una condición que dé menos
00:13:41
angustia
00:13:44
resulta que su NIF
00:13:44
empieza
00:13:47
por cero y todos
00:13:50
los que su NIF empieza por cero
00:13:51
te caen tan bien
00:13:53
que los quieres hacer
00:13:55
VIP
00:13:57
pues es que
00:13:58
este no se le puede hacer VIP
00:14:01
tienes que hacer otro
00:14:03
es decir, ¿qué cosa tan rara
00:14:04
tendrías que hacer aquí?
00:14:07
pues te creas un cliente VIP
00:14:09
claro, auxiliar
00:14:11
por ejemplo, ¿vale? y al cliente VIP
00:14:16
no le puedes asignar C1
00:14:18
no puedes, ¿por qué?
00:14:20
C1 es cliente
00:14:23
entonces a un cliente le puedes asignar
00:14:24
un cliente VIP, pero al revés no
00:14:26
entonces, ¿qué tendrías que hacer?
00:14:28
pues tú te instancias aquí
00:14:31
un cliente VIP
00:14:32
No, a un cliente
00:14:33
Un cliente, pero al revés, ¿no?
00:14:42
Claro, es decir
00:14:45
Un animal es un gato
00:14:47
Pero un gato no es un animal
00:14:49
Es decir, ¿no?
00:14:52
Claro, un gato
00:14:53
Encaja dentro del concepto de animal
00:14:55
Pero un animal
00:14:56
No encaja dentro del concepto de gato
00:14:59
Es decir, en un animal tú puedes hacer
00:15:01
New gato, porque gato
00:15:03
Encaja el concepto de animal, pero un gato
00:15:05
No puedes hacer new animal
00:15:07
porque animal no encaja en el concepto de gato
00:15:08
es más grande
00:15:11
entonces cliente VIP no puede asignarle C1
00:15:12
porque C1 es cliente
00:15:15
no puede asignarle algo más grande que él
00:15:17
bueno en ese caso es que son tipos distintos
00:15:19
no es que en este caso
00:15:25
uno está incluido dentro del otro
00:15:27
vale
00:15:28
entonces pues te tendrías que hacer algo nuevo
00:15:28
copiar los datos
00:15:32
aux
00:15:34
Punto nif
00:15:38
Igual a c1
00:15:40
Punto nif
00:15:42
Aux
00:15:43
Punto nombre
00:15:46
Igual a
00:15:47
¿Por qué me deja acceder a las propiedades
00:15:54
A lo bestia?
00:15:56
Ah, ahora se ha enterado, vale, es que como arrastra
00:16:03
Los errores de compilación de antes no se enteraba
00:16:05
Ah no, pero a nif me ha dejado
00:16:06
No, aquí no se ha enterado, aux cliente
00:16:08
B
00:16:11
Cliente B
00:16:11
Cliente
00:16:14
Protete
00:16:16
Domain, no hereda de
00:16:18
C1
00:16:19
Punto
00:16:28
Nombre
00:16:30
Aux punto
00:16:31
Dirección, claro que este lógicamente
00:16:37
No
00:16:40
Aux
00:16:40
Punto set
00:16:44
Dirección, con la dirección que sea
00:16:45
Y ahora
00:16:48
Este misterio tan grande
00:16:49
Alguna explicación tendrá
00:16:52
vale, y ahora ya tendrías que ser
00:16:54
hace uno, voy a pisarlo
00:16:56
y ahora hace uno que sea
00:16:58
aus, pues siempre
00:17:00
podías hacer este apaño
00:17:02
vale
00:17:03
es decir, crear una instancia
00:17:05
nueva de cliente vivo, una instancia nueva
00:17:08
esa instancia nueva que
00:17:10
copie los datos, es como
00:17:12
borro el formulario, tengo aquí
00:17:13
mi fichita con el cliente
00:17:16
paz, lo borro
00:17:18
me hago una hoja nueva con los datos
00:17:20
nuevos y al archivo
00:17:22
vale, pero no puedes en la misma
00:17:23
hojita borrar lo que hay
00:17:26
y ponerle otra
00:17:28
cosa, esa hoja la tiras a la basura
00:17:30
te creas una hoja con los datos nuevos
00:17:32
y pin, sustituyes una por la otra
00:17:34
no hay otra, vale, una situación
00:17:36
como esa, vale
00:17:38
y
00:17:39
el que
00:17:40
yo lo que no pillo
00:17:44
es porque me ha dejado a mi poner aux.nif
00:17:46
con el
00:17:48
protect
00:17:51
¿Pero qué es lo que tú no pillas?
00:17:53
Antes de mirar eso
00:18:00
A ver, aquí esto es una cosa muy particular
00:18:01
Vale
00:18:09
Esto no es una cosa
00:18:11
Que vayas a hacer en una aplicación en general
00:18:14
Habitualmente
00:18:17
Porque normalmente
00:18:18
Si tú tienes clientes
00:18:27
Que se pueden convertir en VIP
00:18:30
tú lo diseñarías de otra manera
00:18:32
que es poniendo un campo boolean que fuera
00:18:34
es VIP y ese campo de boolean lo marcas
00:18:36
a true o false, ¿vale?
00:18:38
es decir que el, si tú consideras
00:18:40
que un cliente puede ser VIP o puede no serlo
00:18:42
y durante el tiempo de vida de tu aplicación
00:18:44
puede ir cambiando, ahora lo soy, ahora no lo soy
00:18:46
ahora lo soy, ahora no lo soy
00:18:48
no harías el diseño, ahora vamos a ver
00:18:49
esto, pero antes déjame que completemos esto
00:18:51
¿vale? es decir, si tú
00:18:54
cuando estudias tu situación, dices
00:18:55
mis clientes, a veces son VIP
00:18:58
a veces no
00:19:00
entonces, frente a esa situación
00:19:01
tú no harías un diseño
00:19:03
en el cual haces dos clases
00:19:05
y dirías, mi cliente
00:19:07
ahora es un objeto de esta y otro es un objeto de esta
00:19:09
otra, sería una cosa un poco rara
00:19:11
lo que harías es, como mis clientes
00:19:13
se caracterizan por ser VIP o no serlo
00:19:15
pues les pongo un boolean
00:19:18
que sea, es VIP o no es VIP
00:19:19
y eso lo va a hacer mucho más
00:19:21
vale, entonces estoy diciendo que
00:19:24
las subclases en el momento en el que se crea
00:19:25
cada objeto debería
00:19:27
determinaste cuál debería ser.
00:19:28
O sea, en una aplicación normal.
00:19:31
Claro, o sea, si tú has hecho un diseño en el cual
00:19:32
tienes esta clase y tienes esta otra,
00:19:34
es porque los objetos
00:19:36
no van a cambiar de tipo. Lo normal es que los objetos
00:19:38
no tengan que cambiar de tipo.
00:19:41
Claro, si tú has hecho una aplicación
00:19:43
en la cual un objeto de repente
00:19:44
ya no le pega a ser de esa clase,
00:19:46
sino de repente debería pasar a ser de otra,
00:19:48
pues cambia el diseño, porque es
00:19:51
muy raro. ¿Vale?
00:19:52
Entonces, si tus clientes
00:19:54
A veces van a ser VIP y a veces no
00:19:56
Con lo cual tienen que cambiar de clase
00:19:58
Pues como de camisa
00:20:00
Pues entonces no hagas dos clases
00:20:03
Sino haz una única clase
00:20:05
Y márcalo con un boolean
00:20:06
¿Vale? Tendría más sentido
00:20:07
Y ahora, tu pregunta
00:20:09
¿No has entendido lo que queríamos hacer aquí?
00:20:12
Sí, más o menos
00:20:15
Tarnapillo
00:20:16
Lo en sí
00:20:17
Lo de
00:20:19
Ah, no, esto es un ejemplo
00:20:19
Esto me he inventado yo
00:20:24
¿por qué le interesa al usuario
00:20:25
un cliente que da normal hacerlo VIP?
00:20:27
Pues porque empezaba por cero y eso le gusta.
00:20:29
Yo qué sé, porque he puesto true
00:20:32
y se ha angustiado, entonces por eso he puesto una condición
00:20:33
cualquiera. O sea, lo que me ha dicho es
00:20:35
y si pasa algo en lo cual
00:20:37
a ti de repente te apetece que un
00:20:39
cliente normal sea VIP,
00:20:41
¿qué harías? Pues tienes que cambiar su tipo
00:20:43
y su tipo no se puede.
00:20:45
Entonces tienes que hacer uno nuevo
00:20:47
de ese otro tipo, copiarle los datos
00:20:49
y sustituir
00:20:51
la referencia C1 por esta.
00:20:53
Entonces, cuando esta llave ha terminado, cuando estamos aquí abajo, C1 sigue vivo, por supuesto, porque C1 está declarado aquí, C1 sigue vivo, pero C1 ahora es un objeto instanciado como cliente VIP.
00:20:55
Si yo ahora hago aquí un instance of cliente VIP, me va a decir true, porque ahora C1 está instanciado como cliente VIP.
00:21:14
y AUX
00:21:20
fue un temporal
00:21:23
que como se declaró localmente
00:21:24
en este bloque
00:21:26
AUX ha estado local en este bloque
00:21:27
entonces en cuanto salgo de la llave
00:21:30
el AUX ya ha desaparecido
00:21:32
y no molesta
00:21:34
pero no es una situación
00:21:35
que normalmente nos veamos
00:21:38
en la tesitura de resolver, cambiar un tío por otro
00:21:40
porque es raro
00:21:42
en relación a lo que estaba diciendo allí
00:21:43
si por ejemplo
00:21:46
hicimos de manera de que
00:21:48
pones lo del bulan es VIP
00:21:49
puedes hacer una condición
00:21:52
en la clase
00:21:55
que sea que si es VIP
00:21:57
declara
00:21:58
si es VIP aparece una variable
00:22:00
no, no, no
00:22:04
no, claro
00:22:05
las propiedades
00:22:08
tienen que ser las mismas
00:22:10
vale
00:22:11
vale, a ver
00:22:12
ahora, el gran misterio
00:22:17
¿por qué
00:22:19
me deja acceder
00:22:21
a
00:22:29
porque está
00:22:30
en el mismo paquete
00:22:34
vale, vale, es que no
00:22:36
claro, claro, sí, sí, porque está en el mismo paquete, es que normalmente no es lo habitual
00:22:37
que el main esté en el mismo paquete, por ejemplo
00:22:40
lo habitual sería
00:22:42
que nuestro main estuviera aquí fuera
00:22:44
vale
00:22:46
entonces si nuestro main lo movemos aquí fuera
00:22:47
pero protectek no es
00:22:51
para las clases
00:22:52
si, todas las clases
00:22:54
del mismo
00:23:01
Vale, a ver, es que
00:23:02
Sí, sí, sí
00:23:05
Ahora
00:23:08
Lógicamente lo tendría que hacer con el set
00:23:09
Vale
00:23:11
Set nif
00:23:13
Nif
00:23:15
Punto set
00:23:16
Nombre
00:23:26
C1 punto set
00:23:27
Nombre
00:23:32
Ay no, perdón, get nombre
00:23:32
Y ahora c1 punto
00:23:35
Get nif
00:23:43
Vale
00:23:45
Vale
00:23:46
Entonces Protected
00:23:48
Vamos a recopilarlo
00:23:51
Porque aquí tenía yo una pequeña confusión
00:23:52
Como normalmente se hacen diferentes paquetes
00:23:55
Entonces
00:23:57
Ah vale, sí, sí
00:23:59
Protected
00:24:00
Es
00:24:02
A las del paquete
00:24:03
Te deja todas
00:24:07
Y fuera del paquete
00:24:08
Te mete como excepción
00:24:11
Las subclases
00:24:13
Las subclases independientemente del paquete
00:24:14
Donde estén
00:24:22
Pueden ver a esa propiedad
00:24:22
Vale, por ejemplo
00:24:25
Si nosotros
00:24:33
Metiéramos aquí
00:24:34
Por ejemplo he sacado cliente VIP
00:24:37
Solo para probarlo
00:24:39
Para asegurarnos de que lo hemos dicho completamente bien
00:24:40
Cliente VIP lo he sacado fuera
00:24:43
En main
00:24:45
Y cliente VIP
00:24:47
sigue pudiendo ver a nombre
00:24:49
porque es protected, ¿vale?
00:24:51
Cliente ir sigue pudiendo.
00:24:54
Bueno, pues vemos lo de los constructores
00:25:12
y nos vamos, ¿vale?
00:25:14
Que es poquita cosa.
00:25:16
Vale.
00:25:20
Hemos dicho que una clase
00:25:23
que hereda con stents
00:25:24
lo hereda todo menos los constructores, ¿vale?
00:25:27
Pues entonces hay que hacer
00:25:32
constructores específicos.
00:25:33
Por ejemplo, esta clase cliente de aquí
00:25:34
No tiene ahora mismo ningún constructor
00:25:38
Es como si tuviera el constructor por defecto
00:25:42
Pero yo le puedo hacer el constructor con parámetros de toda la vida
00:25:45
Que sería lo ideal
00:25:49
Me hago yo un constructor con parámetros
00:25:50
Este de aquí
00:25:53
Aquí tengo mi constructor con parámetros
00:25:57
vale, recordad que
00:26:06
desde el momento en que hago algún constructor
00:26:08
el constructor por defecto
00:26:11
queda deshabilitado
00:26:13
vale, ahora
00:26:14
cliente VIP
00:26:18
cliente VIP, yo me tendría que
00:26:20
hacer un constructor con todos
00:26:22
sus parámetros
00:26:24
y tiene tres, entonces
00:26:25
el constructor que yo tendría que hacerme con
00:26:28
cliente VIP, que me lo tengo que hacer específico
00:26:30
tiene que tenerlos
00:26:33
todos
00:26:34
String
00:26:35
Nif
00:26:37
String nombre
00:26:38
String dirección
00:26:40
¿Vale? Porque cliente
00:26:44
Tiene
00:26:50
Cliente vip tiene las tres propiedades
00:26:51
Nif, nombre y dirección
00:26:54
¿Vale?
00:26:56
Entonces
00:26:58
Podríamos hacerlo así
00:26:59
Directamente, dis.nif
00:27:02
Igual a nif
00:27:04
Dis.nombre
00:27:06
Igual a nombre
00:27:09
Y dis.dirección
00:27:13
Igual a dirección
00:27:16
¿Vale?
00:27:19
¿Vale?
00:27:21
¿Pero qué ocurre?
00:27:32
Estamos repitiendo código en realidad
00:27:34
Cliente tiene ya aquí
00:27:36
A ver, es que lo he puesto en otro orden
00:27:38
Pero bueno, da igual
00:27:41
lo voy a poner el mismo para que se vea más claro.
00:27:43
Aquí he puesto nombre y nif.
00:27:45
Pues voy a poner aquí también
00:27:48
nombre y nif.
00:27:49
Vale.
00:27:57
Vale, del rojo olvidados.
00:27:59
Ahora lo vemos por qué sale.
00:28:00
Bueno, pues este sería mi constructor
00:28:03
con parámetros. Lo del rojo es al margen de esto.
00:28:04
No tiene nada que ver, lo quitamos.
00:28:07
Mi constructor con parámetros que yo he hecho a mano.
00:28:08
Lo normal no es
00:28:11
repetir todo esto.
00:28:12
Porque aquí tengo solo tres propiedades.
00:28:14
pero imaginaos que yo heredo de una clase
00:28:16
que tiene 50 propiedades
00:28:18
que a su vez
00:28:21
hereda de otra que tiene 20
00:28:22
entonces cada vez que me haga el constructor
00:28:24
me tengo que poner aquí todas otra vez
00:28:26
es una pérdida de tiempo
00:28:28
podría, pero lo habitual es apoyarme
00:28:30
en el constructor del de arriba
00:28:32
es
00:28:34
aprovechando que el constructor mío de arriba
00:28:36
ya hace estas dos cosas
00:28:39
ya las hace, que hace estas dos
00:28:40
pues hombre
00:28:43
si consiguiera llamarlo de alguna manera
00:28:44
ya tendría esta
00:28:47
parte hecha. Pues, ¿cómo
00:28:49
se llama el constructor
00:28:51
de la superclase?
00:28:52
Con esta llamada.
00:28:55
Constructor
00:29:11
de la
00:29:11
superclase.
00:29:15
¿Vale?
00:29:20
Super es una llamada
00:29:26
que se usa en los constructores
00:29:27
para llamar al constructor de arriba
00:29:29
y así ahorrar código
00:29:31
aquí. Ya ahorras código. Entonces,
00:29:33
este llama al constructor de arriba. ¿El de arriba
00:29:35
qué hace? Coger nombre y
00:29:37
nif y llevarlo a las propiedades que
00:29:39
están ahí ocultas. Pero esta
00:29:41
me falta. Pues así que tengo que hacer a mano.
00:29:43
¿Vale? Así que tengo que hacer a mano.
00:29:46
¿Eh?
00:29:51
Sí, el error es que ya he quitado el
00:29:53
constructor sin parámetros.
00:29:55
¿Vale? Entonces, lo he
00:29:57
quitado. ¿Vale? Pero podemos añadir
00:29:59
todos los constructores que queramos para no retocar
00:30:01
el main, vamos a añadir un
00:30:03
constructor sin parámetros
00:30:05
public cliente
00:30:06
vale, aquí
00:30:09
tengo mi constructor sin parámetros
00:30:11
si
00:30:12
que lo hemos usado
00:30:14
aquí
00:30:17
vale, pero también hemos usado el sin parámetros
00:30:18
para cliente VIP, pues lo tengo que crear
00:30:21
lo tengo que crear
00:30:23
pues vamos a crear aquí
00:30:25
mi constructor sin parámetros
00:30:26
vale
00:30:33
y ya está
00:30:35
vale, pues recordad esta llamada
00:30:39
porque significa siempre
00:30:52
llamar a la superclase
00:30:54
si yo la llamo sin más, a quien la estoy
00:30:55
llamando es al constructor
00:30:57
¿vale? pero bueno, se puede
00:30:59
usar en otros contextos también, pero por ahora no vamos
00:31:07
a liar
00:31:09
entonces, más o menos
00:31:09
esta es la idea de herencia
00:31:12
sobre la que faltan matices
00:31:15
pero bueno
00:31:17
lo que nos tiene que quedar de herencia
00:31:18
cuidado con la herencia
00:31:23
que es una herramienta
00:31:25
que puede complicar más que otra cosa
00:31:27
¿vale? no se trata de
00:31:30
hacer diseños con jerarquías muy
00:31:31
complejas, muy profundas, no
00:31:33
¿vale?
00:31:35
solamente pues cuando sea necesario
00:31:38
nos ahorre trabajo, solo en ese caso
00:31:39
pero nunca hay diseños
00:31:41
con unos arbolitos ahí de clases
00:31:43
porque eso sería una locura
00:31:45
¿vale? pero sí que nos ahorra
00:31:47
precisamente
00:31:49
el tratar a diferentes objetos que tienen
00:31:51
parte en común, a tratarlos con métodos
00:31:53
separados cada uno de ellos. Eso sí.
00:31:55
¿Vale?
00:31:58
Bueno, pues
00:32:03
bueno, os quedan muchas cosas por ver.
00:32:04
No...
00:32:08
- 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:
- 14 de enero de 2026 - 14:19
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 32′ 09″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 124.69 MBytes