Saltar navegación

20250116 RepasoHerencia_1 - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 16 de enero de 2025 por Raquel G.

23 visualizaciones

Descargar la transcripción

Para los descontextualizados, teníamos esta aplicación que usamos de ejemplo el otro día para volver a revisar los conceptos de herencia que igual el lunes no habían quedado suficientemente claros y esta aplicación de ejemplo, para que la continuemos ahora y no la dejemos a medias, tenía esta arquitectura que hemos dicho, dos tipos de clientes como comparten propiedades como DNI, nombre y conjunto de pedidos, 00:00:00
Hacíamos una única superclase, estándar, y luego ya cliente online a través de esta cláusula, 00:00:30
Stents, se convierte en otra clase, por supuesto, otra clase distinta, 00:00:39
pero al heredar de cliente automáticamente ya establecemos una relación del tipo 00:00:45
un cliente online es un cliente. 00:00:49
Las relaciones de herencia en los lenguajes de información y entrada de objetos 00:00:53
se programan, como veis, de forma muy sencilla 00:00:58
y nos abren un montón de posibilidades 00:01:00
como ya vimos el otro día. 00:01:03
Curiosamente, las relaciones que no se programan 00:01:07
en programación de entradas de objetos 00:01:11
son las relaciones de composición, 00:01:12
como un cliente tiene un producto, 00:01:15
un cliente tiene un nombre, esas no se programan. 00:01:17
Y esas son las que sí se programan en el modelo relacional. 00:01:20
Es decir, están contrapeadas. 00:01:24
El modelo relacional programa de forma muy estricta las claves ajenas de la tabla pedido 00:01:25
Habrá una clave ajena a tabla cliente para saber cuál es el cliente que ha hecho un pedido 00:01:34
Pero eso no se programa aquí 00:01:39
Lo más que se puede hacer es meter en pedido un objeto cliente para saber cuál es su cliente 00:01:42
Y sin embargo las que sí que se programan aquí que son las de herencia 00:01:47
de forma tan sencilla 00:01:50
como con el Stents y que nos abren 00:01:52
todo eso que ya vimos 00:01:54
el otro día, pues en el modelo 00:01:56
relacional no están las relaciones de herencia. 00:01:58
Entonces, claro, porque han sido dos 00:02:00
desarrollos que han ido por libre. ¿Cuál es el problema? 00:02:02
Que las aplicaciones trabajan 00:02:04
con bases de datos aquí. 00:02:06
Entonces hay que poner 00:02:08
un intermediario que los ponga de acuerdo. 00:02:10
Pues de esos intermediarios 00:02:13
es de lo que se trata el módulo de segundo. 00:02:14
¿Vale? Bueno. 00:02:16
Pues 00:02:19
no necesito venderla 00:02:19
ya se vende sola 00:02:23
no me hace falta 00:02:25
bueno pues entonces 00:02:26
poniéndole stands cliente ya sabíamos lo que conseguíamos 00:02:29
que todas las propiedades que había 00:02:31
aquí es como si hubiéramos 00:02:33
hecho un copia y pega aquí 00:02:35
están ahí 00:02:37
en este caso en particular como aquí 00:02:37
están con el private 00:02:41
porque las hemos puesto privadas porque es la 00:02:42
forma habitual de programar 00:02:45
una clase entidad 00:02:47
La forma habitual de programar una clase entidad, recordad que es, pongo las propiedades como privadas, eso significa que no puedo acceder a ellas, escribir, simplemente escribirlas, para acceder a ellas, para leer o sobre escribirlas, en ningún sitio que no sea extra clase, eso es lo que sabemos que significa poner el modificador. 00:02:49
entonces como habrá otras clases 00:03:11
que sí que quieran acceder al DNI de cliente 00:03:14
al nombre de cliente 00:03:17
como habrá otras clases que sí que quieran 00:03:18
y no van a poder por este modificador 00:03:20
por eso hacíamos los GET y los SET 00:03:22
el GET 00:03:25
al ser ya público 00:03:26
sí podrá ser invocado desde otras clases 00:03:27
y el GET me permitirá recuperar 00:03:30
el valor de esta propiedad 00:03:32
y el SET de nuevo 00:03:33
al ser público 00:03:35
podrá ser invocado desde otra clase 00:03:37
y el SET que me permitirá 00:03:39
sobrescribir el valor 00:03:41
de esta propiedad 00:03:44
entonces separo el permiso de lectura 00:03:45
de una propiedad 00:03:48
del permiso de escritura 00:03:49
a través de estos métodos 00:03:50
y aquí prohíbo el acceso 00:03:52
directamente a la propiedad por poner el privado 00:03:55
esto insisto es un convenio 00:03:57
una forma de hacer las clases entidad 00:03:59
¿vale? pero que más o menos todos respetamos 00:04:01
en este caso de la herencia 00:04:04
la implicación que tiene 00:04:06
es que el modificador al ser privado 00:04:07
aunque cliente, que hereda de cliente 00:04:09
tenga aquí, que nosotros 00:04:13
no lo vemos, pero es como si físicamente 00:04:14
tiene aquí esto, la tiene 00:04:16
aunque no la veamos, porque se ha hecho un copia y pega 00:04:18
la tiene ahí, aunque no la veamos 00:04:20
no podemos 00:04:22
escribirla, no podemos usarla 00:04:23
si yo aquí quiero hacer un mostrar datos 00:04:26
que me muestre la propiedad DNI 00:04:28
¿vale? 00:04:30
pues DNI es una propiedad que existe 00:04:33
en esta clase, claro que existe 00:04:36
porque aquí hay un copia y pega invisible 00:04:38
de aquí, claro que existe 00:04:40
pero 00:04:42
al estar puesta como privada 00:04:43
aquí, el compilador 00:04:45
te dice, no, no, no, no, es privada 00:04:48
no puedes ni siquiera escribir 00:04:49
DNI fuera del contexto 00:04:51
por eso aquí 00:04:53
en mostrar datos 00:04:55
yo quería mostrar la propiedad 00:04:56
DNI de cliente tiende, que sé 00:05:00
que la tiene, la tiene y no podía 00:05:01
no puedo, me dice, uy no puedes 00:05:03
claro, no, no pasa 00:05:06
nada, porque si 00:05:07
que tenemos el método get heredado 00:05:09
también, copia y pega aquí 00:05:11
y el método get tiene el modificador 00:05:13
public, entonces 00:05:15
es decir, no tiene privado, con lo 00:05:17
cual claro que puedo usar get dni para 00:05:20
lo mismo, que 00:05:21
es para lo mismo, pues para acceder al 00:05:23
valor de la propiedad, vale 00:05:25
entonces 00:05:27
¿me lo ha cogido? 00:05:29
00:05:32
vale, entonces 00:05:32
cuidado con el modificador 00:05:35
privado, simplemente 00:05:37
Sed conscientes de que al estar aquí privado, en tiempo de desarrollo, en tiempo de escritura de mi código, me encuentro con la restricción de que no puedo acceder desde aquí a una propiedad que tiene él, que es una estupidez, la tiene él, se llama DNI, pues no puedo acceder desde ahí. 00:05:39
Con lo cual tengo que acceder con el get 00:05:59
Que es una situación estúpida 00:06:01
A una propiedad que yo tengo 00:06:03
Que es DNI, cliente online 00:06:05
No puedo acceder desde los métodos, vaya tontería 00:06:07
Pues no puedo 00:06:09
Vale, pues como eso realmente es una tontería 00:06:10
No poder acceder desde tu propia clase 00:06:13
A una propiedad que tienes tú, DNI 00:06:15
Se ha inventado un cuarto 00:06:17
Bueno, tercero 00:06:19
Porque el cuarto que es package 00:06:21
No se escribe, es opcional 00:06:23
Se ha incorporado un cuarto 00:06:24
Modo de acceso 00:06:27
que es el que cuando hablamos de los modos de acceso 00:06:28
lo mencioné y dije que tiene que ver con la herencia 00:06:31
y ya lo veremos 00:06:32
ese, que es el protect, se ha incorporado 00:06:33
entonces para evitar esta tontería 00:06:36
se dice, a ver 00:06:38
yo quiero que DNI y nombre sean privadas 00:06:40
quiero que sean privadas 00:06:43
para seguir satisfaciendo 00:06:44
este convenio de programación 00:06:47
y seguir 00:06:49
prohibiendo el acceso a DNI 00:06:50
de tal forma que les obligo 00:06:52
a acceder a través del GET y del SET 00:06:54
vale, quiero que sean privadas 00:06:56
pero claro, si alguien hereda de mí 00:06:59
se encuentra con esta tontería 00:07:01
al heredar de mí tiene DNI dentro 00:07:03
también, tiene DNI dentro 00:07:05
pero no puede acceder a ella 00:07:07
pues entonces 00:07:08
hay otro modificador que es el 00:07:10
modificador protected 00:07:13
vale 00:07:14
que este modificador significa 00:07:16
solamente puede acceder 00:07:19
a la propiedad 00:07:21
la propia clase cliente, está claro 00:07:22
desde dentro de cliente y también desde las herederas, ¿vale? 00:07:25
La propiedad es accesible o visible, como lo queráis llamar. 00:07:31
Desde la propia clase, bueno, eso por supuesto, claro, como si fuera privada también. 00:07:52
Y también desde las clases herederas. 00:07:58
Y cuando digo clases herederas estoy diciendo subclases. 00:08:06
son sinónimos, subclase es la clase heredera 00:08:12
superclase es la clase 00:08:15
de la creed, vale pues con este 00:08:16
modificador me salto 00:08:18
esa tontería 00:08:20
y ahora ya cliente online 00:08:22
hereda de cliente, tiene DNI dentro 00:08:24
como propiedad aunque yo no la vea pero ya 00:08:26
la puede escribir 00:08:28
la puede escribir si la necesita y no tiene que 00:08:29
tirar del get y el set todo el rato 00:08:32
vale, no está aquí 00:08:34
escrita pero la tiene 00:08:40
y como además aquí está con 00:08:42
protected, puedo yo desde 00:08:44
aquí hacer referencia a ella. La tengo 00:08:46
visible. Está visible ya. 00:08:48
¿Vale? 00:08:51
Entonces, el modificador protected 00:08:53
pues se usa mucho. 00:08:55
¿Puedes poner como disdelay? 00:08:57
¿Puedes poner como que es suya? 00:08:59
Sí, sí, sí, claro. 00:09:01
Claro, claro, es suya. 00:09:03
¿Dónde estamos? 00:09:07
Es su propiedad. Es que hay un copia y pega ahí, 00:09:15
aunque no lo hayamos hecho nosotros. 00:09:18
¿Vale? 00:09:19
La puedo dejar puesta, lo que queráis. 00:09:25
No, normalmente no se pone. 00:09:26
Sí, vale. 00:09:28
Vale, pues entonces este modificador 00:09:30
ya lo incorporamos con un modificador más 00:09:32
que ya no hay más modificadores de acceso. 00:09:34
El private este, que es aquel miembro, 00:09:37
sea propiedad, sea método, 00:09:42
al que hace referencia, 00:09:45
solo es visible, solo se puede acceder 00:09:47
desde la misma clase. 00:09:50
Ese es el privado. 00:09:51
Vale. 00:09:52
Segundo nivel de acceso 00:09:53
La nada 00:09:55
El nivel de acceso la nada 00:09:57
Es el que se llama package 00:10:00
El nivel de acceso la nada 00:10:01
Significa que esta propiedad 00:10:03
O ese método 00:10:05
Que no tiene modificador de acceso 00:10:06
O que tiene el modificador de acceso por defecto 00:10:08
Como lo queráis ver 00:10:10
Es visible desde la misma clase 00:10:11
Y también desde todas las clases 00:10:14
Del mismo paquete 00:10:17
Del mismo paquete 00:10:18
Vale 00:10:19
el siguiente 00:10:21
modificador de acceso que hemos visto, este, ya sabemos 00:10:23
lo que significa, esta propiedad 00:10:26
o ese método 00:10:28
al que modifica 00:10:29
es accesible o visible 00:10:31
desde todas las clases 00:10:34
de todas partes 00:10:36
claro 00:10:37
sí, desde todas partes 00:10:39
sin claro y sin nada 00:10:44
recordad que luego 00:10:45
recordad que esa clase realmente 00:10:47
su nombre, no es solo su nombre, es su nombre más el paquete al que 00:10:50
pertenece, vale, entonces modelo.cliente.dni 00:10:54
se podrá poner en cualquier parte, porque 00:10:58
dni es público, luego modelo.cliente.dni se puede poner 00:11:02
en cualquier sitio, no hay ningún problema de visibilidad, vale 00:11:06
si tengo el public, y recordad que si me quiero ahorrar 00:11:09
todo el rato el poner modelo.cliente, pues pongo 00:11:14
import modelo.cliente 00:11:18
y luego ya abajo 00:11:19
pongo cliente sin más 00:11:21
bueno, esto es 00:11:23
todo lo que 00:11:26
vale 00:11:26
bueno, pues entonces 00:11:30
nuestra aplicación era esta 00:11:38
tenía un diseño de clases con estas entidades 00:11:40
luego tenía un pedido 00:11:42
que como todos los clientes 00:11:43
tienen un conjunto de pedidos 00:11:46
pues por eso esto lo habíamos puesto aquí 00:11:48
vale 00:11:50
pero si el tema de los pedidos funcionara de forma distinta 00:11:51
en cliente online o en cliente tienda 00:11:56
pues entonces a lo mejor la propiedad relativa a los pedidos 00:11:57
habría que poner aquí cada una la suya 00:12:03
pero como todos los clientes después de haber hecho el análisis 00:12:04
y el diseño todos en esta aplicación en concreto 00:12:08
hemos deducido a ver todos me da igual que sean tienda o cliente 00:12:11
todos se caracterizan por tener un array de pedidos 00:12:15
pues como todos se caracterizan por eso 00:12:17
pues lo podemos poner aquí 00:12:19
y luego 00:12:21
el otro día ya hicimos 00:12:25
una serie de funcionalidades 00:12:28
ya en un main 00:12:30
ya en una aplicación concreta 00:12:32
hicimos una serie de funcionalidades 00:12:33
que nos permitieron ver 00:12:34
la flexibilidad 00:12:36
que nos otorga 00:12:38
esta arquitectura de derecho 00:12:40
porque podríamos haber diseñado esta aplicación 00:12:42
de otra manera, podríamos haber dicho 00:12:47
hombre en lugar de hacer una super clase 00:12:48
con lo común y dos clases que hereden 00:12:51
Pues me hago dos clases y ya está, cliente tienda, cliente online, cliente tienda con todo lo suyo, cliente online con todo lo suyo y ya está, es otro diseño distinto, pero entonces no pasaba todo esto que nos hemos encontrado que pasa cuando hicimos esto, ¿vale? 00:12:53
Por ejemplo, vamos a revisar, antes de que hagáis las demás, la funcionalidad de mostrar datos clientes, que es donde vimos la potencia que nos da que la arquitectura sea adherencia en lugar de ser dos clases separadas, que no comparten una superclase. 00:13:11
Vale, pues aquí dijimos 00:13:33
Venga, vamos a hacer la funcionalidad de mostrar datos clientes 00:13:36
Nuestros clientes 00:13:38
Están todos 00:13:41
En un array de clientes 00:13:41
Que hemos ido rellenando con la funcionalidad 00:13:44
La primera cosa 00:13:46
Importantísima 00:13:49
Que nos ha permitido la herencia 00:13:51
Recordad que era 00:13:54
La primera, no lo olvidéis 00:13:55
Que en una referencia cliente 00:13:57
Es decir, una referencia 00:14:00
De la superclase 00:14:01
puedo meter yo ahora objetos cliente, new cliente 00:14:02
u objetos de cualquier superclase, esa es la primera ventaja 00:14:06
es decir, clientes de cero al ser 00:14:10
de tipo cliente puede tener un cliente tienda o un cliente online, me da igual 00:14:14
porque ambos se heredan de cliente, es decir 00:14:18
no tengo que hacer un array para los clientes 00:14:23
online y otro array para los clientes tienda 00:14:28
no tengo por qué hacerlo 00:14:32
puedo hacer un único array 00:14:33
y en ese array, en cada una de las posiciones 00:14:35
al ser de tipo cliente, caben 00:14:38
cliente tienda, cliente online, da igual porque son subclases 00:14:39
esa es la primera cosa 00:14:42
bueno, pues con la funcionalidad 1 00:14:43
insertamos clientes, etc 00:14:46
y ahora nos pusimos a hacer la 2 00:14:47
mostrar datos de cliente 00:14:49
bueno, pues la funcionalidad 2 00:14:52
dijimos, vale 00:14:54
pues para mostrar los datos 00:14:56
de todos los clientes 00:14:58
la funcionalidad era mostrar los datos de todos 00:14:59
pues vamos a hacer un for 00:15:01
que me recorra todos los clientes 00:15:03
bueno, pues como 00:15:06
este for queremos que recorra 00:15:07
todas las posiciones 00:15:10
el for each mucho mejor 00:15:12
porque es más cómodo de escribir 00:15:13
el for each lo único es eso 00:15:15
que nos fuerza a recorrer todas 00:15:18
y solo vale 00:15:19
si yo no cambio la posición 00:15:22
de estos objetos, por supuesto 00:15:24
porque esto es una copia 00:15:25
bueno, pues los voy recorriendo 00:15:26
y decíamos, vamos a ver 00:15:29
yo lo que quiero 00:15:31
es mostrar los datos de cada objeto 00:15:35
cliente, ¿vale? es lo que yo quiero 00:15:37
mostrar los datos 00:15:39
entonces hombre, podría meter aquí un system out 00:15:40
para cada cliente los datos, pero dijimos 00:15:43
bueno hombre, vamos a empezar a hacer las cosas ya con métodos 00:15:45
y modular, ¿vale? pues entonces 00:15:47
yo quiero 00:15:49
que haya un método mostrar clientes 00:15:51
que me muestre los datos del cliente 00:15:53
¿vale? 00:15:55
bueno, una vez que dijimos que 00:15:57
que bien nos vendría un método 00:15:59
mostrar clientes para mostrar los datos del cliente 00:16:01
y no tener que hacer el system out aquí en el main 00:16:04
dijimos vale 00:16:06
ese método donde lo pongo 00:16:08
lo puedo poner 00:16:09
en cliente pero es que cliente 00:16:12
si yo hago un mostrar clientes 00:16:14
solo puede mostrar DNI y nombre 00:16:15
pues se queda cojo 00:16:17
porque cliente online 00:16:20
tiene además un medio de pago 00:16:22
y un email y cliente tienda 00:16:24
tiene además 00:16:26
una dirección postal 00:16:27
con lo cual 00:16:30
el mostrar clientes de aquí 00:16:32
solo podría mostrar 00:16:34
DNI y nombre, luego si lo hago 00:16:36
aquí y lo heredo desde las 00:16:38
demás, se me queda cojo 00:16:40
luego ese no es el sitio de hacer el método 00:16:42
mostrar clientes, tenemos que hacer uno específico 00:16:44
aquí 00:16:46
que muestre 00:16:47
los datos del cliente 00:16:49
online, que lo muestra todo, medio de pago 00:16:52
email, etcétera 00:16:54
y uno específico aquí 00:16:56
que me estaba los datos 00:16:57
del cliente tienda 00:16:59
con su DNI, su nombre y su dirección postal 00:17:00
uno específico en cada clase 00:17:03
porque el heredado de la superclase 00:17:05
no nos vale 00:17:07
vale, bueno, pues entonces ahora ya 00:17:08
una vez hechos esos métodos, continuamos 00:17:11
con nuestro main 00:17:13
y decíamos, vale, ahora 00:17:13
cada método, ahora yo ya 00:17:16
me hago el bucle para mostrar 00:17:18
los clientes y 00:17:23
me encantaría hacer esto 00:17:25
cl. 00:17:26
Vale, entonces en cliente, como aquí no era el sitio de mostrar datos porque solamente puedo mostrar dos, pues aquí no lo hacía. Ahí no, sí, sí, sí, pero bueno, como estoy para los rezagados. Vale, entonces ahí no lo hacía porque ese no me vale para nada. El de cliente no me vale para nada porque se queda a medias. Solo muestra ADN y nombre, se queda a medias. Ese no me vale. 00:17:31
entonces para qué lo voy a poner 00:17:54
si luego 00:17:56
el cliente online 00:17:58
lo va a heredar mal 00:18:01
porque el cliente online tiene más datos 00:18:02
y el cliente tiene también, para qué lo voy a poner 00:18:04
no me interesa este método que luego lo hereden 00:18:06
entonces no hacíamos el método 00:18:08
y aquí ya hacíamos 00:18:10
uno específico 00:18:12
para cada clase, uno bueno 00:18:14
aquí el suyo y aquí el suyo 00:18:16
como son distintos, uno en cada clase 00:18:18
no hay tutía 00:18:20
vale, entonces ahora nos íbamos al main 00:18:21
y decía, pues venga, vamos a mostrarlos para cada cliente de mi array, 00:18:24
mostrar los datos. 00:18:32
Pero claro, el compilador me dice, uy, el compilador, 00:18:34
recordad que esto era lo más importante de la herencia, 00:18:38
el compilador mira reglas de sintaxis, reglas sintácticas, 00:18:42
no mira si esto tiene sentido o no. 00:18:46
Esto sentido tiene todo el del mundo, porque CL, 00:18:49
aunque está declarado como cliente, 00:18:52
CL es o cliente tienda o cliente online. 00:18:54
Eso ya lo sabemos, cuando se ha instanciado, se ha instanciado como cliente online o cliente tienda, lo tenemos claro. 00:18:57
Luego, esto sentido tiene, llamar a mostrar datos, pero el compilador solamente mira reglas sintácticas y dice, oye, CL está declarado como cliente, voy a ver si en cliente hay un mostrar datos, porque si no lo hay, no te dejo ejecutarlo, no te dejo escribirlo. 00:19:03
el compilador se va a la clase 00:19:20
a la cual está declarada cliente 00:19:24
y dice, uy en cliente 00:19:26
no hay ningún mostrar datos, lo siento 00:19:28
no te dejo escribir 00:19:30
mostrar datos, no te dejo 00:19:32
escribirlo 00:19:33
porque mis reglas sintácticas 00:19:34
dicen que si CL 00:19:38
está declarado como clase cliente 00:19:40
tú solamente puedes llamar a métodos que 00:19:42
estén en cliente 00:19:43
y en cliente no lo tienes 00:19:45
pues aquí nos hemos quedado atascados 00:19:46
¿Vale? Es en lo que nos quedamos el otro día 00:19:49
Y todo porque 00:19:51
El compilador sigue una regla sintáctica 00:19:52
Muy restrictiva 00:19:55
Pero claro, esto decíamos 00:19:56
Esto no tiene sentido, pero si en el 00:19:59
Objeto cliente 00:20:01
Que se ha creado con el 00:20:02
New como cliente tienda o cliente online 00:20:05
Sí que está el método 00:20:06
Pues vamos a 00:20:07
A callar al compilador dejándole 00:20:10
Tranquilo y diciéndole, vamos a ver 00:20:12
A ti lo que te pasa 00:20:14
Para dejarme ya en paz y dejar de poner 00:20:16
eso rojo, es que necesitas 00:20:18
que exista un método 00:20:21
mostrar datos en la clase 00:20:22
cliente, porque 00:20:24
yo estoy declarado como cliente, aunque 00:20:26
luego esté creado, instanciado con el 00:20:28
new como tienda online 00:20:30
es lo que necesitas 00:20:32
ver que hay un método mostrar datos ahí en la clase 00:20:34
cliente, pues yo te doy 00:20:36
un método mostrar datos, ala 00:20:38
este mismo, que no me 00:20:40
vale para nada y no me interesa 00:20:42
porque no muestra las propiedades del objeto 00:20:44
total 00:20:47
si, podríamos dejarlo vacío 00:20:48
sería el siguiente paso 00:20:52
pues yo te pongo ahí un método 00:20:54
como si pongo bla bla bla jejeje 00:20:58
como si te pongo ahí 00:21:00
pesado, voy a hacer este método porque eres 00:21:02
un pesado, compilador 00:21:04
como si pongo lo que me dé la gana 00:21:06
pero bueno, ya que nos ponemos a hacerlo 00:21:07
hemos puesto esto, porque oye, quien sabe 00:21:10
a lo mejor en esta aplicación pueden llegar a existir 00:21:11
objetos clientes sin más 00:21:14
porque esto es una clase más, cliente 00:21:16
pues a lo mejor yo instancio un objeto cliente 00:21:18
sin más que tiene DNI nombre 00:21:20
pues a lo mejor ese objeto cliente 00:21:22
quiere llamar a su mostrar datos 00:21:24
bueno, pues venga, me hago un método 00:21:25
mostrar datos 00:21:28
y ya el compilador se calla 00:21:29
y dice, uy que bien 00:21:32
el objeto CL 00:21:34
que está declarado como cliente 00:21:35
yo me voy a la clase a la que pertenece 00:21:38
y tiene un mostrar datos, ya se queda callado 00:21:40
vale 00:21:42
se queda callado 00:21:44
esto lo vamos a seguir dejándolo comentado 00:21:45
esto ya lo he escrito arriba 00:21:49
lo quito de aquí, se queda callado 00:21:52
y ahora es cuando me diríais 00:21:54
vosotros, si no fuera 00:21:56
porque ya lo sabéis, me diríais 00:21:58
ya claro, pero es que no queremos 00:22:00
llamar a mostrar datos de la clase cliente 00:22:02
queremos llamar 00:22:04
a mostrar datos de cliente 00:22:06
online cuando sea cliente online 00:22:08
y queremos llamar a mostrar 00:22:10
datos de cliente tienda cuando sea cliente 00:22:12
tienda, que son los buenos 00:22:14
claro, estupendo, pero es que eso ya lo hace 00:22:15
la máquina virtual por nosotros 00:22:18
entonces 00:22:20
importante que distingamos 00:22:21
tiempo de escritura de código, tiempo de desarrollo 00:22:24
cuando el desarrollador está haciendo su 00:22:27
aplicación en la cual tiene que 00:22:28
por supuesto dedicar mucho tiempo a su diseño 00:22:30
qué clases hace 00:22:33
qué entidades, qué relaciones 00:22:34
hace entre ellas, qué propiedades tiene cada una 00:22:36
si tiene una estructura de herencia o no 00:22:39
que tenga sentido 00:22:41
crear los métodos 00:22:41
y ahí en ese tiempo de desarrollo 00:22:44
es que tienes que cumplir las reglas 00:22:46
aunque Java te ponga mil y muchas 00:22:48
pues hay que cumplirlas todas 00:22:51
¿vale? porque si no el compilador 00:22:52
te dice no, esto no compila 00:22:54
no te hago un punto class 00:22:57
con lo cual no puedes ejecutar 00:22:59
ya hemos cumplido todas las reglas 00:23:00
el compilador ya se ha callado 00:23:03
y ya nuestra aplicación asumimos que está bien 00:23:04
saltamos al tiempo de ejecución 00:23:07
que es el tiempo en el cual yo ya 00:23:10
lanzo la aplicación para que se ejecute 00:23:13
para la cual tiene que haber 00:23:16
un main, obviamente 00:23:18
tiene que haber un main 00:23:18
porque el punto de arranque de cualquier aplicación 00:23:21
Java de escritorio, no web 00:23:23
ni nada de eso, es un main 00:23:25
vale, tiene que haber un main 00:23:28
bueno, pues ese main 00:23:29
arranca ya en tiempo de ejecución 00:23:32
la máquina virtual lo arranca y empiezan 00:23:34
a funcionar, a pasar cosas 00:23:36
¿y qué es lo que empieza a pasar? 00:23:37
pues que empiezan a instanciarse objetos 00:23:39
aquí cada vez que le demos a insertar 00:23:41
cliente pues se empezarán a 00:23:43
instanciar objetos, aquí un new 00:23:45
cliente tienda, cuando yo creo un cliente 00:23:47
tienda, cuando creo 00:23:49
un cliente online llamando a este método 00:23:51
pues se instanzaría un cliente online 00:23:53
eso es lo que empieza a pasar 00:23:55
en tiempo de ejecución, que empezamos a dar 00:23:57
opciones, se empiezan a hacer 00:23:59
los news, news, news, se empiezan a ejecutar, se empiezan 00:24:01
a aparecer objetos 00:24:03
en memoria RAM están ahí esos objetos 00:24:04
cada uno perfectamente identificado 00:24:07
si es cliente online, si es cliente tienda, si es cliente pepito 00:24:09
vale, pues ahora en tiempo de ejecución 00:24:12
le damos a la opción 2, ya en tiempo de ejecución 00:24:15
no desarrollando, ya hay un tío ahí dándole las opciones 00:24:18
y en tiempo de ejecución la máquina virtual se encuentra 00:24:20
con el problema de que para cada uno de los objetos 00:24:24
de la raíz real que ya existe, que está en memoria de la raíz real 00:24:27
que ya existe, tiene que demostrar datos 00:24:30
bueno, pues la máquina virtual, dijimos, a la máquina virtual 00:24:32
le da exactamente igual 00:24:36
como esté declarado este objeto 00:24:38
si está declarado como cliente 00:24:40
está declarado como Juanito y está declarado como Pepito 00:24:42
le da igual, eso solo le importó 00:24:44
al compilador que es el que nos 00:24:46
dictó las reglas 00:24:49
a la máquina virtual que ahora 00:24:49
tiene que ejecutar el método, que es la que tiene que hacer 00:24:52
ya el trabajo de ejecutar el método, a la máquina virtual 00:24:54
solo le interesa 00:24:57
ir a la memoria RAM a ver este objeto 00:24:58
como se creó, si se creó con 00:25:01
new cliente tienda, se creó con new client 00:25:03
es lo único que le importa, esto le da igual 00:25:04
vale, pues la máquina virtual dirá 00:25:07
a ver CL, me voy a la RAM 00:25:09
CL, tú que eres, eres un cliente online 00:25:11
vale, pues entonces 00:25:13
llamo al mostrar datos del cliente 00:25:15
online 00:25:18
que es el bueno 00:25:18
que no 00:25:20
que yo me voy a la RAM 00:25:23
y veo que el objeto CL 00:25:25
se ha creado en RAM 00:25:27
como cliente tienda 00:25:29
cuando el usuario dio a dos y lo creó 00:25:30
bueno, pues entonces llamo al mostrar 00:25:33
datos de cliente tienda 00:25:35
que es el bueno 00:25:37
el que tiene todas las propiedades 00:25:39
y entonces esto ya está 00:25:41
funciona perfectamente 00:25:43
bueno pues 00:25:44
esto era la segunda 00:25:46
potencia 00:25:50
fundamental de la herencia 00:25:51
la primera repito 00:25:53
poder guardar en una referencia 00:25:55
de una clase objetos 00:25:57
no solo de esa clase 00:25:59
sino de las herederas 00:26:01
eso facilita mucho la escritura del código 00:26:02
me permite arrays únicos para objetos de diferente tipo, etc. 00:26:05
Y la segunda, esto que acabamos de decir, 00:26:10
que era lo que se llamaba, lo que se llama polimorfismo. 00:26:14
La segunda es el polimorfismo, que es, 00:26:18
oye, mostrar datos, este de aquí no es un solo método, 00:26:21
son muchos, tiene muchas formas, 00:26:26
de ahí lo de polimorfismo, son muchos. 00:26:30
¿Cuáles son? Pues depende. 00:26:32
si CL está instanciado como cliente 00:26:34
online, mostrar datos 00:26:37
será el mostrar datos de cliente online 00:26:38
si CL está instanciado como cliente 00:26:40
tienda, mostrar datos 00:26:43
será el 00:26:44
la versión de cliente tienda 00:26:45
si CL está instanciado como cliente 00:26:48
que podría ser mostrar 00:26:51
datos, será 00:26:52
el mostrar datos de cliente 00:26:54
luego mostrar datos 00:26:56
tiene una única llamada, único nombre 00:26:58
y muchas versiones, tiene esta 00:27:01
versión, tiene esta 00:27:03
otra, tiene esta 00:27:05
tiene muchas 00:27:07
en toda la arquitectura de las clases, subclases 00:27:08
superclases, en cada una tiene su versión 00:27:11
tiene un montón de formas 00:27:13
en cada clase tiene una 00:27:14
la llamada es única 00:27:16
para los objetos de clase cliente 00:27:18
¿qué versión se llama? 00:27:21
depende de cómo esté instanciado 00:27:22
¿vale? 00:27:24
pues este es el polimorfismo 00:27:27
y el polimorfismo nos ha 00:27:28
simplificado la vida 00:27:31
porque yo me cojo 00:27:31
todos los clientes 00:27:33
me olvido de qué tipo son 00:27:34
me despreocupo 00:27:37
y llama a mostrar datos 00:27:39
y me despreocupo de todo 00:27:43
y sé que mostrar datos 00:27:44
estará llamando al que toca 00:27:46
a uno o a otro 00:27:47
yo no lo sé y me da igual 00:27:48
lo sabe la aplicación 00:27:53
la aplicación sabe a cuál tiene que llamar 00:27:54
que será al que corresponda 00:27:57
al objeto que está instanciado 00:28:00
aquí, entonces 00:28:01
tu tarea como desarrollador 00:28:03
no es decir todo lo que va a pasar en tiempo 00:28:05
de ejecución, porque eso depende de cada ejecución 00:28:07
tu tarea como 00:28:10
desarrollador es hacer un código 00:28:11
que haga 00:28:13
lo que te piden, y aquí lo que te piden 00:28:15
que es, meter un montón de clientes 00:28:17
del tipo que sea 00:28:20
que tú en tiempo de desarrollo no sabes que tipo es 00:28:21
en una ejecución puede que te metan todos de tienda 00:28:23
en otra puede que te metan todos de online 00:28:25
tu tarea es 00:28:27
garantizar que en cualquier circunstancia 00:28:29
esto va a funcionar bien 00:28:32
bueno, pues esto funciona bien con estas dos líneas 00:28:33
aquí cabe 00:28:35
cualquier tipo de objeto cliente 00:28:37
y subclase, cualquiera, en cada ejecución 00:28:39
irán unos, irán otros, da igual, ahí caben 00:28:41
todos, y además tú como 00:28:43
desarrollador solo con esta única 00:28:45
línea, sabes 00:28:47
que da igual los objetos que hay ahí, ya la máquina 00:28:49
virtual va a llamar a la versión buena 00:28:51
tú como desarrollador 00:28:53
ya has escrito lo que tenías que escribir 00:28:55
para que funcione para cualquier tipo 00:28:57
de objeto, y ya está 00:28:59
tú no puedes saber qué tipo 00:29:01
de objeto hay ahí, depende de la ejecución 00:29:03
¿vale? 00:29:05
entonces, esto era el polimorfismo 00:29:08
que nos permite escribir en 00:29:09
esta única línea 00:29:11
todo lo que si no tendríamos que 00:29:12
haber hecho de esta otra forma que está comentada 00:29:15
de aquí 00:29:17
¿vale? esta forma 00:29:18
que es la que hubiéramos tenido que usar si no hubiera 00:29:25
polimorfismo es 00:29:27
a ver, voy a distinguir CL 00:29:28
de qué tipo es 00:29:31
para eso teníamos este operador 00:29:32
que incorporábamos como nuevo 00:29:35
que nos permite distinguir un objeto 00:29:37
como se ha instanciado 00:29:39
no como se ha declarado 00:29:41
vale, que te has instanciado como cliente 00:29:42
tienda, te voy a convertir 00:29:45
en cliente tienda con un casting 00:29:47
casting que no me va a dar ningún problema 00:29:49
porque es que sé que es cliente tienda 00:29:51
luego puedo convertir algo en 00:29:53
una cosa que es sin transformarla 00:29:55
y ya está, y una vez que te he 00:29:58
convertido, ya llamo a tu método, 00:30:01
llamo a lo que sea. En este caso se vería mejor 00:30:03
si llamamos a mostrar 00:30:05
datos. Vale, 00:30:07
llamo ya a la versión de mostrar datos 00:30:09
de cliente tienda, porque 00:30:11
te he hecho el casting, porque he verificado previamente 00:30:13
que eres tipo tienda. ¿Que no? 00:30:15
¿Que eres cliente online? Pues te hago el casting 00:30:17
a cliente online 00:30:19
y llamo a tu versión 00:30:21
de mostrar datos de cliente online. 00:30:23
Bueno, pues todo este 00:30:26
rollo no es necesario 00:30:27
porque esto ya lo hace la máquina virtual 00:30:29
por nosotros 00:30:31
la máquina virtual ya dice 00:30:32
oye tú que eres cliente tienda 00:30:34
pues te hago el casting y llamo a tu versión 00:30:36
tú que eres cliente online 00:30:38
pues te hago el casting y llamo a tu versión 00:30:40
ya lo hace todo ahí 00:30:42
en esa única línea 00:30:44
luego nos ahorramos todo esto 00:30:45
vale 00:30:48
pues claro, claro, claro 00:30:53
esto es más o menos 00:30:56
lo que de herencia 00:31:01
tenemos que tener claro hasta ahora 00:31:03
vale 00:31:05
entonces ya que estábamos con esta aplicación 00:31:06
pues ya la usamos para dejar 00:31:08
alguna otra funcionalidad 00:31:10
para hacer, como la 3, la 4 y la 5 00:31:12
agregar pedido a un cliente 00:31:14
decidiendo donde podemos poner ese método 00:31:17
mostrar al cliente que más 00:31:18
haga hasta ahí de qué tipo es 00:31:19
y fijar descuento clientes online 00:31:22
a ver, la funcionalidad 5 00:31:24
la podemos hacer ahora mismo 00:31:27
antes de que hagáis vosotros 00:31:28
si es que no la habéis hecho, la 3 y la 4 00:31:30
que la hagáis ahora en un ratito 00:31:32
dijimos esta aplicación 00:31:33
para ampliarla un pelín más 00:31:36
o algo así 00:31:39
y para distinguir clientes online de tienda 00:31:39
el que nos pidió 00:31:43
esta aplicación nos dijo 00:31:49
a ver, cuidado que te incorporo 00:31:50
una característica más 00:31:52
así que amplíame la aplicación 00:31:54
te incorporo 00:31:56
que a los clientes online les voy a hacer un descuento 00:31:57
entonces nosotros como desarrollo decimos 00:32:00
a ver, esta incorporación, ¿qué hago? 00:32:01
¿en qué se traduce? ¿qué es un descuento? 00:32:03
un valor, una propiedad 00:32:05
vale, ¿dónde la coloco? 00:32:07
es relacionada con clientes online 00:32:09
porque es el descuento para clientes online 00:32:11
vale, pues la coloco aquí 00:32:13
¿es diferente para cada cliente? 00:32:14
podría serlo si el 00:32:17
que me pide la aplicación 00:32:19
me lo dijera, cada cliente va a tener un descuento distinto 00:32:21
que tú le metes en función de su nombre 00:32:23
o lo que sea 00:32:25
yo qué sé, porque iba a decir en función de su género 00:32:26
pero me parecía un poco 00:32:29
pues de su nombre 00:32:30
pero no, el mismo para todos 00:32:32
bueno, pues me hice el mismo para todos 00:32:35
pues ya me la he caracterizado del todo 00:32:37
la pongo como estática dentro de cliente online 00:32:39
y ya está 00:32:42
luego la funcionalidad de fijar descuento 00:32:42
clientes online, la 5, es que es una línea 00:32:46
que 00:32:48
la podemos poner aquí rápidamente 00:32:49
antes de que hagáis las demás 00:32:53
que le diríamos, venga pues dinos el descuento 00:32:54
descuento que quieres 00:32:57
y aquí ya hacíamos 00:33:04
cliente 00:33:06
online 00:33:09
line punto descuento igual a lo que me hayan pedido entero y me falta el break porque si no 00:33:10
me va a decir adiós venga la 5 ya está es fijar el descuento como es una variable estática la 00:33:22
llamó desde la clase las variables estática también por convenio pues como no son propiedades 00:33:34
de los objetos no se incorporan los get y set los get y set son para leer y fijar propiedades 00:33:40
los objetos, estas tienen otra 00:33:45
interpretación, pues entonces no se 00:33:47
incorporan los getises, se ponen como public 00:33:49
y se llaman directamente para la clase 00:33:51
y todo más bonito y más fácil, de nuevo 00:33:53
un convenio, claro 00:33:55
vale, pues la 5 ya estaría 00:33:56
pues a ver la 00:33:58
3 y la 4 00:34:00
¿la habéis hecho? 00:34:03
no, pues hacedlas 00:34:05
venga, ya mímico 00:34:07
un minuto y medio 00:34:09
no, venga, dos y medio, no, un poquito más 00:34:10
porque 00:34:13
Gracias. 00:34:14
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:
23
Fecha:
16 de enero de 2025 - 17:01
Visibilidad:
Clave
Centro:
IES ROSA CHACEL
Duración:
34′ 16″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
152.55 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid