1 00:00:00,000 --> 00:00:29,440 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, 2 00:00:30,000 --> 00:00:38,880 Hacíamos una única superclase, estándar, y luego ya cliente online a través de esta cláusula, 3 00:00:39,039 --> 00:00:44,420 Stents, se convierte en otra clase, por supuesto, otra clase distinta, 4 00:00:45,179 --> 00:00:49,659 pero al heredar de cliente automáticamente ya establecemos una relación del tipo 5 00:00:49,659 --> 00:00:52,659 un cliente online es un cliente. 6 00:00:53,460 --> 00:00:58,700 Las relaciones de herencia en los lenguajes de información y entrada de objetos 7 00:00:58,700 --> 00:01:00,859 se programan, como veis, de forma muy sencilla 8 00:01:00,859 --> 00:01:03,899 y nos abren un montón de posibilidades 9 00:01:03,899 --> 00:01:05,260 como ya vimos el otro día. 10 00:01:07,099 --> 00:01:11,019 Curiosamente, las relaciones que no se programan 11 00:01:11,019 --> 00:01:12,519 en programación de entradas de objetos 12 00:01:12,519 --> 00:01:15,219 son las relaciones de composición, 13 00:01:15,359 --> 00:01:17,579 como un cliente tiene un producto, 14 00:01:17,900 --> 00:01:20,459 un cliente tiene un nombre, esas no se programan. 15 00:01:20,659 --> 00:01:23,219 Y esas son las que sí se programan en el modelo relacional. 16 00:01:24,019 --> 00:01:25,579 Es decir, están contrapeadas. 17 00:01:25,579 --> 00:01:34,900 El modelo relacional programa de forma muy estricta las claves ajenas de la tabla pedido 18 00:01:34,900 --> 00:01:39,859 Habrá una clave ajena a tabla cliente para saber cuál es el cliente que ha hecho un pedido 19 00:01:39,859 --> 00:01:42,060 Pero eso no se programa aquí 20 00:01:42,060 --> 00:01:47,359 Lo más que se puede hacer es meter en pedido un objeto cliente para saber cuál es su cliente 21 00:01:47,359 --> 00:01:50,620 Y sin embargo las que sí que se programan aquí que son las de herencia 22 00:01:50,620 --> 00:01:52,420 de forma tan sencilla 23 00:01:52,420 --> 00:01:54,319 como con el Stents y que nos abren 24 00:01:54,319 --> 00:01:56,359 todo eso que ya vimos 25 00:01:56,359 --> 00:01:58,280 el otro día, pues en el modelo 26 00:01:58,280 --> 00:02:00,200 relacional no están las relaciones de herencia. 27 00:02:00,379 --> 00:02:02,140 Entonces, claro, porque han sido dos 28 00:02:02,140 --> 00:02:04,420 desarrollos que han ido por libre. ¿Cuál es el problema? 29 00:02:04,980 --> 00:02:06,379 Que las aplicaciones trabajan 30 00:02:06,379 --> 00:02:07,500 con bases de datos aquí. 31 00:02:08,379 --> 00:02:10,199 Entonces hay que poner 32 00:02:10,199 --> 00:02:12,120 un intermediario que los ponga de acuerdo. 33 00:02:13,120 --> 00:02:14,520 Pues de esos intermediarios 34 00:02:14,520 --> 00:02:16,400 es de lo que se trata el módulo de segundo. 35 00:02:16,960 --> 00:02:18,319 ¿Vale? Bueno. 36 00:02:19,300 --> 00:02:19,780 Pues 37 00:02:19,780 --> 00:02:23,860 no necesito venderla 38 00:02:23,860 --> 00:02:25,360 ya se vende sola 39 00:02:25,360 --> 00:02:26,520 no me hace falta 40 00:02:26,520 --> 00:02:29,460 bueno pues entonces 41 00:02:29,460 --> 00:02:31,960 poniéndole stands cliente ya sabíamos lo que conseguíamos 42 00:02:31,960 --> 00:02:33,719 que todas las propiedades que había 43 00:02:33,719 --> 00:02:35,520 aquí es como si hubiéramos 44 00:02:35,520 --> 00:02:37,060 hecho un copia y pega aquí 45 00:02:37,060 --> 00:02:37,800 están ahí 46 00:02:37,800 --> 00:02:41,379 en este caso en particular como aquí 47 00:02:41,379 --> 00:02:42,439 están con el private 48 00:02:42,439 --> 00:02:45,419 porque las hemos puesto privadas porque es la 49 00:02:45,419 --> 00:02:47,060 forma habitual de programar 50 00:02:47,060 --> 00:02:49,099 una clase entidad 51 00:02:49,099 --> 00:03:11,580 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. 52 00:03:11,580 --> 00:03:14,580 entonces como habrá otras clases 53 00:03:14,580 --> 00:03:17,199 que sí que quieran acceder al DNI de cliente 54 00:03:17,199 --> 00:03:18,400 al nombre de cliente 55 00:03:18,400 --> 00:03:20,219 como habrá otras clases que sí que quieran 56 00:03:20,219 --> 00:03:22,740 y no van a poder por este modificador 57 00:03:22,740 --> 00:03:25,060 por eso hacíamos los GET y los SET 58 00:03:25,060 --> 00:03:26,280 el GET 59 00:03:26,280 --> 00:03:27,780 al ser ya público 60 00:03:27,780 --> 00:03:30,139 sí podrá ser invocado desde otras clases 61 00:03:30,139 --> 00:03:32,199 y el GET me permitirá recuperar 62 00:03:32,199 --> 00:03:33,520 el valor de esta propiedad 63 00:03:33,520 --> 00:03:35,840 y el SET de nuevo 64 00:03:35,840 --> 00:03:37,139 al ser público 65 00:03:37,139 --> 00:03:39,780 podrá ser invocado desde otra clase 66 00:03:39,780 --> 00:03:41,460 y el SET que me permitirá 67 00:03:41,460 --> 00:03:44,060 sobrescribir el valor 68 00:03:44,060 --> 00:03:45,639 de esta propiedad 69 00:03:45,639 --> 00:03:48,439 entonces separo el permiso de lectura 70 00:03:48,439 --> 00:03:49,240 de una propiedad 71 00:03:49,240 --> 00:03:50,939 del permiso de escritura 72 00:03:50,939 --> 00:03:52,539 a través de estos métodos 73 00:03:52,539 --> 00:03:55,500 y aquí prohíbo el acceso 74 00:03:55,500 --> 00:03:57,759 directamente a la propiedad por poner el privado 75 00:03:57,759 --> 00:03:59,860 esto insisto es un convenio 76 00:03:59,860 --> 00:04:01,800 una forma de hacer las clases entidad 77 00:04:01,800 --> 00:04:04,379 ¿vale? pero que más o menos todos respetamos 78 00:04:04,379 --> 00:04:06,139 en este caso de la herencia 79 00:04:06,139 --> 00:04:07,919 la implicación que tiene 80 00:04:07,919 --> 00:04:09,960 es que el modificador al ser privado 81 00:04:09,960 --> 00:04:13,060 aunque cliente, que hereda de cliente 82 00:04:13,060 --> 00:04:14,699 tenga aquí, que nosotros 83 00:04:14,699 --> 00:04:16,680 no lo vemos, pero es como si físicamente 84 00:04:16,680 --> 00:04:18,519 tiene aquí esto, la tiene 85 00:04:18,519 --> 00:04:20,560 aunque no la veamos, porque se ha hecho un copia y pega 86 00:04:20,560 --> 00:04:22,620 la tiene ahí, aunque no la veamos 87 00:04:22,620 --> 00:04:23,920 no podemos 88 00:04:23,920 --> 00:04:26,620 escribirla, no podemos usarla 89 00:04:26,620 --> 00:04:28,360 si yo aquí quiero hacer un mostrar datos 90 00:04:28,360 --> 00:04:30,779 que me muestre la propiedad DNI 91 00:04:30,779 --> 00:04:33,220 ¿vale? 92 00:04:33,860 --> 00:04:36,360 pues DNI es una propiedad que existe 93 00:04:36,360 --> 00:04:38,000 en esta clase, claro que existe 94 00:04:38,000 --> 00:04:40,040 porque aquí hay un copia y pega invisible 95 00:04:40,040 --> 00:04:42,160 de aquí, claro que existe 96 00:04:42,160 --> 00:04:43,220 pero 97 00:04:43,220 --> 00:04:45,920 al estar puesta como privada 98 00:04:45,920 --> 00:04:48,120 aquí, el compilador 99 00:04:48,120 --> 00:04:49,860 te dice, no, no, no, no, es privada 100 00:04:49,860 --> 00:04:51,800 no puedes ni siquiera escribir 101 00:04:51,800 --> 00:04:53,939 DNI fuera del contexto 102 00:04:53,939 --> 00:04:55,959 por eso aquí 103 00:04:55,959 --> 00:04:56,980 en mostrar datos 104 00:04:56,980 --> 00:05:00,160 yo quería mostrar la propiedad 105 00:05:00,160 --> 00:05:01,920 DNI de cliente tiende, que sé 106 00:05:01,920 --> 00:05:03,720 que la tiene, la tiene y no podía 107 00:05:03,720 --> 00:05:06,079 no puedo, me dice, uy no puedes 108 00:05:06,079 --> 00:05:07,899 claro, no, no pasa 109 00:05:07,899 --> 00:05:09,899 nada, porque si 110 00:05:09,899 --> 00:05:11,939 que tenemos el método get heredado 111 00:05:11,939 --> 00:05:13,439 también, copia y pega aquí 112 00:05:13,439 --> 00:05:15,959 y el método get tiene el modificador 113 00:05:15,959 --> 00:05:17,779 public, entonces 114 00:05:17,779 --> 00:05:20,060 es decir, no tiene privado, con lo 115 00:05:20,060 --> 00:05:21,939 cual claro que puedo usar get dni para 116 00:05:21,939 --> 00:05:23,980 lo mismo, que 117 00:05:23,980 --> 00:05:25,879 es para lo mismo, pues para acceder al 118 00:05:25,879 --> 00:05:27,439 valor de la propiedad, vale 119 00:05:27,439 --> 00:05:29,480 entonces 120 00:05:29,480 --> 00:05:31,279 ¿me lo ha cogido? 121 00:05:32,540 --> 00:05:32,920 sí 122 00:05:32,920 --> 00:05:35,319 vale, entonces 123 00:05:35,319 --> 00:05:37,879 cuidado con el modificador 124 00:05:37,879 --> 00:05:39,759 privado, simplemente 125 00:05:39,759 --> 00:05:59,339 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í. 126 00:05:59,339 --> 00:06:01,360 Con lo cual tengo que acceder con el get 127 00:06:01,360 --> 00:06:03,800 Que es una situación estúpida 128 00:06:03,800 --> 00:06:05,639 A una propiedad que yo tengo 129 00:06:05,639 --> 00:06:07,220 Que es DNI, cliente online 130 00:06:07,220 --> 00:06:09,519 No puedo acceder desde los métodos, vaya tontería 131 00:06:09,519 --> 00:06:10,420 Pues no puedo 132 00:06:10,420 --> 00:06:13,360 Vale, pues como eso realmente es una tontería 133 00:06:13,360 --> 00:06:15,620 No poder acceder desde tu propia clase 134 00:06:15,620 --> 00:06:17,399 A una propiedad que tienes tú, DNI 135 00:06:17,399 --> 00:06:19,720 Se ha inventado un cuarto 136 00:06:19,720 --> 00:06:21,399 Bueno, tercero 137 00:06:21,399 --> 00:06:23,399 Porque el cuarto que es package 138 00:06:23,399 --> 00:06:24,439 No se escribe, es opcional 139 00:06:24,439 --> 00:06:27,040 Se ha incorporado un cuarto 140 00:06:27,040 --> 00:06:28,519 Modo de acceso 141 00:06:28,519 --> 00:06:31,000 que es el que cuando hablamos de los modos de acceso 142 00:06:31,000 --> 00:06:32,660 lo mencioné y dije que tiene que ver con la herencia 143 00:06:32,660 --> 00:06:33,180 y ya lo veremos 144 00:06:33,180 --> 00:06:36,680 ese, que es el protect, se ha incorporado 145 00:06:36,680 --> 00:06:38,399 entonces para evitar esta tontería 146 00:06:38,399 --> 00:06:40,000 se dice, a ver 147 00:06:40,000 --> 00:06:43,160 yo quiero que DNI y nombre sean privadas 148 00:06:43,160 --> 00:06:44,360 quiero que sean privadas 149 00:06:44,360 --> 00:06:47,279 para seguir satisfaciendo 150 00:06:47,279 --> 00:06:49,060 este convenio de programación 151 00:06:49,060 --> 00:06:50,199 y seguir 152 00:06:50,199 --> 00:06:52,639 prohibiendo el acceso a DNI 153 00:06:52,639 --> 00:06:54,519 de tal forma que les obligo 154 00:06:54,519 --> 00:06:56,800 a acceder a través del GET y del SET 155 00:06:56,800 --> 00:06:59,060 vale, quiero que sean privadas 156 00:06:59,060 --> 00:07:01,459 pero claro, si alguien hereda de mí 157 00:07:01,459 --> 00:07:03,100 se encuentra con esta tontería 158 00:07:03,100 --> 00:07:05,560 al heredar de mí tiene DNI dentro 159 00:07:05,560 --> 00:07:07,160 también, tiene DNI dentro 160 00:07:07,160 --> 00:07:08,519 pero no puede acceder a ella 161 00:07:08,519 --> 00:07:10,079 pues entonces 162 00:07:10,079 --> 00:07:13,199 hay otro modificador que es el 163 00:07:13,199 --> 00:07:14,959 modificador protected 164 00:07:14,959 --> 00:07:16,300 vale 165 00:07:16,300 --> 00:07:19,040 que este modificador significa 166 00:07:19,040 --> 00:07:21,620 solamente puede acceder 167 00:07:21,620 --> 00:07:22,420 a la propiedad 168 00:07:22,420 --> 00:07:25,259 la propia clase cliente, está claro 169 00:07:25,259 --> 00:07:31,019 desde dentro de cliente y también desde las herederas, ¿vale? 170 00:07:31,519 --> 00:07:51,550 La propiedad es accesible o visible, como lo queráis llamar. 171 00:07:52,670 --> 00:07:57,370 Desde la propia clase, bueno, eso por supuesto, claro, como si fuera privada también. 172 00:07:58,670 --> 00:08:06,310 Y también desde las clases herederas. 173 00:08:06,310 --> 00:08:11,430 Y cuando digo clases herederas estoy diciendo subclases. 174 00:08:12,029 --> 00:08:15,009 son sinónimos, subclase es la clase heredera 175 00:08:15,009 --> 00:08:16,769 superclase es la clase 176 00:08:16,769 --> 00:08:18,629 de la creed, vale pues con este 177 00:08:18,629 --> 00:08:20,350 modificador me salto 178 00:08:20,350 --> 00:08:22,029 esa tontería 179 00:08:22,029 --> 00:08:24,430 y ahora ya cliente online 180 00:08:24,430 --> 00:08:26,490 hereda de cliente, tiene DNI dentro 181 00:08:26,490 --> 00:08:28,529 como propiedad aunque yo no la vea pero ya 182 00:08:28,529 --> 00:08:29,550 la puede escribir 183 00:08:29,550 --> 00:08:32,470 la puede escribir si la necesita y no tiene que 184 00:08:32,470 --> 00:08:34,190 tirar del get y el set todo el rato 185 00:08:34,190 --> 00:08:40,539 vale, no está aquí 186 00:08:40,539 --> 00:08:42,620 escrita pero la tiene 187 00:08:42,620 --> 00:08:44,379 y como además aquí está con 188 00:08:44,379 --> 00:08:46,379 protected, puedo yo desde 189 00:08:46,379 --> 00:08:48,299 aquí hacer referencia a ella. La tengo 190 00:08:48,299 --> 00:08:50,399 visible. Está visible ya. 191 00:08:51,460 --> 00:08:51,659 ¿Vale? 192 00:08:53,620 --> 00:08:55,500 Entonces, el modificador protected 193 00:08:55,500 --> 00:08:57,679 pues se usa mucho. 194 00:08:57,679 --> 00:08:59,559 ¿Puedes poner como disdelay? 195 00:08:59,919 --> 00:09:00,899 ¿Puedes poner como que es suya? 196 00:09:01,759 --> 00:09:02,919 Sí, sí, sí, claro. 197 00:09:03,220 --> 00:09:04,159 Claro, claro, es suya. 198 00:09:07,279 --> 00:09:09,639 ¿Dónde estamos? 199 00:09:15,720 --> 00:09:18,120 Es su propiedad. Es que hay un copia y pega ahí, 200 00:09:18,159 --> 00:09:19,159 aunque no lo hayamos hecho nosotros. 201 00:09:19,899 --> 00:09:20,120 ¿Vale? 202 00:09:25,139 --> 00:09:26,620 La puedo dejar puesta, lo que queráis. 203 00:09:26,879 --> 00:09:28,000 No, normalmente no se pone. 204 00:09:28,879 --> 00:09:29,820 Sí, vale. 205 00:09:30,500 --> 00:09:32,259 Vale, pues entonces este modificador 206 00:09:32,259 --> 00:09:34,419 ya lo incorporamos con un modificador más 207 00:09:34,419 --> 00:09:36,899 que ya no hay más modificadores de acceso. 208 00:09:37,919 --> 00:09:41,940 El private este, que es aquel miembro, 209 00:09:42,399 --> 00:09:44,960 sea propiedad, sea método, 210 00:09:45,960 --> 00:09:47,200 al que hace referencia, 211 00:09:47,500 --> 00:09:50,019 solo es visible, solo se puede acceder 212 00:09:50,019 --> 00:09:51,139 desde la misma clase. 213 00:09:51,559 --> 00:09:52,259 Ese es el privado. 214 00:09:52,820 --> 00:09:53,000 Vale. 215 00:09:53,000 --> 00:09:55,860 Segundo nivel de acceso 216 00:09:55,860 --> 00:09:57,379 La nada 217 00:09:57,379 --> 00:10:00,519 El nivel de acceso la nada 218 00:10:00,519 --> 00:10:01,980 Es el que se llama package 219 00:10:01,980 --> 00:10:03,179 El nivel de acceso la nada 220 00:10:03,179 --> 00:10:05,879 Significa que esta propiedad 221 00:10:05,879 --> 00:10:06,940 O ese método 222 00:10:06,940 --> 00:10:08,659 Que no tiene modificador de acceso 223 00:10:08,659 --> 00:10:10,679 O que tiene el modificador de acceso por defecto 224 00:10:10,679 --> 00:10:11,360 Como lo queráis ver 225 00:10:11,360 --> 00:10:14,480 Es visible desde la misma clase 226 00:10:14,480 --> 00:10:17,059 Y también desde todas las clases 227 00:10:17,059 --> 00:10:18,279 Del mismo paquete 228 00:10:18,279 --> 00:10:19,620 Del mismo paquete 229 00:10:19,620 --> 00:10:21,159 Vale 230 00:10:21,159 --> 00:10:23,480 el siguiente 231 00:10:23,480 --> 00:10:26,039 modificador de acceso que hemos visto, este, ya sabemos 232 00:10:26,039 --> 00:10:28,580 lo que significa, esta propiedad 233 00:10:28,580 --> 00:10:29,840 o ese método 234 00:10:29,840 --> 00:10:31,299 al que modifica 235 00:10:31,299 --> 00:10:34,039 es accesible o visible 236 00:10:34,039 --> 00:10:36,039 desde todas las clases 237 00:10:36,039 --> 00:10:37,080 de todas partes 238 00:10:37,080 --> 00:10:39,360 claro 239 00:10:39,360 --> 00:10:44,399 sí, desde todas partes 240 00:10:44,399 --> 00:10:45,440 sin claro y sin nada 241 00:10:45,440 --> 00:10:47,940 recordad que luego 242 00:10:47,940 --> 00:10:50,100 recordad que esa clase realmente 243 00:10:50,100 --> 00:10:54,200 su nombre, no es solo su nombre, es su nombre más el paquete al que 244 00:10:54,200 --> 00:10:58,559 pertenece, vale, entonces modelo.cliente.dni 245 00:10:58,559 --> 00:11:02,039 se podrá poner en cualquier parte, porque 246 00:11:02,039 --> 00:11:06,279 dni es público, luego modelo.cliente.dni se puede poner 247 00:11:06,279 --> 00:11:09,980 en cualquier sitio, no hay ningún problema de visibilidad, vale 248 00:11:09,980 --> 00:11:14,019 si tengo el public, y recordad que si me quiero ahorrar 249 00:11:14,019 --> 00:11:18,100 todo el rato el poner modelo.cliente, pues pongo 250 00:11:18,100 --> 00:11:19,879 import modelo.cliente 251 00:11:19,879 --> 00:11:21,559 y luego ya abajo 252 00:11:21,559 --> 00:11:23,220 pongo cliente sin más 253 00:11:23,220 --> 00:11:26,039 bueno, esto es 254 00:11:26,039 --> 00:11:26,679 todo lo que 255 00:11:26,679 --> 00:11:30,929 vale 256 00:11:30,929 --> 00:11:38,049 bueno, pues entonces 257 00:11:38,049 --> 00:11:40,450 nuestra aplicación era esta 258 00:11:40,450 --> 00:11:42,509 tenía un diseño de clases con estas entidades 259 00:11:42,509 --> 00:11:43,710 luego tenía un pedido 260 00:11:43,710 --> 00:11:46,889 que como todos los clientes 261 00:11:46,889 --> 00:11:48,690 tienen un conjunto de pedidos 262 00:11:48,690 --> 00:11:50,730 pues por eso esto lo habíamos puesto aquí 263 00:11:50,730 --> 00:11:51,830 vale 264 00:11:51,830 --> 00:11:56,049 pero si el tema de los pedidos funcionara de forma distinta 265 00:11:56,049 --> 00:11:57,750 en cliente online o en cliente tienda 266 00:11:57,750 --> 00:12:03,169 pues entonces a lo mejor la propiedad relativa a los pedidos 267 00:12:03,169 --> 00:12:04,769 habría que poner aquí cada una la suya 268 00:12:04,769 --> 00:12:08,409 pero como todos los clientes después de haber hecho el análisis 269 00:12:08,409 --> 00:12:11,090 y el diseño todos en esta aplicación en concreto 270 00:12:11,090 --> 00:12:15,409 hemos deducido a ver todos me da igual que sean tienda o cliente 271 00:12:15,409 --> 00:12:17,789 todos se caracterizan por tener un array de pedidos 272 00:12:17,789 --> 00:12:19,610 pues como todos se caracterizan por eso 273 00:12:19,610 --> 00:12:21,850 pues lo podemos poner aquí 274 00:12:21,850 --> 00:12:25,350 y luego 275 00:12:25,350 --> 00:12:28,269 el otro día ya hicimos 276 00:12:28,269 --> 00:12:30,350 una serie de funcionalidades 277 00:12:30,350 --> 00:12:32,029 ya en un main 278 00:12:32,029 --> 00:12:33,450 ya en una aplicación concreta 279 00:12:33,450 --> 00:12:34,950 hicimos una serie de funcionalidades 280 00:12:34,950 --> 00:12:36,809 que nos permitieron ver 281 00:12:36,809 --> 00:12:38,649 la flexibilidad 282 00:12:38,649 --> 00:12:40,529 que nos otorga 283 00:12:40,529 --> 00:12:42,629 esta arquitectura de derecho 284 00:12:42,629 --> 00:12:47,000 porque podríamos haber diseñado esta aplicación 285 00:12:47,000 --> 00:12:48,639 de otra manera, podríamos haber dicho 286 00:12:48,639 --> 00:12:51,139 hombre en lugar de hacer una super clase 287 00:12:51,139 --> 00:12:53,039 con lo común y dos clases que hereden 288 00:12:53,039 --> 00:13:11,820 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? 289 00:13:11,820 --> 00:13:33,799 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. 290 00:13:33,799 --> 00:13:36,279 Vale, pues aquí dijimos 291 00:13:36,279 --> 00:13:38,899 Venga, vamos a hacer la funcionalidad de mostrar datos clientes 292 00:13:38,899 --> 00:13:41,019 Nuestros clientes 293 00:13:41,019 --> 00:13:41,919 Están todos 294 00:13:41,919 --> 00:13:44,120 En un array de clientes 295 00:13:44,120 --> 00:13:46,440 Que hemos ido rellenando con la funcionalidad 296 00:13:46,440 --> 00:13:49,970 La primera cosa 297 00:13:49,970 --> 00:13:51,049 Importantísima 298 00:13:51,049 --> 00:13:54,269 Que nos ha permitido la herencia 299 00:13:54,269 --> 00:13:55,950 Recordad que era 300 00:13:55,950 --> 00:13:57,190 La primera, no lo olvidéis 301 00:13:57,190 --> 00:13:59,950 Que en una referencia cliente 302 00:14:00,509 --> 00:14:01,789 Es decir, una referencia 303 00:14:01,789 --> 00:14:02,629 De la superclase 304 00:14:02,629 --> 00:14:06,789 puedo meter yo ahora objetos cliente, new cliente 305 00:14:06,789 --> 00:14:10,230 u objetos de cualquier superclase, esa es la primera ventaja 306 00:14:10,230 --> 00:14:14,769 es decir, clientes de cero al ser 307 00:14:14,769 --> 00:14:18,809 de tipo cliente puede tener un cliente tienda o un cliente online, me da igual 308 00:14:18,809 --> 00:14:23,720 porque ambos se heredan de cliente, es decir 309 00:14:23,720 --> 00:14:28,399 no tengo que hacer un array para los clientes 310 00:14:28,399 --> 00:14:32,039 online y otro array para los clientes tienda 311 00:14:32,039 --> 00:14:33,379 no tengo por qué hacerlo 312 00:14:33,379 --> 00:14:35,639 puedo hacer un único array 313 00:14:35,639 --> 00:14:38,039 y en ese array, en cada una de las posiciones 314 00:14:38,039 --> 00:14:39,659 al ser de tipo cliente, caben 315 00:14:39,659 --> 00:14:42,580 cliente tienda, cliente online, da igual porque son subclases 316 00:14:42,580 --> 00:14:43,539 esa es la primera cosa 317 00:14:43,539 --> 00:14:46,240 bueno, pues con la funcionalidad 1 318 00:14:46,240 --> 00:14:47,639 insertamos clientes, etc 319 00:14:47,639 --> 00:14:49,559 y ahora nos pusimos a hacer la 2 320 00:14:49,559 --> 00:14:52,240 mostrar datos de cliente 321 00:14:52,240 --> 00:14:54,039 bueno, pues la funcionalidad 2 322 00:14:54,039 --> 00:14:56,259 dijimos, vale 323 00:14:56,259 --> 00:14:58,299 pues para mostrar los datos 324 00:14:58,299 --> 00:14:59,740 de todos los clientes 325 00:14:59,740 --> 00:15:01,879 la funcionalidad era mostrar los datos de todos 326 00:15:01,879 --> 00:15:03,960 pues vamos a hacer un for 327 00:15:03,960 --> 00:15:06,200 que me recorra todos los clientes 328 00:15:06,200 --> 00:15:07,899 bueno, pues como 329 00:15:07,899 --> 00:15:10,820 este for queremos que recorra 330 00:15:10,820 --> 00:15:12,240 todas las posiciones 331 00:15:12,240 --> 00:15:13,720 el for each mucho mejor 332 00:15:13,720 --> 00:15:15,620 porque es más cómodo de escribir 333 00:15:15,620 --> 00:15:18,139 el for each lo único es eso 334 00:15:18,139 --> 00:15:19,919 que nos fuerza a recorrer todas 335 00:15:19,919 --> 00:15:22,320 y solo vale 336 00:15:22,320 --> 00:15:24,080 si yo no cambio la posición 337 00:15:24,080 --> 00:15:25,440 de estos objetos, por supuesto 338 00:15:25,440 --> 00:15:26,840 porque esto es una copia 339 00:15:26,840 --> 00:15:29,019 bueno, pues los voy recorriendo 340 00:15:29,019 --> 00:15:31,759 y decíamos, vamos a ver 341 00:15:31,759 --> 00:15:35,399 yo lo que quiero 342 00:15:35,399 --> 00:15:37,379 es mostrar los datos de cada objeto 343 00:15:37,379 --> 00:15:39,399 cliente, ¿vale? es lo que yo quiero 344 00:15:39,399 --> 00:15:40,179 mostrar los datos 345 00:15:40,179 --> 00:15:43,460 entonces hombre, podría meter aquí un system out 346 00:15:43,460 --> 00:15:45,120 para cada cliente los datos, pero dijimos 347 00:15:45,120 --> 00:15:47,440 bueno hombre, vamos a empezar a hacer las cosas ya con métodos 348 00:15:47,440 --> 00:15:49,460 y modular, ¿vale? pues entonces 349 00:15:49,460 --> 00:15:51,740 yo quiero 350 00:15:51,740 --> 00:15:53,799 que haya un método mostrar clientes 351 00:15:53,799 --> 00:15:55,539 que me muestre los datos del cliente 352 00:15:55,539 --> 00:15:56,879 ¿vale? 353 00:15:57,759 --> 00:15:59,659 bueno, una vez que dijimos que 354 00:15:59,659 --> 00:16:01,899 que bien nos vendría un método 355 00:16:01,899 --> 00:16:04,220 mostrar clientes para mostrar los datos del cliente 356 00:16:04,220 --> 00:16:06,360 y no tener que hacer el system out aquí en el main 357 00:16:06,360 --> 00:16:08,179 dijimos vale 358 00:16:08,179 --> 00:16:09,720 ese método donde lo pongo 359 00:16:09,720 --> 00:16:12,340 lo puedo poner 360 00:16:12,340 --> 00:16:14,399 en cliente pero es que cliente 361 00:16:14,399 --> 00:16:15,960 si yo hago un mostrar clientes 362 00:16:15,960 --> 00:16:17,799 solo puede mostrar DNI y nombre 363 00:16:17,799 --> 00:16:20,419 pues se queda cojo 364 00:16:20,419 --> 00:16:22,379 porque cliente online 365 00:16:22,379 --> 00:16:24,500 tiene además un medio de pago 366 00:16:24,500 --> 00:16:26,620 y un email y cliente tienda 367 00:16:26,620 --> 00:16:27,799 tiene además 368 00:16:27,799 --> 00:16:30,700 una dirección postal 369 00:16:30,700 --> 00:16:32,559 con lo cual 370 00:16:32,559 --> 00:16:34,360 el mostrar clientes de aquí 371 00:16:34,360 --> 00:16:36,440 solo podría mostrar 372 00:16:36,440 --> 00:16:38,600 DNI y nombre, luego si lo hago 373 00:16:38,600 --> 00:16:40,580 aquí y lo heredo desde las 374 00:16:40,580 --> 00:16:42,320 demás, se me queda cojo 375 00:16:42,320 --> 00:16:44,519 luego ese no es el sitio de hacer el método 376 00:16:44,519 --> 00:16:46,799 mostrar clientes, tenemos que hacer uno específico 377 00:16:46,799 --> 00:16:47,039 aquí 378 00:16:47,039 --> 00:16:49,639 que muestre 379 00:16:49,639 --> 00:16:52,700 los datos del cliente 380 00:16:52,700 --> 00:16:54,659 online, que lo muestra todo, medio de pago 381 00:16:54,659 --> 00:16:56,080 email, etcétera 382 00:16:56,080 --> 00:16:57,419 y uno específico aquí 383 00:16:57,419 --> 00:16:59,399 que me estaba los datos 384 00:16:59,399 --> 00:17:00,360 del cliente tienda 385 00:17:00,360 --> 00:17:03,000 con su DNI, su nombre y su dirección postal 386 00:17:03,000 --> 00:17:05,299 uno específico en cada clase 387 00:17:05,299 --> 00:17:07,500 porque el heredado de la superclase 388 00:17:07,500 --> 00:17:08,119 no nos vale 389 00:17:08,119 --> 00:17:11,019 vale, bueno, pues entonces ahora ya 390 00:17:11,019 --> 00:17:13,220 una vez hechos esos métodos, continuamos 391 00:17:13,220 --> 00:17:13,900 con nuestro main 392 00:17:13,900 --> 00:17:16,420 y decíamos, vale, ahora 393 00:17:16,420 --> 00:17:18,579 cada método, ahora yo ya 394 00:17:18,579 --> 00:17:23,099 me hago el bucle para mostrar 395 00:17:23,099 --> 00:17:25,000 los clientes y 396 00:17:25,000 --> 00:17:26,420 me encantaría hacer esto 397 00:17:26,420 --> 00:17:28,180 cl. 398 00:17:31,769 --> 00:17:54,990 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. 399 00:17:54,990 --> 00:17:56,930 entonces para qué lo voy a poner 400 00:17:56,930 --> 00:17:58,650 si luego 401 00:17:58,650 --> 00:18:01,170 el cliente online 402 00:18:01,170 --> 00:18:02,869 lo va a heredar mal 403 00:18:02,869 --> 00:18:04,450 porque el cliente online tiene más datos 404 00:18:04,450 --> 00:18:06,150 y el cliente tiene también, para qué lo voy a poner 405 00:18:06,150 --> 00:18:08,490 no me interesa este método que luego lo hereden 406 00:18:08,490 --> 00:18:10,329 entonces no hacíamos el método 407 00:18:10,329 --> 00:18:12,710 y aquí ya hacíamos 408 00:18:12,710 --> 00:18:14,750 uno específico 409 00:18:14,750 --> 00:18:16,150 para cada clase, uno bueno 410 00:18:16,150 --> 00:18:18,509 aquí el suyo y aquí el suyo 411 00:18:18,509 --> 00:18:20,869 como son distintos, uno en cada clase 412 00:18:20,869 --> 00:18:21,569 no hay tutía 413 00:18:21,569 --> 00:18:24,410 vale, entonces ahora nos íbamos al main 414 00:18:24,410 --> 00:18:32,250 y decía, pues venga, vamos a mostrarlos para cada cliente de mi array, 415 00:18:32,349 --> 00:18:33,089 mostrar los datos. 416 00:18:34,190 --> 00:18:38,369 Pero claro, el compilador me dice, uy, el compilador, 417 00:18:38,549 --> 00:18:40,990 recordad que esto era lo más importante de la herencia, 418 00:18:42,049 --> 00:18:46,309 el compilador mira reglas de sintaxis, reglas sintácticas, 419 00:18:46,529 --> 00:18:47,970 no mira si esto tiene sentido o no. 420 00:18:49,210 --> 00:18:51,509 Esto sentido tiene todo el del mundo, porque CL, 421 00:18:52,250 --> 00:18:53,970 aunque está declarado como cliente, 422 00:18:54,750 --> 00:18:56,970 CL es o cliente tienda o cliente online. 423 00:18:57,069 --> 00:19:03,230 Eso ya lo sabemos, cuando se ha instanciado, se ha instanciado como cliente online o cliente tienda, lo tenemos claro. 424 00:19:03,809 --> 00:19:20,769 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. 425 00:19:20,769 --> 00:19:24,089 el compilador se va a la clase 426 00:19:24,089 --> 00:19:26,210 a la cual está declarada cliente 427 00:19:26,210 --> 00:19:28,130 y dice, uy en cliente 428 00:19:28,130 --> 00:19:30,190 no hay ningún mostrar datos, lo siento 429 00:19:30,190 --> 00:19:32,009 no te dejo escribir 430 00:19:32,009 --> 00:19:33,950 mostrar datos, no te dejo 431 00:19:33,950 --> 00:19:34,609 escribirlo 432 00:19:34,609 --> 00:19:38,190 porque mis reglas sintácticas 433 00:19:38,190 --> 00:19:40,049 dicen que si CL 434 00:19:40,049 --> 00:19:42,170 está declarado como clase cliente 435 00:19:42,170 --> 00:19:43,970 tú solamente puedes llamar a métodos que 436 00:19:43,970 --> 00:19:45,009 estén en cliente 437 00:19:45,009 --> 00:19:46,750 y en cliente no lo tienes 438 00:19:46,750 --> 00:19:49,150 pues aquí nos hemos quedado atascados 439 00:19:49,150 --> 00:19:51,009 ¿Vale? Es en lo que nos quedamos el otro día 440 00:19:51,009 --> 00:19:52,990 Y todo porque 441 00:19:52,990 --> 00:19:55,329 El compilador sigue una regla sintáctica 442 00:19:55,329 --> 00:19:56,990 Muy restrictiva 443 00:19:56,990 --> 00:19:59,150 Pero claro, esto decíamos 444 00:19:59,150 --> 00:20:01,069 Esto no tiene sentido, pero si en el 445 00:20:01,069 --> 00:20:02,230 Objeto cliente 446 00:20:02,230 --> 00:20:05,069 Que se ha creado con el 447 00:20:05,069 --> 00:20:06,950 New como cliente tienda o cliente online 448 00:20:06,950 --> 00:20:07,930 Sí que está el método 449 00:20:07,930 --> 00:20:10,710 Pues vamos a 450 00:20:10,710 --> 00:20:12,990 A callar al compilador dejándole 451 00:20:12,990 --> 00:20:14,849 Tranquilo y diciéndole, vamos a ver 452 00:20:14,849 --> 00:20:16,529 A ti lo que te pasa 453 00:20:16,529 --> 00:20:18,950 Para dejarme ya en paz y dejar de poner 454 00:20:18,950 --> 00:20:21,250 eso rojo, es que necesitas 455 00:20:21,250 --> 00:20:22,789 que exista un método 456 00:20:22,789 --> 00:20:24,950 mostrar datos en la clase 457 00:20:24,950 --> 00:20:26,950 cliente, porque 458 00:20:26,950 --> 00:20:28,930 yo estoy declarado como cliente, aunque 459 00:20:28,930 --> 00:20:30,930 luego esté creado, instanciado con el 460 00:20:30,930 --> 00:20:32,430 new como tienda online 461 00:20:32,430 --> 00:20:34,109 es lo que necesitas 462 00:20:34,109 --> 00:20:36,930 ver que hay un método mostrar datos ahí en la clase 463 00:20:36,930 --> 00:20:38,950 cliente, pues yo te doy 464 00:20:38,950 --> 00:20:40,950 un método mostrar datos, ala 465 00:20:40,950 --> 00:20:42,990 este mismo, que no me 466 00:20:42,990 --> 00:20:44,470 vale para nada y no me interesa 467 00:20:44,470 --> 00:20:47,210 porque no muestra las propiedades del objeto 468 00:20:47,210 --> 00:20:48,390 total 469 00:20:48,390 --> 00:20:52,930 si, podríamos dejarlo vacío 470 00:20:52,930 --> 00:20:54,750 sería el siguiente paso 471 00:20:54,750 --> 00:20:58,190 pues yo te pongo ahí un método 472 00:20:58,190 --> 00:21:00,309 como si pongo bla bla bla jejeje 473 00:21:00,309 --> 00:21:02,630 como si te pongo ahí 474 00:21:02,630 --> 00:21:04,529 pesado, voy a hacer este método porque eres 475 00:21:04,529 --> 00:21:06,390 un pesado, compilador 476 00:21:06,390 --> 00:21:07,750 como si pongo lo que me dé la gana 477 00:21:07,750 --> 00:21:10,130 pero bueno, ya que nos ponemos a hacerlo 478 00:21:10,130 --> 00:21:11,890 hemos puesto esto, porque oye, quien sabe 479 00:21:11,890 --> 00:21:14,710 a lo mejor en esta aplicación pueden llegar a existir 480 00:21:14,710 --> 00:21:16,150 objetos clientes sin más 481 00:21:16,150 --> 00:21:18,250 porque esto es una clase más, cliente 482 00:21:18,250 --> 00:21:20,809 pues a lo mejor yo instancio un objeto cliente 483 00:21:20,809 --> 00:21:22,730 sin más que tiene DNI nombre 484 00:21:22,730 --> 00:21:24,109 pues a lo mejor ese objeto cliente 485 00:21:24,109 --> 00:21:25,950 quiere llamar a su mostrar datos 486 00:21:25,950 --> 00:21:28,869 bueno, pues venga, me hago un método 487 00:21:28,869 --> 00:21:29,609 mostrar datos 488 00:21:29,609 --> 00:21:32,730 y ya el compilador se calla 489 00:21:32,730 --> 00:21:34,069 y dice, uy que bien 490 00:21:34,069 --> 00:21:35,950 el objeto CL 491 00:21:35,950 --> 00:21:38,130 que está declarado como cliente 492 00:21:38,130 --> 00:21:40,309 yo me voy a la clase a la que pertenece 493 00:21:40,309 --> 00:21:42,049 y tiene un mostrar datos, ya se queda callado 494 00:21:42,049 --> 00:21:44,049 vale 495 00:21:44,049 --> 00:21:45,509 se queda callado 496 00:21:45,509 --> 00:21:49,170 esto lo vamos a seguir dejándolo comentado 497 00:21:49,170 --> 00:21:52,690 esto ya lo he escrito arriba 498 00:21:52,690 --> 00:21:54,269 lo quito de aquí, se queda callado 499 00:21:54,269 --> 00:21:56,950 y ahora es cuando me diríais 500 00:21:56,950 --> 00:21:58,710 vosotros, si no fuera 501 00:21:58,710 --> 00:22:00,710 porque ya lo sabéis, me diríais 502 00:22:00,710 --> 00:22:02,529 ya claro, pero es que no queremos 503 00:22:02,529 --> 00:22:04,809 llamar a mostrar datos de la clase cliente 504 00:22:04,809 --> 00:22:06,569 queremos llamar 505 00:22:06,569 --> 00:22:08,789 a mostrar datos de cliente 506 00:22:08,789 --> 00:22:10,730 online cuando sea cliente online 507 00:22:10,730 --> 00:22:12,690 y queremos llamar a mostrar 508 00:22:12,690 --> 00:22:14,789 datos de cliente tienda cuando sea cliente 509 00:22:14,789 --> 00:22:15,809 tienda, que son los buenos 510 00:22:15,809 --> 00:22:18,910 claro, estupendo, pero es que eso ya lo hace 511 00:22:18,910 --> 00:22:20,390 la máquina virtual por nosotros 512 00:22:20,390 --> 00:22:21,529 entonces 513 00:22:21,529 --> 00:22:24,410 importante que distingamos 514 00:22:24,410 --> 00:22:27,130 tiempo de escritura de código, tiempo de desarrollo 515 00:22:27,130 --> 00:22:28,890 cuando el desarrollador está haciendo su 516 00:22:28,890 --> 00:22:30,430 aplicación en la cual tiene que 517 00:22:30,430 --> 00:22:33,089 por supuesto dedicar mucho tiempo a su diseño 518 00:22:33,089 --> 00:22:34,329 qué clases hace 519 00:22:34,329 --> 00:22:36,930 qué entidades, qué relaciones 520 00:22:36,930 --> 00:22:39,029 hace entre ellas, qué propiedades tiene cada una 521 00:22:39,029 --> 00:22:41,029 si tiene una estructura de herencia o no 522 00:22:41,029 --> 00:22:41,849 que tenga sentido 523 00:22:41,849 --> 00:22:44,349 crear los métodos 524 00:22:44,349 --> 00:22:46,349 y ahí en ese tiempo de desarrollo 525 00:22:46,349 --> 00:22:48,750 es que tienes que cumplir las reglas 526 00:22:48,750 --> 00:22:51,309 aunque Java te ponga mil y muchas 527 00:22:51,309 --> 00:22:52,869 pues hay que cumplirlas todas 528 00:22:52,869 --> 00:22:54,829 ¿vale? porque si no el compilador 529 00:22:54,829 --> 00:22:57,309 te dice no, esto no compila 530 00:22:57,309 --> 00:22:59,109 no te hago un punto class 531 00:22:59,109 --> 00:23:00,470 con lo cual no puedes ejecutar 532 00:23:00,470 --> 00:23:03,309 ya hemos cumplido todas las reglas 533 00:23:03,309 --> 00:23:04,930 el compilador ya se ha callado 534 00:23:04,930 --> 00:23:07,150 y ya nuestra aplicación asumimos que está bien 535 00:23:07,150 --> 00:23:10,190 saltamos al tiempo de ejecución 536 00:23:10,190 --> 00:23:13,589 que es el tiempo en el cual yo ya 537 00:23:13,589 --> 00:23:16,190 lanzo la aplicación para que se ejecute 538 00:23:16,190 --> 00:23:18,049 para la cual tiene que haber 539 00:23:18,049 --> 00:23:18,849 un main, obviamente 540 00:23:18,849 --> 00:23:21,210 tiene que haber un main 541 00:23:21,210 --> 00:23:23,930 porque el punto de arranque de cualquier aplicación 542 00:23:23,930 --> 00:23:25,950 Java de escritorio, no web 543 00:23:25,950 --> 00:23:28,130 ni nada de eso, es un main 544 00:23:28,130 --> 00:23:29,690 vale, tiene que haber un main 545 00:23:29,690 --> 00:23:32,130 bueno, pues ese main 546 00:23:32,130 --> 00:23:34,049 arranca ya en tiempo de ejecución 547 00:23:34,049 --> 00:23:36,049 la máquina virtual lo arranca y empiezan 548 00:23:36,049 --> 00:23:37,589 a funcionar, a pasar cosas 549 00:23:37,589 --> 00:23:39,369 ¿y qué es lo que empieza a pasar? 550 00:23:39,710 --> 00:23:41,230 pues que empiezan a instanciarse objetos 551 00:23:41,230 --> 00:23:43,630 aquí cada vez que le demos a insertar 552 00:23:43,630 --> 00:23:45,569 cliente pues se empezarán a 553 00:23:45,569 --> 00:23:47,470 instanciar objetos, aquí un new 554 00:23:47,470 --> 00:23:49,609 cliente tienda, cuando yo creo un cliente 555 00:23:49,609 --> 00:23:51,589 tienda, cuando creo 556 00:23:51,589 --> 00:23:53,470 un cliente online llamando a este método 557 00:23:53,470 --> 00:23:55,789 pues se instanzaría un cliente online 558 00:23:55,789 --> 00:23:57,609 eso es lo que empieza a pasar 559 00:23:57,609 --> 00:23:59,569 en tiempo de ejecución, que empezamos a dar 560 00:23:59,569 --> 00:24:01,450 opciones, se empiezan a hacer 561 00:24:01,450 --> 00:24:03,509 los news, news, news, se empiezan a ejecutar, se empiezan 562 00:24:03,509 --> 00:24:04,269 a aparecer objetos 563 00:24:04,269 --> 00:24:07,569 en memoria RAM están ahí esos objetos 564 00:24:07,569 --> 00:24:09,589 cada uno perfectamente identificado 565 00:24:09,589 --> 00:24:12,250 si es cliente online, si es cliente tienda, si es cliente pepito 566 00:24:12,250 --> 00:24:15,869 vale, pues ahora en tiempo de ejecución 567 00:24:15,869 --> 00:24:18,410 le damos a la opción 2, ya en tiempo de ejecución 568 00:24:18,410 --> 00:24:20,950 no desarrollando, ya hay un tío ahí dándole las opciones 569 00:24:20,950 --> 00:24:24,470 y en tiempo de ejecución la máquina virtual se encuentra 570 00:24:24,470 --> 00:24:27,190 con el problema de que para cada uno de los objetos 571 00:24:27,190 --> 00:24:30,450 de la raíz real que ya existe, que está en memoria de la raíz real 572 00:24:30,450 --> 00:24:32,150 que ya existe, tiene que demostrar datos 573 00:24:32,150 --> 00:24:36,170 bueno, pues la máquina virtual, dijimos, a la máquina virtual 574 00:24:36,170 --> 00:24:38,450 le da exactamente igual 575 00:24:38,450 --> 00:24:40,910 como esté declarado este objeto 576 00:24:40,910 --> 00:24:42,769 si está declarado como cliente 577 00:24:42,769 --> 00:24:44,950 está declarado como Juanito y está declarado como Pepito 578 00:24:44,950 --> 00:24:46,829 le da igual, eso solo le importó 579 00:24:46,829 --> 00:24:49,009 al compilador que es el que nos 580 00:24:49,009 --> 00:24:49,950 dictó las reglas 581 00:24:49,950 --> 00:24:52,529 a la máquina virtual que ahora 582 00:24:52,529 --> 00:24:54,970 tiene que ejecutar el método, que es la que tiene que hacer 583 00:24:54,970 --> 00:24:57,130 ya el trabajo de ejecutar el método, a la máquina virtual 584 00:24:57,130 --> 00:24:58,650 solo le interesa 585 00:24:58,650 --> 00:25:01,109 ir a la memoria RAM a ver este objeto 586 00:25:01,109 --> 00:25:03,049 como se creó, si se creó con 587 00:25:03,049 --> 00:25:04,910 new cliente tienda, se creó con new client 588 00:25:04,910 --> 00:25:07,130 es lo único que le importa, esto le da igual 589 00:25:07,130 --> 00:25:09,609 vale, pues la máquina virtual dirá 590 00:25:09,609 --> 00:25:11,289 a ver CL, me voy a la RAM 591 00:25:11,289 --> 00:25:13,509 CL, tú que eres, eres un cliente online 592 00:25:13,509 --> 00:25:15,869 vale, pues entonces 593 00:25:15,869 --> 00:25:18,009 llamo al mostrar datos del cliente 594 00:25:18,009 --> 00:25:18,309 online 595 00:25:18,309 --> 00:25:20,509 que es el bueno 596 00:25:20,509 --> 00:25:23,710 que no 597 00:25:23,710 --> 00:25:25,309 que yo me voy a la RAM 598 00:25:25,309 --> 00:25:27,410 y veo que el objeto CL 599 00:25:27,410 --> 00:25:29,509 se ha creado en RAM 600 00:25:29,509 --> 00:25:30,690 como cliente tienda 601 00:25:30,690 --> 00:25:33,450 cuando el usuario dio a dos y lo creó 602 00:25:33,450 --> 00:25:35,750 bueno, pues entonces llamo al mostrar 603 00:25:35,750 --> 00:25:37,250 datos de cliente tienda 604 00:25:37,250 --> 00:25:39,470 que es el bueno 605 00:25:39,470 --> 00:25:41,170 el que tiene todas las propiedades 606 00:25:41,170 --> 00:25:43,490 y entonces esto ya está 607 00:25:43,490 --> 00:25:44,630 funciona perfectamente 608 00:25:44,630 --> 00:25:46,630 bueno pues 609 00:25:46,630 --> 00:25:50,109 esto era la segunda 610 00:25:50,109 --> 00:25:51,589 potencia 611 00:25:51,589 --> 00:25:53,230 fundamental de la herencia 612 00:25:53,230 --> 00:25:55,609 la primera repito 613 00:25:55,609 --> 00:25:57,789 poder guardar en una referencia 614 00:25:57,789 --> 00:25:59,609 de una clase objetos 615 00:25:59,609 --> 00:26:01,650 no solo de esa clase 616 00:26:01,650 --> 00:26:02,730 sino de las herederas 617 00:26:02,730 --> 00:26:05,670 eso facilita mucho la escritura del código 618 00:26:05,670 --> 00:26:10,109 me permite arrays únicos para objetos de diferente tipo, etc. 619 00:26:10,950 --> 00:26:14,609 Y la segunda, esto que acabamos de decir, 620 00:26:14,750 --> 00:26:18,289 que era lo que se llamaba, lo que se llama polimorfismo. 621 00:26:18,650 --> 00:26:20,630 La segunda es el polimorfismo, que es, 622 00:26:21,410 --> 00:26:25,509 oye, mostrar datos, este de aquí no es un solo método, 623 00:26:26,329 --> 00:26:29,950 son muchos, tiene muchas formas, 624 00:26:30,089 --> 00:26:32,190 de ahí lo de polimorfismo, son muchos. 625 00:26:32,569 --> 00:26:34,289 ¿Cuáles son? Pues depende. 626 00:26:34,289 --> 00:26:37,369 si CL está instanciado como cliente 627 00:26:37,369 --> 00:26:38,950 online, mostrar datos 628 00:26:38,950 --> 00:26:40,390 será el mostrar datos de cliente online 629 00:26:40,390 --> 00:26:43,250 si CL está instanciado como cliente 630 00:26:43,250 --> 00:26:44,970 tienda, mostrar datos 631 00:26:44,970 --> 00:26:45,670 será el 632 00:26:45,670 --> 00:26:48,950 la versión de cliente tienda 633 00:26:48,950 --> 00:26:51,650 si CL está instanciado como cliente 634 00:26:51,650 --> 00:26:52,970 que podría ser mostrar 635 00:26:52,970 --> 00:26:54,569 datos, será 636 00:26:54,569 --> 00:26:56,730 el mostrar datos de cliente 637 00:26:56,730 --> 00:26:58,670 luego mostrar datos 638 00:26:58,670 --> 00:27:01,009 tiene una única llamada, único nombre 639 00:27:01,009 --> 00:27:03,029 y muchas versiones, tiene esta 640 00:27:03,029 --> 00:27:05,109 versión, tiene esta 641 00:27:05,109 --> 00:27:07,269 otra, tiene esta 642 00:27:07,269 --> 00:27:08,390 tiene muchas 643 00:27:08,390 --> 00:27:11,049 en toda la arquitectura de las clases, subclases 644 00:27:11,049 --> 00:27:13,069 superclases, en cada una tiene su versión 645 00:27:13,069 --> 00:27:14,509 tiene un montón de formas 646 00:27:14,509 --> 00:27:16,069 en cada clase tiene una 647 00:27:16,069 --> 00:27:18,650 la llamada es única 648 00:27:18,650 --> 00:27:21,269 para los objetos de clase cliente 649 00:27:21,269 --> 00:27:22,630 ¿qué versión se llama? 650 00:27:22,970 --> 00:27:24,990 depende de cómo esté instanciado 651 00:27:24,990 --> 00:27:26,210 ¿vale? 652 00:27:27,430 --> 00:27:28,990 pues este es el polimorfismo 653 00:27:28,990 --> 00:27:31,109 y el polimorfismo nos ha 654 00:27:31,109 --> 00:27:31,970 simplificado la vida 655 00:27:31,970 --> 00:27:33,750 porque yo me cojo 656 00:27:33,750 --> 00:27:34,789 todos los clientes 657 00:27:34,789 --> 00:27:37,069 me olvido de qué tipo son 658 00:27:37,069 --> 00:27:39,750 me despreocupo 659 00:27:39,750 --> 00:27:43,150 y llama a mostrar datos 660 00:27:43,150 --> 00:27:44,690 y me despreocupo de todo 661 00:27:44,690 --> 00:27:46,369 y sé que mostrar datos 662 00:27:46,369 --> 00:27:47,829 estará llamando al que toca 663 00:27:47,829 --> 00:27:48,769 a uno o a otro 664 00:27:48,769 --> 00:27:53,589 yo no lo sé y me da igual 665 00:27:53,589 --> 00:27:54,549 lo sabe la aplicación 666 00:27:54,549 --> 00:27:57,950 la aplicación sabe a cuál tiene que llamar 667 00:27:57,950 --> 00:28:00,009 que será al que corresponda 668 00:28:00,009 --> 00:28:01,910 al objeto que está instanciado 669 00:28:01,910 --> 00:28:03,509 aquí, entonces 670 00:28:03,509 --> 00:28:05,569 tu tarea como desarrollador 671 00:28:05,569 --> 00:28:07,950 no es decir todo lo que va a pasar en tiempo 672 00:28:07,950 --> 00:28:10,230 de ejecución, porque eso depende de cada ejecución 673 00:28:10,230 --> 00:28:11,869 tu tarea como 674 00:28:11,869 --> 00:28:13,809 desarrollador es hacer un código 675 00:28:13,809 --> 00:28:15,230 que haga 676 00:28:15,230 --> 00:28:17,769 lo que te piden, y aquí lo que te piden 677 00:28:17,769 --> 00:28:20,150 que es, meter un montón de clientes 678 00:28:20,150 --> 00:28:21,109 del tipo que sea 679 00:28:21,109 --> 00:28:23,609 que tú en tiempo de desarrollo no sabes que tipo es 680 00:28:23,609 --> 00:28:25,990 en una ejecución puede que te metan todos de tienda 681 00:28:25,990 --> 00:28:27,769 en otra puede que te metan todos de online 682 00:28:27,769 --> 00:28:29,670 tu tarea es 683 00:28:29,670 --> 00:28:32,029 garantizar que en cualquier circunstancia 684 00:28:32,029 --> 00:28:33,049 esto va a funcionar bien 685 00:28:33,049 --> 00:28:35,589 bueno, pues esto funciona bien con estas dos líneas 686 00:28:35,589 --> 00:28:37,009 aquí cabe 687 00:28:37,009 --> 00:28:39,690 cualquier tipo de objeto cliente 688 00:28:39,690 --> 00:28:41,809 y subclase, cualquiera, en cada ejecución 689 00:28:41,809 --> 00:28:43,829 irán unos, irán otros, da igual, ahí caben 690 00:28:43,829 --> 00:28:45,750 todos, y además tú como 691 00:28:45,750 --> 00:28:47,730 desarrollador solo con esta única 692 00:28:47,730 --> 00:28:49,170 línea, sabes 693 00:28:49,170 --> 00:28:51,769 que da igual los objetos que hay ahí, ya la máquina 694 00:28:51,769 --> 00:28:53,329 virtual va a llamar a la versión buena 695 00:28:53,329 --> 00:28:55,750 tú como desarrollador 696 00:28:55,750 --> 00:28:57,630 ya has escrito lo que tenías que escribir 697 00:28:57,630 --> 00:28:59,609 para que funcione para cualquier tipo 698 00:28:59,609 --> 00:29:01,210 de objeto, y ya está 699 00:29:01,210 --> 00:29:03,589 tú no puedes saber qué tipo 700 00:29:03,589 --> 00:29:05,430 de objeto hay ahí, depende de la ejecución 701 00:29:05,430 --> 00:29:07,130 ¿vale? 702 00:29:08,230 --> 00:29:09,970 entonces, esto era el polimorfismo 703 00:29:09,970 --> 00:29:11,549 que nos permite escribir en 704 00:29:11,549 --> 00:29:12,470 esta única línea 705 00:29:12,470 --> 00:29:15,509 todo lo que si no tendríamos que 706 00:29:15,509 --> 00:29:17,789 haber hecho de esta otra forma que está comentada 707 00:29:17,789 --> 00:29:18,210 de aquí 708 00:29:18,210 --> 00:29:25,339 ¿vale? esta forma 709 00:29:25,339 --> 00:29:27,220 que es la que hubiéramos tenido que usar si no hubiera 710 00:29:27,220 --> 00:29:28,200 polimorfismo es 711 00:29:28,200 --> 00:29:31,220 a ver, voy a distinguir CL 712 00:29:31,220 --> 00:29:32,579 de qué tipo es 713 00:29:32,579 --> 00:29:35,180 para eso teníamos este operador 714 00:29:35,180 --> 00:29:37,619 que incorporábamos como nuevo 715 00:29:37,619 --> 00:29:39,440 que nos permite distinguir un objeto 716 00:29:39,440 --> 00:29:41,200 como se ha instanciado 717 00:29:41,200 --> 00:29:42,960 no como se ha declarado 718 00:29:42,960 --> 00:29:45,700 vale, que te has instanciado como cliente 719 00:29:45,700 --> 00:29:47,680 tienda, te voy a convertir 720 00:29:47,680 --> 00:29:49,480 en cliente tienda con un casting 721 00:29:49,480 --> 00:29:51,619 casting que no me va a dar ningún problema 722 00:29:51,619 --> 00:29:53,319 porque es que sé que es cliente tienda 723 00:29:53,319 --> 00:29:55,460 luego puedo convertir algo en 724 00:29:55,460 --> 00:29:58,019 una cosa que es sin transformarla 725 00:29:58,019 --> 00:30:01,559 y ya está, y una vez que te he 726 00:30:01,559 --> 00:30:03,380 convertido, ya llamo a tu método, 727 00:30:03,599 --> 00:30:05,460 llamo a lo que sea. En este caso se vería mejor 728 00:30:05,460 --> 00:30:07,519 si llamamos a mostrar 729 00:30:07,519 --> 00:30:09,640 datos. Vale, 730 00:30:09,759 --> 00:30:11,740 llamo ya a la versión de mostrar datos 731 00:30:11,740 --> 00:30:13,559 de cliente tienda, porque 732 00:30:13,559 --> 00:30:15,740 te he hecho el casting, porque he verificado previamente 733 00:30:15,740 --> 00:30:17,500 que eres tipo tienda. ¿Que no? 734 00:30:17,619 --> 00:30:19,599 ¿Que eres cliente online? Pues te hago el casting 735 00:30:19,599 --> 00:30:21,480 a cliente online 736 00:30:21,480 --> 00:30:23,680 y llamo a tu versión 737 00:30:23,680 --> 00:30:25,900 de mostrar datos de cliente online. 738 00:30:26,619 --> 00:30:27,640 Bueno, pues todo este 739 00:30:27,640 --> 00:30:29,279 rollo no es necesario 740 00:30:29,279 --> 00:30:31,539 porque esto ya lo hace la máquina virtual 741 00:30:31,539 --> 00:30:32,680 por nosotros 742 00:30:32,680 --> 00:30:34,980 la máquina virtual ya dice 743 00:30:34,980 --> 00:30:36,440 oye tú que eres cliente tienda 744 00:30:36,440 --> 00:30:38,720 pues te hago el casting y llamo a tu versión 745 00:30:38,720 --> 00:30:40,259 tú que eres cliente online 746 00:30:40,259 --> 00:30:42,380 pues te hago el casting y llamo a tu versión 747 00:30:42,380 --> 00:30:44,519 ya lo hace todo ahí 748 00:30:44,519 --> 00:30:45,859 en esa única línea 749 00:30:45,859 --> 00:30:48,480 luego nos ahorramos todo esto 750 00:30:48,480 --> 00:30:53,920 vale 751 00:30:53,920 --> 00:30:56,539 pues claro, claro, claro 752 00:30:56,539 --> 00:31:01,440 esto es más o menos 753 00:31:01,440 --> 00:31:03,079 lo que de herencia 754 00:31:03,079 --> 00:31:05,980 tenemos que tener claro hasta ahora 755 00:31:05,980 --> 00:31:06,519 vale 756 00:31:06,519 --> 00:31:08,759 entonces ya que estábamos con esta aplicación 757 00:31:08,759 --> 00:31:10,299 pues ya la usamos para dejar 758 00:31:10,299 --> 00:31:12,359 alguna otra funcionalidad 759 00:31:12,359 --> 00:31:14,920 para hacer, como la 3, la 4 y la 5 760 00:31:14,920 --> 00:31:17,140 agregar pedido a un cliente 761 00:31:17,140 --> 00:31:18,740 decidiendo donde podemos poner ese método 762 00:31:18,740 --> 00:31:19,779 mostrar al cliente que más 763 00:31:19,779 --> 00:31:22,079 haga hasta ahí de qué tipo es 764 00:31:22,079 --> 00:31:24,240 y fijar descuento clientes online 765 00:31:24,240 --> 00:31:27,319 a ver, la funcionalidad 5 766 00:31:27,319 --> 00:31:28,980 la podemos hacer ahora mismo 767 00:31:28,980 --> 00:31:30,039 antes de que hagáis vosotros 768 00:31:30,039 --> 00:31:32,259 si es que no la habéis hecho, la 3 y la 4 769 00:31:32,259 --> 00:31:33,359 que la hagáis ahora en un ratito 770 00:31:33,359 --> 00:31:36,059 dijimos esta aplicación 771 00:31:36,059 --> 00:31:39,119 para ampliarla un pelín más 772 00:31:39,119 --> 00:31:39,700 o algo así 773 00:31:39,700 --> 00:31:43,359 y para distinguir clientes online de tienda 774 00:31:43,359 --> 00:31:49,039 el que nos pidió 775 00:31:49,039 --> 00:31:50,359 esta aplicación nos dijo 776 00:31:50,359 --> 00:31:52,539 a ver, cuidado que te incorporo 777 00:31:52,539 --> 00:31:54,720 una característica más 778 00:31:54,720 --> 00:31:56,900 así que amplíame la aplicación 779 00:31:56,900 --> 00:31:57,759 te incorporo 780 00:31:57,759 --> 00:32:00,299 que a los clientes online les voy a hacer un descuento 781 00:32:00,299 --> 00:32:01,940 entonces nosotros como desarrollo decimos 782 00:32:01,940 --> 00:32:03,900 a ver, esta incorporación, ¿qué hago? 783 00:32:03,960 --> 00:32:05,900 ¿en qué se traduce? ¿qué es un descuento? 784 00:32:05,900 --> 00:32:07,500 un valor, una propiedad 785 00:32:07,500 --> 00:32:08,980 vale, ¿dónde la coloco? 786 00:32:09,819 --> 00:32:11,319 es relacionada con clientes online 787 00:32:11,319 --> 00:32:13,000 porque es el descuento para clientes online 788 00:32:13,000 --> 00:32:14,079 vale, pues la coloco aquí 789 00:32:14,079 --> 00:32:17,759 ¿es diferente para cada cliente? 790 00:32:17,960 --> 00:32:19,220 podría serlo si el 791 00:32:19,220 --> 00:32:21,660 que me pide la aplicación 792 00:32:21,660 --> 00:32:23,660 me lo dijera, cada cliente va a tener un descuento distinto 793 00:32:23,660 --> 00:32:25,640 que tú le metes en función de su nombre 794 00:32:25,640 --> 00:32:26,480 o lo que sea 795 00:32:26,480 --> 00:32:29,940 yo qué sé, porque iba a decir en función de su género 796 00:32:29,940 --> 00:32:30,839 pero me parecía un poco 797 00:32:30,839 --> 00:32:32,559 pues de su nombre 798 00:32:32,559 --> 00:32:35,420 pero no, el mismo para todos 799 00:32:35,420 --> 00:32:37,559 bueno, pues me hice el mismo para todos 800 00:32:37,559 --> 00:32:39,180 pues ya me la he caracterizado del todo 801 00:32:39,180 --> 00:32:42,059 la pongo como estática dentro de cliente online 802 00:32:42,059 --> 00:32:42,559 y ya está 803 00:32:42,559 --> 00:32:46,059 luego la funcionalidad de fijar descuento 804 00:32:46,059 --> 00:32:48,059 clientes online, la 5, es que es una línea 805 00:32:48,059 --> 00:32:49,059 que 806 00:32:49,059 --> 00:32:53,279 la podemos poner aquí rápidamente 807 00:32:53,279 --> 00:32:54,579 antes de que hagáis las demás 808 00:32:54,579 --> 00:32:57,460 que le diríamos, venga pues dinos el descuento 809 00:32:57,460 --> 00:33:04,799 descuento que quieres 810 00:33:04,799 --> 00:33:06,380 y aquí ya hacíamos 811 00:33:06,380 --> 00:33:09,099 cliente 812 00:33:09,099 --> 00:33:10,839 online 813 00:33:10,839 --> 00:33:22,809 line punto descuento igual a lo que me hayan pedido entero y me falta el break porque si no 814 00:33:22,809 --> 00:33:34,779 me va a decir adiós venga la 5 ya está es fijar el descuento como es una variable estática la 815 00:33:34,779 --> 00:33:40,559 llamó desde la clase las variables estática también por convenio pues como no son propiedades 816 00:33:40,559 --> 00:33:45,599 de los objetos no se incorporan los get y set los get y set son para leer y fijar propiedades 817 00:33:45,599 --> 00:33:47,599 los objetos, estas tienen otra 818 00:33:47,599 --> 00:33:49,599 interpretación, pues entonces no se 819 00:33:49,599 --> 00:33:51,339 incorporan los getises, se ponen como public 820 00:33:51,339 --> 00:33:53,619 y se llaman directamente para la clase 821 00:33:53,619 --> 00:33:55,619 y todo más bonito y más fácil, de nuevo 822 00:33:55,619 --> 00:33:56,519 un convenio, claro 823 00:33:56,519 --> 00:33:58,839 vale, pues la 5 ya estaría 824 00:33:58,839 --> 00:34:00,460 pues a ver la 825 00:34:00,460 --> 00:34:03,359 3 y la 4 826 00:34:03,359 --> 00:34:05,359 ¿la habéis hecho? 827 00:34:05,940 --> 00:34:07,539 no, pues hacedlas 828 00:34:07,539 --> 00:34:09,059 venga, ya mímico 829 00:34:09,059 --> 00:34:10,619 un minuto y medio 830 00:34:10,619 --> 00:34:13,760 no, venga, dos y medio, no, un poquito más 831 00:34:13,760 --> 00:34:14,199 porque 832 00:34:14,199 --> 00:34:15,079 Gracias.