1 00:00:00,050 --> 00:00:27,969 Vale, el proyecto hecho, pues venga, voy a hacer un paquete para trabajar siempre en paquetes, pues yo que sé, cualquiera, pues venga, mi paquete, entonces resulta que yo aquí tengo mi clase cliente, estoy en un proyecto nuevo solamente, repito, para poner ejemplos de herencia. 2 00:00:27,969 --> 00:01:02,009 Pues yo tengo aquí mi clase cliente, que era con la que he hecho yo mi aplicación, cualquiera, que tiene solamente estas propiedades, NIF por ejemplo, podría tener su constructor, getter, setter, modificador privado, todo eso, pero bueno, ahora vamos a ver de forma muy aislada lo de la herencia, para que quede claro cómo funciona. 3 00:01:02,009 --> 00:01:14,549 Vale, entonces mi aplicación está hecha con esta clase cliente, su nombre, su NIF, sus cosas y ahora es cuando necesito incorporar una nueva entidad que son los clientes VIP. 4 00:01:14,549 --> 00:01:16,950 vale, pues entonces 5 00:01:16,950 --> 00:01:19,129 me hago yo una clase 6 00:01:19,129 --> 00:01:29,829 ala, me hago esta clase 7 00:01:29,829 --> 00:01:31,870 y esta clase en el momento de hacerlas 8 00:01:31,870 --> 00:01:33,129 cuando digo, a ver 9 00:01:33,129 --> 00:01:35,849 cuidado que cliente VIP 10 00:01:35,849 --> 00:01:37,609 es un cliente 11 00:01:37,609 --> 00:01:39,549 luego al ser cliente VIP 12 00:01:39,549 --> 00:01:41,409 un cliente va a tener nombre y NIF 13 00:01:41,409 --> 00:01:44,150 y todo lo que tiene cliente, porque lo es 14 00:01:44,150 --> 00:01:46,109 entonces en lugar de 15 00:01:46,109 --> 00:01:48,150 poner aquí otra vez, nombre, NIF 16 00:01:48,150 --> 00:01:49,969 los métodos que sean, todo 17 00:01:49,969 --> 00:01:51,930 en lugar de hacer eso 18 00:01:51,930 --> 00:01:54,230 digo, vale, como es un cliente 19 00:01:54,230 --> 00:01:56,549 porque sé que lo es a todos los efectos 20 00:01:56,549 --> 00:01:57,950 porque ya he analizado 21 00:01:57,950 --> 00:02:00,030 mi aplicación, he visto todos los casos 22 00:02:00,030 --> 00:02:01,810 todas las situaciones, la tengo muy analizada 23 00:02:01,810 --> 00:02:02,730 y he visto que lo es 24 00:02:02,730 --> 00:02:04,609 pues entonces 25 00:02:04,609 --> 00:02:06,569 hago mi Stents 26 00:02:06,569 --> 00:02:09,490 ¿Dijiste que no? 27 00:02:13,099 --> 00:02:13,860 ¿Que llevan en mayúscula? 28 00:02:15,680 --> 00:02:16,479 Que es una 29 00:02:16,479 --> 00:02:18,960 es muy habitual, porque normalmente 30 00:02:18,960 --> 00:02:21,500 son datos constantes 31 00:02:21,500 --> 00:02:22,960 para que usen todas las, entonces es 32 00:02:22,960 --> 00:02:24,439 relativamente habitual que los encontréis 33 00:02:24,439 --> 00:02:25,819 escritos con mayúsculas 34 00:02:25,819 --> 00:02:26,819 ¿Todo mayúscula o qué pi? 35 00:02:26,819 --> 00:02:28,099 Todo, todo mayúscula. 36 00:02:30,469 --> 00:02:30,710 Vale. 37 00:02:31,590 --> 00:02:31,990 Vale. 38 00:02:32,490 --> 00:02:34,009 Depende de lo que representen, claro. 39 00:02:35,050 --> 00:02:37,650 Bueno, pues cuando representan constantes, 40 00:02:37,710 --> 00:02:38,610 que es la mayoría de los casos, 41 00:02:38,729 --> 00:02:42,530 pues como pi, el número e, 42 00:02:42,610 --> 00:02:45,189 todos esos que vimos en la clase más del último día, 43 00:02:45,389 --> 00:02:47,169 pues ya vemos que van con mayúsculas. 44 00:02:48,090 --> 00:02:48,870 Vale, a ver, entonces, 45 00:02:49,569 --> 00:02:51,669 yo tengo esta nueva entidad, cliente VIP, 46 00:02:52,289 --> 00:02:53,909 al darme cuenta de que un cliente VIP 47 00:02:53,909 --> 00:02:56,229 a todos los efectos de mi aplicación, 48 00:02:56,229 --> 00:02:57,389 para todos los efectos 49 00:02:57,389 --> 00:03:00,250 y todo esto viene porque he hecho un buen análisis 50 00:03:00,250 --> 00:03:02,189 yo no tendría que estar aquí sentada 51 00:03:02,189 --> 00:03:04,210 escribiendo si antes 52 00:03:04,210 --> 00:03:06,110 no he hecho un buen análisis en el que he entendido 53 00:03:06,110 --> 00:03:08,030 exactamente qué es cada entidad 54 00:03:08,030 --> 00:03:10,270 por qué se caracteriza 55 00:03:10,270 --> 00:03:12,650 qué va a hacer 56 00:03:12,650 --> 00:03:14,069 en mi aplicación, hasta que no tenga 57 00:03:14,069 --> 00:03:16,370 todo eso entendidísimo, no tiene sentido que uno se siente 58 00:03:16,370 --> 00:03:18,250 que hay que hacer nada, bueno, como ahora lo tengo 59 00:03:18,250 --> 00:03:20,689 entendidísimo, ya he visto que a todos los efectos 60 00:03:20,689 --> 00:03:22,090 un cliente VIP 61 00:03:22,090 --> 00:03:24,469 es un cliente también, no hay nada que le distinga 62 00:03:24,469 --> 00:03:26,629 de un cliente, a todos los objetos es un cliente 63 00:03:26,629 --> 00:03:28,030 pero además 64 00:03:28,030 --> 00:03:29,830 añade algo particular 65 00:03:29,830 --> 00:03:32,069 ¿qué añade? 66 00:03:32,349 --> 00:03:34,169 pues bueno, añade en este caso 67 00:03:34,169 --> 00:03:36,530 nos dicho por ejemplo la dirección 68 00:03:36,530 --> 00:03:40,129 añade esto 69 00:03:40,129 --> 00:03:44,849 vale, pues ahora ya tengo 70 00:03:44,849 --> 00:03:45,669 dos clases 71 00:03:45,669 --> 00:03:48,830 dos clases de las que yo instancio 72 00:03:48,830 --> 00:03:50,469 objetos completamente 73 00:03:50,469 --> 00:03:51,770 distintos 74 00:03:51,770 --> 00:03:54,729 uno es de la clase cliente y otro es de la clase 75 00:03:54,729 --> 00:03:56,590 cliente VIP, instancio todos los objetos 76 00:03:56,590 --> 00:03:57,629 que quiera de cada clase 77 00:03:57,629 --> 00:04:00,310 bueno, pues vamos a hacer 78 00:04:00,310 --> 00:04:01,250 un main ahora 79 00:04:01,250 --> 00:04:14,599 vale, pues yo tengo aquí mi main 80 00:04:14,599 --> 00:04:17,600 por supuesto puedo crear objetos cliente 81 00:04:17,600 --> 00:04:19,480 normales y corrientes, como siempre 82 00:04:19,480 --> 00:04:21,860 cliente c1 83 00:04:21,860 --> 00:04:25,689 new cliente 84 00:04:26,290 --> 00:04:27,649 vale 85 00:04:27,649 --> 00:04:29,769 se ha creado 86 00:04:29,769 --> 00:04:31,689 con su constructor por defecto 87 00:04:31,689 --> 00:04:33,889 porque no he hecho ningún constructor 88 00:04:33,889 --> 00:04:35,730 aquí, entonces recordad 89 00:04:35,730 --> 00:04:37,329 que si uno no especifica 90 00:04:37,329 --> 00:04:38,810 un constructor es ahí 91 00:04:38,810 --> 00:04:41,149 se supone que hay uno por defecto 92 00:04:41,149 --> 00:04:42,589 sin parámetros que no hace nada 93 00:04:42,589 --> 00:04:44,149 vale 94 00:04:44,149 --> 00:04:46,810 vale, pues igual que puedo hacer 95 00:04:46,810 --> 00:04:49,009 un cliente o dos o tres o mil 96 00:04:49,009 --> 00:04:50,949 pues puedo hacer también 97 00:04:50,949 --> 00:04:52,410 objetos cliente VIP 98 00:04:52,410 --> 00:04:53,709 también tranquilamente 99 00:04:53,709 --> 00:05:09,839 ah, que no he puesto nombre en la variable 100 00:05:09,839 --> 00:05:18,050 vale, y aquí está 101 00:05:18,050 --> 00:05:19,970 mi cliente VIP 102 00:05:19,970 --> 00:05:22,490 hasta ahí, todo como siempre 103 00:05:22,490 --> 00:05:24,290 y C1 es 104 00:05:24,290 --> 00:05:26,149 completamente independiente de C2 105 00:05:26,149 --> 00:05:29,149 C1 tiene sus dos propiedades 106 00:05:29,149 --> 00:05:30,850 Nombre y NIF 107 00:05:30,850 --> 00:05:32,470 Y 108 00:05:32,470 --> 00:05:34,910 C2 tiene sus 109 00:05:34,910 --> 00:05:35,970 Tres propiedades 110 00:05:35,970 --> 00:05:38,910 Nombre, NIF y 111 00:05:38,910 --> 00:05:40,629 Y dirección 112 00:05:40,629 --> 00:05:41,790 ¿Vale? 113 00:05:42,370 --> 00:05:44,870 Entonces yo aquí podría, estoy pasando de los 114 00:05:44,870 --> 00:05:46,750 Getter y los Setter y todo un poco por comodidad 115 00:05:46,750 --> 00:05:48,790 Pero sería igual, pues yo aquí podría 116 00:05:48,790 --> 00:05:51,029 Ponerle a mi cliente 1 su NIF 117 00:05:51,029 --> 00:05:55,029 Podría ponerle 118 00:05:55,029 --> 00:05:57,370 A mi cliente 1 su nombre 119 00:05:57,370 --> 00:06:06,920 No es que aún no es VIP 120 00:06:06,920 --> 00:06:08,079 Es que no es VIP 121 00:06:08,079 --> 00:06:09,800 No está destinado a ser VIP 122 00:06:09,800 --> 00:06:11,860 Es un cliente C1 123 00:06:11,860 --> 00:06:13,639 Y solo tiene estas dos propiedades 124 00:06:13,639 --> 00:06:14,699 Y ya está y no tiene más 125 00:06:14,699 --> 00:06:16,019 Las que tiene aquí 126 00:06:16,019 --> 00:06:16,980 Vale 127 00:06:16,980 --> 00:06:26,519 Pues este de aquí 128 00:06:26,519 --> 00:06:28,459 Este de aquí, C2 129 00:06:28,459 --> 00:06:30,980 Como vemos 130 00:06:30,980 --> 00:06:33,300 Este sí que tiene tres propiedades distintas 131 00:06:33,300 --> 00:06:35,220 pues yo le puedo poner su if 132 00:06:35,220 --> 00:06:36,220 el que me dé la gana 133 00:06:36,220 --> 00:06:58,769 y estos son dos objetos 134 00:06:58,769 --> 00:07:00,970 independientes, este tiene 135 00:07:00,970 --> 00:07:03,029 sus propiedades y este tiene 136 00:07:03,029 --> 00:07:05,009 sus otras, o sea la herencia 137 00:07:05,009 --> 00:07:07,250 no establece entre ellos una relación 138 00:07:07,250 --> 00:07:08,569 en tiempo de ejecución 139 00:07:08,569 --> 00:07:11,310 o sea la herencia no es una relación entre objetos 140 00:07:11,310 --> 00:07:13,250 este es 141 00:07:13,250 --> 00:07:15,110 un objeto y este es otro y van por libre 142 00:07:15,110 --> 00:07:16,610 la herencia 143 00:07:16,610 --> 00:07:19,410 en realidad es una relación en tiempo 144 00:07:19,410 --> 00:07:20,769 de escritura de código 145 00:07:20,769 --> 00:07:23,569 stents, lo que me permite 146 00:07:23,569 --> 00:07:25,069 es ahorrarme el copia y pega 147 00:07:25,069 --> 00:07:26,970 pero son dos objetos independientes 148 00:07:26,970 --> 00:07:29,529 ¿vale? no tienen nada que ver el uno con el otro 149 00:07:29,529 --> 00:07:33,649 bueno pues hasta ahí 150 00:07:33,649 --> 00:07:35,410 tampoco hemos ganado 151 00:07:35,410 --> 00:07:37,610 nada respecto a olvidarnos de la herencia 152 00:07:37,610 --> 00:07:39,310 ¿no? porque yo 153 00:07:39,310 --> 00:07:41,269 podría haber hecho aquí en cliente VIP 154 00:07:41,269 --> 00:07:43,310 haber hecho mi copia y pega 155 00:07:43,310 --> 00:07:45,269 si yo hago mi copia y pega 156 00:07:45,269 --> 00:07:47,430 lo pongo aquí y quito 157 00:07:47,430 --> 00:07:49,250 el stents, estoy en la misma 158 00:07:49,250 --> 00:07:50,769 situación ¿verdad? 159 00:07:52,170 --> 00:07:52,449 ¿no? 160 00:07:52,529 --> 00:07:54,410 podría decir, mira voy a pasar de la 161 00:07:54,410 --> 00:07:55,689 claro que hasta aquí 162 00:07:55,689 --> 00:07:58,410 tampoco es que hayamos aportado nada especialmente 163 00:07:58,410 --> 00:08:00,410 estupendo, porque podría decir 164 00:08:00,410 --> 00:08:01,930 bueno hombre, solo el copia y pega 165 00:08:01,930 --> 00:08:04,350 pues para eso 166 00:08:04,350 --> 00:08:05,370 te haces esto 167 00:08:05,370 --> 00:08:09,750 te haces esto, quitas el stents 168 00:08:09,750 --> 00:08:12,129 y estás haciendo 169 00:08:12,129 --> 00:08:14,069 exactamente lo mismo, pues sí 170 00:08:14,069 --> 00:08:16,069 efectivamente, estamos haciendo 171 00:08:16,069 --> 00:08:17,370 exactamente lo mismo 172 00:08:17,370 --> 00:08:20,170 lo mismo, vale 173 00:08:20,170 --> 00:08:22,209 pero 174 00:08:22,209 --> 00:08:24,269 como hemos identificado que un cliente 175 00:08:24,269 --> 00:08:26,170 viper era de cliente, pues hemos dicho, bueno, 176 00:08:26,329 --> 00:08:27,430 pues voy a marcarlo 177 00:08:27,430 --> 00:08:29,050 y además 178 00:08:29,050 --> 00:08:31,810 ya no copio esto aquí. 179 00:08:32,129 --> 00:08:34,149 Pero es una cuestión de copia y pega hasta ahora. 180 00:08:34,309 --> 00:08:34,769 Nada más. 181 00:08:36,129 --> 00:08:38,669 Luego estos objetos son absolutamente independientes. 182 00:08:39,350 --> 00:08:40,190 C2 no tiene ninguna 183 00:08:40,190 --> 00:08:41,950 relación con C1. Absolutamente ninguna. 184 00:08:42,470 --> 00:08:44,110 C1 tiene su NIF y su nombre 185 00:08:44,110 --> 00:08:46,309 y C2 tiene su NIF, su nombre 186 00:08:46,309 --> 00:08:48,230 y su dirección. No tiene ninguna 187 00:08:48,230 --> 00:08:49,149 relación uno con el otro. 188 00:08:52,340 --> 00:08:54,440 ¿Qué es lo que sí que ganamos? 189 00:08:55,679 --> 00:08:55,879 Pues 190 00:08:55,879 --> 00:08:57,840 esto de aquí 191 00:08:57,840 --> 00:08:59,960 yo tengo un objeto 192 00:08:59,960 --> 00:09:01,139 ahora mismo 193 00:09:01,139 --> 00:09:02,840 C3 194 00:09:02,840 --> 00:09:06,419 que voy a instanciar en algún momento 195 00:09:06,419 --> 00:09:08,100 en algún momento lo crearé 196 00:09:08,100 --> 00:09:10,100 es un espacio ahí para un cliente 197 00:09:10,100 --> 00:09:11,120 que aparecerá 198 00:09:11,120 --> 00:09:14,100 pero todavía no sé qué tipo de cliente va a ser 199 00:09:14,100 --> 00:09:14,820 no tengo ni idea 200 00:09:14,820 --> 00:09:16,539 bueno 201 00:09:16,539 --> 00:09:19,379 pues lo declaro como cliente 202 00:09:19,379 --> 00:09:22,059 porque no sé si va a ser cliente normal 203 00:09:22,059 --> 00:09:24,000 o cliente B, pero un cliente va a ser 204 00:09:24,000 --> 00:09:26,399 porque recordemos que cliente VIP 205 00:09:26,399 --> 00:09:28,120 en realidad es un caso particular 206 00:09:28,120 --> 00:09:30,919 luego un cliente, no sé qué tipo de cliente va a ser 207 00:09:30,919 --> 00:09:31,919 pero un cliente va a ser 208 00:09:31,919 --> 00:09:35,039 pues yo lo declaro como cliente 209 00:09:35,039 --> 00:09:35,820 y ahí 210 00:09:35,820 --> 00:09:38,480 puede pasar lo que sea, cualquier cosa 211 00:09:38,480 --> 00:09:40,799 ahora toca el momento de crear el cliente 212 00:09:40,799 --> 00:09:42,840 pues al objeto 213 00:09:42,840 --> 00:09:45,220 C3 puedo guardar 214 00:09:45,220 --> 00:09:47,159 cualquier tipo de objeto 215 00:09:47,159 --> 00:09:49,700 eso es lo importante 216 00:09:49,700 --> 00:09:55,519 que puedo guardar 217 00:09:55,519 --> 00:09:56,759 objetos de la 218 00:09:56,759 --> 00:09:58,559 clase 219 00:09:58,559 --> 00:09:59,960 cliente 220 00:09:59,960 --> 00:10:08,029 o de cualquier subclase 221 00:10:08,029 --> 00:10:09,909 de cualquier subclase 222 00:10:09,909 --> 00:10:11,769 entonces ahora llega el momento en que ya 223 00:10:11,769 --> 00:10:13,070 C3 va a cobrar valor 224 00:10:13,070 --> 00:10:15,549 ahora ya C3 va a aparecer en mi programa 225 00:10:15,549 --> 00:10:16,450 y va a cobrar valor 226 00:10:16,450 --> 00:10:19,210 por supuesto puede recibir un cliente normal 227 00:10:19,210 --> 00:10:21,870 pero es que C3 también puede recibir 228 00:10:21,870 --> 00:10:23,669 un cliente VIP 229 00:10:23,669 --> 00:10:24,610 si a mi me da la gana 230 00:10:24,610 --> 00:10:26,789 y no hay ningún problema 231 00:10:26,789 --> 00:10:29,610 aunque esté declarado como cliente 232 00:10:29,610 --> 00:10:31,710 puede recibir un objeto 233 00:10:31,710 --> 00:10:33,169 de la propia clase cliente 234 00:10:33,169 --> 00:10:35,210 o de cualquiera de las subclases 235 00:10:35,210 --> 00:10:36,570 me da igual 236 00:10:36,570 --> 00:10:39,610 porque el cliente VIP es un objeto 237 00:10:39,610 --> 00:10:40,049 también 238 00:10:40,049 --> 00:10:49,549 entonces 239 00:10:49,549 --> 00:10:52,490 esto sobre todo 240 00:10:52,490 --> 00:10:54,610 lo vemos más utilidad 241 00:10:54,610 --> 00:10:57,169 cuando tenemos que hacer muchos objetos 242 00:10:57,169 --> 00:10:58,009 que es lo habitual 243 00:10:58,009 --> 00:11:00,309 yo tengo un array de clientes 244 00:11:00,309 --> 00:11:01,929 un montón de array de clientes 245 00:11:01,929 --> 00:11:06,419 voy a trabajar con 100 por ejemplo 246 00:11:06,419 --> 00:11:09,259 con 100 247 00:11:09,259 --> 00:11:11,299 y ahora 248 00:11:11,299 --> 00:11:13,240 Cada cliente del array 249 00:11:13,240 --> 00:11:15,059 Puede ser del tipo que le dé la gana 250 00:11:15,059 --> 00:11:17,379 Por ejemplo 251 00:11:17,379 --> 00:11:18,279 Por ejemplo 252 00:11:18,279 --> 00:11:20,000 Clientes 0 253 00:11:20,000 --> 00:11:23,200 Pues aquí quiero meter o me toca meter 254 00:11:23,200 --> 00:11:25,080 O me han dicho que meta o lo que sea 255 00:11:25,080 --> 00:11:26,519 Un cliente normal 256 00:11:26,519 --> 00:11:28,299 Vale, pues ahí va un cliente normal 257 00:11:28,299 --> 00:11:31,080 Pero en clientes 1 258 00:11:31,080 --> 00:11:32,539 Toca meter o 259 00:11:32,539 --> 00:11:34,559 Me han dicho o lo que sea 260 00:11:34,559 --> 00:11:36,980 Toca meter un cliente VIP 261 00:11:36,980 --> 00:11:39,000 Bueno, pues ahí puede ir 262 00:11:39,000 --> 00:11:39,840 Un cliente VIP 263 00:11:39,840 --> 00:11:49,539 Y ningún problema. 264 00:11:56,039 --> 00:11:58,559 Entonces, esta es la utilidad fundamental. 265 00:11:59,240 --> 00:12:06,220 Luego ya, claro, tiene detalles para que todo esto encaje dentro de la aplicación completa. 266 00:12:06,360 --> 00:12:07,179 Pero la idea es esta. 267 00:12:07,580 --> 00:12:14,340 Dentro de una referencia de la superclase, puedo meter objetos de cualquiera de las subclases. 268 00:12:15,120 --> 00:12:15,720 Esta es la idea. 269 00:12:18,830 --> 00:12:23,870 Vale, lo único es que, claro, ahora tenemos un pequeño problemilla. 270 00:12:23,870 --> 00:12:25,750 si yo lo he trabajado así 271 00:12:25,750 --> 00:12:28,350 si he declarado la referencia 272 00:12:28,350 --> 00:12:29,950 como cliente, porque 273 00:12:29,950 --> 00:12:31,830 todavía no sé, todavía no sé 274 00:12:31,830 --> 00:12:33,950 qué tipo de cliente va a ir, no sé si va a ir 275 00:12:33,950 --> 00:12:35,929 VIP, si va a ir no sé qué, no sé qué tipo de cliente 276 00:12:35,929 --> 00:12:38,230 va a ir, le he declarado como C3 277 00:12:38,230 --> 00:12:39,789 ahora yo 278 00:12:39,789 --> 00:12:41,490 quiero por ejemplo rellenar el nombre 279 00:12:41,490 --> 00:12:46,649 eh 280 00:12:46,649 --> 00:12:49,409 ningún problema, nombre, vale 281 00:12:49,409 --> 00:12:51,389 pues este nuevo cliente, venga 282 00:12:51,389 --> 00:12:52,450 ya está 283 00:12:52,450 --> 00:12:55,529 ahora, quiero 284 00:12:55,529 --> 00:12:57,370 rellenar el NIF 285 00:12:57,370 --> 00:12:58,929 muy bien, ningún problema 286 00:12:58,929 --> 00:13:00,190 aquí está el NIF 287 00:13:00,190 --> 00:13:03,809 pero ahora de este objeto C3 que acabo de crear 288 00:13:03,809 --> 00:13:05,129 de este objeto 289 00:13:05,129 --> 00:13:07,009 como lo he creado como cliente VIP 290 00:13:07,009 --> 00:13:08,669 tiene espacio para sus tres campos 291 00:13:08,669 --> 00:13:10,909 pues ahora quiero yo 292 00:13:10,909 --> 00:13:12,769 rellenar la dirección 293 00:13:12,769 --> 00:13:18,889 y quiero poner ahí lo que sea 294 00:13:18,889 --> 00:13:23,240 pues el compilador aquí 295 00:13:23,240 --> 00:13:25,279 se queja 296 00:13:25,279 --> 00:13:27,379 y te protesta 297 00:13:27,379 --> 00:13:29,320 y no te deja 298 00:13:29,320 --> 00:13:30,919 porque el compilador 299 00:13:30,919 --> 00:13:32,519 trabaja con reglas muy estrictas 300 00:13:32,519 --> 00:13:34,559 y dice, vamos a ver, C3 301 00:13:34,559 --> 00:13:36,759 C3 voy a buscar 302 00:13:36,759 --> 00:13:38,000 cómo está declarado 303 00:13:38,000 --> 00:13:40,799 el compilador mira cómo está declarado 304 00:13:40,799 --> 00:13:42,559 no cómo está instanciado, eso no le importa 305 00:13:42,559 --> 00:13:44,519 porque puede estar instanciado de cualquier manera 306 00:13:44,519 --> 00:13:46,639 eso le da igual, puede estar instanciado como 307 00:13:46,639 --> 00:13:48,620 BIP, como, él mira cómo 308 00:13:48,620 --> 00:13:50,799 está declarado, dice, a ver C3 309 00:13:50,799 --> 00:13:52,080 tú cómo estás declarado 310 00:13:52,080 --> 00:13:54,779 estás declarado como cliente 311 00:13:54,779 --> 00:13:56,980 vamos a ver qué tiene cliente 312 00:13:56,980 --> 00:13:58,940 qué tiene nombre y NIF, no tiene más 313 00:13:58,940 --> 00:14:00,980 con lo cual lo siento mucho 314 00:14:00,980 --> 00:14:03,299 no te dejo 315 00:14:03,299 --> 00:14:05,139 acceder a esta propiedad 316 00:14:05,139 --> 00:14:07,679 porque C3 lo has declarado 317 00:14:07,679 --> 00:14:08,740 como cliente 318 00:14:08,740 --> 00:14:11,200 y aquí 319 00:14:11,200 --> 00:14:13,700 no hay cliente, entonces no puedo 320 00:14:13,700 --> 00:14:17,440 físicamente 321 00:14:17,440 --> 00:14:19,559 el objeto claro que tiene ese espacio 322 00:14:19,559 --> 00:14:21,860 lo tiene porque yo lo he instanciado como no cliente 323 00:14:21,860 --> 00:14:22,919 físicamente está 324 00:14:22,919 --> 00:14:25,500 pero a nivel de escritura de código 325 00:14:25,500 --> 00:14:27,440 el compilador no me deja 326 00:14:27,440 --> 00:14:29,480 porque él sigue sus reglas y sus reglas 327 00:14:29,480 --> 00:14:33,519 son claras. Si C3 es de clase cliente, lo siento mucho, pero no te 328 00:14:33,519 --> 00:14:37,480 dejo acceder a una propiedad que no está. Claro, es que 329 00:14:37,480 --> 00:14:40,899 aquí entra a hacer el diseño correcto, pues con getter y setter. 330 00:14:41,620 --> 00:14:44,440 Porque los métodos también se heredan. 331 00:14:45,860 --> 00:14:48,700 Entonces, ¿cómo haríamos esto? No lo haríamos así. 332 00:14:49,759 --> 00:14:53,259 ¿Cómo haríamos esto si lo hiciéramos bien hecho? Cliente tendría 333 00:14:53,259 --> 00:14:56,379 sus get y sus set. Estas serían propiedades privadas 334 00:14:56,379 --> 00:14:59,200 y cliente 335 00:14:59,200 --> 00:15:00,559 tendría sus get y set 336 00:15:00,559 --> 00:15:12,360 vale, aquí tendría sus get y sus set 337 00:15:12,360 --> 00:15:13,759 entonces ahora cliente vip 338 00:15:13,759 --> 00:15:15,340 vale 339 00:15:15,340 --> 00:15:18,159 esas propiedades las tiene 340 00:15:18,159 --> 00:15:20,240 aunque aquí no aparezcan, las tiene 341 00:15:20,240 --> 00:15:23,840 y además yo le añado 342 00:15:23,840 --> 00:15:25,480 esta, vale 343 00:15:25,480 --> 00:15:27,759 entonces no solo tiene estas 344 00:15:27,759 --> 00:15:30,039 propiedades, aunque yo no las vea físicamente 345 00:15:30,039 --> 00:15:31,620 no solo las tiene 346 00:15:31,620 --> 00:15:33,120 aquí 347 00:15:33,120 --> 00:15:35,480 sino que además 348 00:15:35,480 --> 00:15:37,360 tiene los get y los set 349 00:15:37,360 --> 00:15:39,820 porque todos los métodos 350 00:15:39,820 --> 00:15:41,580 se heredan, salvo los constructores 351 00:15:41,580 --> 00:15:42,440 también los tiene 352 00:15:42,440 --> 00:15:44,980 entonces ya aquí en cliente VIP 353 00:15:44,980 --> 00:15:47,159 con hacer el get y el set de dirección 354 00:15:47,159 --> 00:15:49,379 que es el único que tengo que añadir, suficiente 355 00:15:49,379 --> 00:15:56,730 ah, la tengo yo, mi get y set 356 00:15:56,730 --> 00:15:57,370 de dirección 357 00:15:57,370 --> 00:16:02,129 y ahora ya a través de esos get y set 358 00:16:02,129 --> 00:16:02,950 heredados 359 00:16:02,950 --> 00:16:06,070 ya accedo a las propiedades, que es lo que debería hacer 360 00:16:06,070 --> 00:16:07,809 a través de los get y set heredados 361 00:16:07,809 --> 00:16:09,289 entonces ahora 362 00:16:09,289 --> 00:16:11,789 ¿qué problema tengo yo aquí? 363 00:16:11,789 --> 00:16:22,990 Y lógicamente, que no puedo acceder a la propiedad directamente, pues que quiero setNif, ala, ya está, del cliente C1. 364 00:16:22,990 --> 00:16:35,570 Ahora quiero ponerle un nombre a este cliente, setNombre, pues el que fuera, vale. 365 00:16:35,570 --> 00:16:37,629 Ahora, este cliente VIP 366 00:16:37,629 --> 00:16:39,250 Este cliente VIP 367 00:16:39,250 --> 00:16:42,610 Puede tranquilamente 368 00:16:42,610 --> 00:16:44,649 Poner aquí su NIF 369 00:16:44,649 --> 00:16:46,169 Estoy rehaciéndolo de arriba 370 00:16:46,169 --> 00:16:48,889 Set NIF igual a esto 371 00:16:48,889 --> 00:16:58,480 Este cliente C2 372 00:16:58,480 --> 00:16:59,759 Puede, por supuesto 373 00:16:59,759 --> 00:17:02,220 Poner su nombre 374 00:17:02,220 --> 00:17:07,490 Y puede poner 375 00:17:07,490 --> 00:17:09,349 Su dirección a través del 376 00:17:09,349 --> 00:17:10,690 Set suyo 377 00:17:10,690 --> 00:17:23,690 Vale 378 00:17:23,690 --> 00:17:26,930 Y ahora, este que era el caso problemático 379 00:17:26,930 --> 00:17:29,210 este que era el caso problemático 380 00:17:29,210 --> 00:17:31,109 cliente declarado como 381 00:17:31,109 --> 00:17:33,930 clase cliente 382 00:17:33,930 --> 00:17:36,170 C3, declarado como clase cliente 383 00:17:36,170 --> 00:17:39,930 pero instanciado como subclase 384 00:17:39,930 --> 00:17:41,650 cliente VIP, entonces al estar 385 00:17:41,650 --> 00:17:43,829 instanciado como subclase 386 00:17:43,829 --> 00:17:45,809 cliente VIP, al estar instanciado así 387 00:17:45,809 --> 00:17:47,789 él tiene sus 388 00:17:47,789 --> 00:17:49,809 tres propiedades ahí en memoria, eso sí 389 00:17:49,809 --> 00:17:50,950 que no falla, tiene sus tres 390 00:17:50,950 --> 00:17:53,130 ahora las tres accesibles 391 00:17:53,130 --> 00:17:55,970 pero accesibles a través de 392 00:17:55,970 --> 00:17:58,210 esto de aquí 393 00:17:58,210 --> 00:17:59,710 setNif 394 00:17:59,710 --> 00:18:06,150 era nombre lo que tenía aquí 395 00:18:06,150 --> 00:18:07,990 setNombre 396 00:18:07,990 --> 00:18:08,730 vale 397 00:18:08,730 --> 00:18:14,500 cliente 398 00:18:14,500 --> 00:18:26,319 setNif, vale 399 00:18:26,319 --> 00:18:27,779 y ahora 400 00:18:27,779 --> 00:18:36,019 a ver, perdonad que se me ha ido la pinza y os he dicho una cosa mal 401 00:18:36,019 --> 00:18:36,900 vale 402 00:18:36,900 --> 00:18:39,519 que no la tiene accesible tal cual 403 00:18:39,519 --> 00:18:41,700 vale, entonces ahora nos viene 404 00:18:41,700 --> 00:18:42,660 el problema este 405 00:18:42,660 --> 00:18:45,700 c3.setDirección 406 00:18:45,700 --> 00:18:47,039 Set dirección. 407 00:18:48,259 --> 00:18:49,019 No sale. 408 00:18:50,059 --> 00:18:52,000 Si yo la forzara y la pusiera, 409 00:18:52,460 --> 00:18:53,799 set dirección, 410 00:18:54,559 --> 00:18:55,019 oslo. 411 00:18:57,279 --> 00:18:58,940 Si yo la forzara y la pusiera, 412 00:18:59,240 --> 00:19:01,420 el compilador vuelve a hacer lo mismo otra vez. 413 00:19:01,940 --> 00:19:03,119 Me vuelve a decir, espérate, 414 00:19:03,880 --> 00:19:06,759 C3 está declarado como cliente, 415 00:19:06,920 --> 00:19:11,480 vamos a ver si tienes un método set dirección aquí. 416 00:19:11,480 --> 00:19:12,960 Si lo tienes. 417 00:19:14,579 --> 00:19:15,259 Pues no. 418 00:19:15,700 --> 00:19:19,180 No lo tienes, entonces no te lo puedo permitir. 419 00:19:21,220 --> 00:19:23,680 Entonces, ¿qué es lo que tenemos que hacer? 420 00:19:24,740 --> 00:19:28,460 Pues como hemos visto que la instanciación es de cliente VIP 421 00:19:28,460 --> 00:19:30,960 y aquí ya estamos después de la instanciación, 422 00:19:32,140 --> 00:19:37,400 lo que aquí tenemos que hacer es un casting. 423 00:19:54,789 --> 00:19:57,849 Entonces, recordad lo que era un casting. 424 00:19:57,849 --> 00:20:01,430 Un casting era delante de una variable 425 00:20:01,430 --> 00:20:03,970 poner un tipo de dato 426 00:20:03,970 --> 00:20:04,750 al que le 427 00:20:04,750 --> 00:20:06,529 al que le convierto 428 00:20:06,529 --> 00:20:08,670 vale 429 00:20:08,670 --> 00:20:10,869 entonces 430 00:20:10,869 --> 00:20:12,950 yo aquí delante de C3 431 00:20:12,950 --> 00:20:15,109 pongo cliente VIP 432 00:20:15,109 --> 00:20:17,789 eso significa 433 00:20:17,789 --> 00:20:20,309 que le estoy diciendo al compilador 434 00:20:20,309 --> 00:20:21,269 le estoy diciendo 435 00:20:21,269 --> 00:20:21,769 oye 436 00:20:21,769 --> 00:20:23,470 trata C3 437 00:20:23,470 --> 00:20:24,890 como si fuera cliente VIP 438 00:20:24,890 --> 00:20:26,549 es lo que le estoy diciendo 439 00:20:26,549 --> 00:20:27,589 trata C3 440 00:20:27,589 --> 00:20:28,869 como si fuera cliente VIP 441 00:20:28,869 --> 00:20:29,970 vale 442 00:20:29,970 --> 00:20:31,150 pues él lo trata 443 00:20:31,150 --> 00:20:33,130 como si fuera cliente VIP. ¿Hay algún problema 444 00:20:33,130 --> 00:20:34,910 en que lo trate como si fuera cliente VIP? 445 00:20:35,309 --> 00:20:36,990 No hay ningún problema porque lo es. 446 00:20:37,869 --> 00:20:38,809 Entonces, este casting 447 00:20:38,809 --> 00:20:40,609 tiene que ser un casting controlado. 448 00:20:41,130 --> 00:20:42,849 Solo tiene sentido si C3 está 449 00:20:42,849 --> 00:20:45,009 instalado, instanciado previamente 450 00:20:45,009 --> 00:20:47,190 como cliente VIP. Si no está instanciado 451 00:20:47,190 --> 00:20:49,069 como cliente VIP, esto 452 00:20:49,069 --> 00:20:49,910 sería un desastre. 453 00:20:51,130 --> 00:20:53,029 ¿Vale? Entonces, están diciendo, oye, 454 00:20:53,589 --> 00:20:54,849 trátalo como cliente VIP. 455 00:20:54,990 --> 00:20:56,589 Entonces, al tratarlo como cliente VIP, 456 00:20:57,309 --> 00:20:58,970 ya me habilita todo 457 00:20:58,970 --> 00:21:00,049 lo que tenga cliente VIP. 458 00:21:01,150 --> 00:21:17,930 Pero este casting, este decirle trátalo como si fuera cliente BIT, tiene que estar conectado a que realmente esté creado como cliente BIT, porque si no, sería un desastre. El compilador lo tragaría, pero sería un desastre. 459 00:21:19,789 --> 00:21:29,259 Es decir, cuidado, imaginaos que… Bueno, sí, dime. 460 00:21:29,259 --> 00:21:40,289 claro, es que lo de los constructores 461 00:21:40,289 --> 00:21:42,269 lo vamos a ver ahora, porque los constructores al no heredarse 462 00:21:42,269 --> 00:21:44,289 hay que hacerlos de forma específica, ahora nos metemos 463 00:21:44,289 --> 00:21:46,190 vale, ahora nos metemos 464 00:21:46,190 --> 00:21:48,009 vale, entonces esta es la primera idea 465 00:21:48,009 --> 00:21:49,230 vale, entonces 466 00:21:49,230 --> 00:21:53,619 la clase heredera tiene 467 00:21:53,619 --> 00:21:55,779 copias y pegas de todo lo de arriba 468 00:21:55,779 --> 00:21:57,740 excepto constructores 469 00:21:57,740 --> 00:21:59,400 que ahora nos metemos con constructores 470 00:21:59,400 --> 00:22:00,319 excepto constructores 471 00:22:00,319 --> 00:22:03,440 ¿Qué implicaciones tiene? 472 00:22:04,099 --> 00:22:05,480 Que yo puedo instanciar 473 00:22:05,480 --> 00:22:07,480 Puedo instanciar 474 00:22:07,480 --> 00:22:10,460 Objetos de cualquier subclase 475 00:22:10,460 --> 00:22:12,920 Y meterlos en referencias de la superclase 476 00:22:12,920 --> 00:22:14,680 Pero 477 00:22:14,680 --> 00:22:17,220 Esto me trae un problema 478 00:22:17,220 --> 00:22:19,200 A la hora de escribir el código 479 00:22:19,200 --> 00:22:21,279 Por un tema de protección 480 00:22:21,279 --> 00:22:22,279 De que no hagas burradas 481 00:22:22,279 --> 00:22:24,019 ¿Qué es? 482 00:22:24,019 --> 00:22:25,160 Vale, muy bien 483 00:22:25,160 --> 00:22:27,440 Por ganar flexibilidad 484 00:22:27,440 --> 00:22:28,799 Por ganar flexibilidad 485 00:22:28,799 --> 00:22:30,779 hay veces que es imprescindible 486 00:22:30,779 --> 00:22:33,619 lo has declarado como cliente C3 487 00:22:33,619 --> 00:22:34,519 muy bien 488 00:22:34,519 --> 00:22:36,980 y luego lo has instanciado como cliente VIP 489 00:22:36,980 --> 00:22:38,240 bien, ningún problema 490 00:22:38,240 --> 00:22:41,299 pero entonces el compilador 491 00:22:41,299 --> 00:22:43,319 cuando tú trates de acceder 492 00:22:43,319 --> 00:22:44,900 a algo que está en cliente VIP 493 00:22:44,900 --> 00:22:47,299 no te lo va a permitir 494 00:22:47,299 --> 00:22:48,960 porque solo te va a permitir acceder 495 00:22:48,960 --> 00:22:50,960 a lo que esté aquí arriba 496 00:22:50,960 --> 00:22:53,039 tal y como se ha declarado 497 00:22:53,039 --> 00:22:55,920 entonces si queremos acceder 498 00:22:55,920 --> 00:22:57,039 a lo que tiene 499 00:22:57,039 --> 00:22:59,200 él como objeto instanciado 500 00:22:59,200 --> 00:23:00,740 a lo que tiene como objeto instanciado 501 00:23:00,740 --> 00:23:02,339 hay que decirle mediante un casting 502 00:23:02,339 --> 00:23:04,819 trátale como si fuera 503 00:23:04,819 --> 00:23:07,240 así, aunque esté declarado 504 00:23:07,240 --> 00:23:08,059 de la otra manera 505 00:23:08,059 --> 00:23:25,420 ¿vale? con este casting le decimos 506 00:23:25,420 --> 00:23:27,799 al compilador que lo considere 507 00:23:27,799 --> 00:23:29,240 como 508 00:23:29,240 --> 00:23:31,039 objeto 509 00:23:31,039 --> 00:23:33,119 de clase 510 00:23:33,119 --> 00:23:37,230 clase VIP 511 00:23:37,230 --> 00:23:45,269 ¿vale? es lo que le decimos con ese casting 512 00:23:45,269 --> 00:23:47,430 oye, consideralo pero para 513 00:23:47,430 --> 00:23:49,470 esta línea, solo de código, claro, para esta línea. 514 00:23:50,190 --> 00:23:51,569 Considéralo como objeto de clase 515 00:23:51,569 --> 00:23:53,470 VIP, de clase, perdón, cliente 516 00:23:53,470 --> 00:23:58,519 VIP. ¿Vale? Solo para esta línea 517 00:23:58,519 --> 00:24:00,500 de código. Considéralo como clase 518 00:24:00,500 --> 00:24:02,420 cliente VIP. Entonces, ahora ya 519 00:24:02,420 --> 00:24:04,000 podemos acceder a todo lo que hay adentro. 520 00:24:11,279 --> 00:24:11,500 ¿Vale? 521 00:24:13,440 --> 00:24:15,039 Entonces, claro, vosotros podéis decir, 522 00:24:15,680 --> 00:24:17,279 hombre, pero entonces 523 00:24:17,279 --> 00:24:19,339 si hay que decirle 524 00:24:19,339 --> 00:24:20,980 al compilador, porque el compilador 525 00:24:20,980 --> 00:24:22,440 se te queja y se te pone pesado, 526 00:24:23,079 --> 00:24:24,980 cuando quieres acceder a algo propio 527 00:24:24,980 --> 00:24:27,079 del objeto, algo propio y no heredado 528 00:24:27,079 --> 00:24:29,220 algo propio, hay que decirle 529 00:24:29,220 --> 00:24:30,740 que lo trate 530 00:24:30,740 --> 00:24:32,880 como objeto de esa clase 531 00:24:32,880 --> 00:24:34,279 pues para eso 532 00:24:34,279 --> 00:24:37,140 declarémoslo directamente como objeto de esa clase 533 00:24:37,140 --> 00:24:38,140 y nos ahorramos problemas 534 00:24:38,140 --> 00:24:41,279 si aquí lo hubiéramos 535 00:24:41,279 --> 00:24:43,359 declarado directamente como objeto 536 00:24:43,359 --> 00:24:44,640 cliente VIP 537 00:24:44,640 --> 00:24:46,900 me habría ahorrado tener que hacer 538 00:24:46,900 --> 00:24:50,230 todo esto, ¿verdad? 539 00:24:50,329 --> 00:24:52,430 es lo que hemos hecho arriba, si yo lo 540 00:24:52,430 --> 00:24:53,769 declaro como cliente VIP 541 00:24:53,769 --> 00:24:56,390 directamente no tengo que 542 00:24:56,390 --> 00:24:58,410 decirle al compilador, oye, trátalo como cliente VIP. 543 00:24:59,190 --> 00:25:00,509 Entonces, ¿por qué no lo hacemos 544 00:25:00,509 --> 00:25:02,490 siempre así? En lugar de declararlo 545 00:25:02,490 --> 00:25:03,829 como la superclase, 546 00:25:04,670 --> 00:25:06,490 luego ya instanciarlo como la 547 00:25:06,490 --> 00:25:08,670 subclase y entonces complicarnos 548 00:25:08,670 --> 00:25:10,529 la vida, porque no nos va a 549 00:25:10,529 --> 00:25:12,289 quedar más remedio que 550 00:25:12,289 --> 00:25:13,589 hacerle el casting. 551 00:25:14,369 --> 00:25:15,609 Para decirle, trátalo. 552 00:25:16,769 --> 00:25:17,750 Porque, primero, 553 00:25:18,369 --> 00:25:20,210 porque hay veces que no queda más remedio. 554 00:25:20,990 --> 00:25:21,650 Por ejemplo, ahora. 555 00:25:22,750 --> 00:25:24,549 Y segundo, en situaciones 556 00:25:24,549 --> 00:25:26,609 como esta, esta es la clave 557 00:25:26,609 --> 00:25:28,430 cuando tú quieres guardar 558 00:25:28,430 --> 00:25:30,490 un montón de objetos de diferentes 559 00:25:30,490 --> 00:25:32,930 tipos en una misma colección 560 00:25:32,930 --> 00:25:34,509 de datos, en este caso un array 561 00:25:34,509 --> 00:25:36,130 que es la misma colección de datos que conocemos 562 00:25:36,130 --> 00:25:38,329 cuando queremos guardar muchos 563 00:25:38,329 --> 00:25:39,990 en un mismo array 564 00:25:39,990 --> 00:25:42,710 es que aquí no hay tu tía, tienen que ir 565 00:25:42,710 --> 00:25:45,089 declarados todos como cliente, aquí no puedo elegir 566 00:25:45,089 --> 00:25:46,890 aquí no puedo elegir 567 00:25:46,890 --> 00:25:48,829 entonces 568 00:25:48,829 --> 00:25:49,650 aquí 569 00:25:49,650 --> 00:25:53,170 sí que tendría el problema 570 00:25:53,170 --> 00:25:54,309 que cliente es uno 571 00:25:54,309 --> 00:25:57,549 si clientes 1 le quiero fijar su dirección 572 00:25:57,549 --> 00:25:59,430 aquí por ejemplo 573 00:25:59,430 --> 00:26:01,470 a clientes 1 574 00:26:01,470 --> 00:26:03,210 le quiero fijar su dirección 575 00:26:03,210 --> 00:26:04,130 con set dirección 576 00:26:04,130 --> 00:26:06,829 pues no puedo 577 00:26:06,829 --> 00:26:13,809 tendría que hacer el casting 578 00:26:13,809 --> 00:26:16,190 vale 579 00:26:16,190 --> 00:26:18,250 pero claro 580 00:26:18,250 --> 00:26:20,529 tiene que ser un casting controlado 581 00:26:20,529 --> 00:26:22,150 ahora veremos un poco más 582 00:26:22,150 --> 00:26:23,930 también como controlarlo para no cargar 583 00:26:23,930 --> 00:26:26,190 no cargarnos el programa en ejecución 584 00:26:26,190 --> 00:26:27,950 porque yo puedo hacer casting 585 00:26:27,950 --> 00:26:30,170 a lo que me dé la gana, pero si no encaja 586 00:26:30,170 --> 00:26:32,009 ¿qué miráis con ese interés? 587 00:26:33,769 --> 00:26:35,329 Ah, no sabía que limpiaban eso. 588 00:26:39,230 --> 00:26:40,250 Bueno, ¿es más interesante 589 00:26:40,250 --> 00:26:40,829 eso que esto? 590 00:26:42,710 --> 00:26:43,390 No creo. 591 00:26:44,569 --> 00:26:44,930 Vale. 592 00:26:48,720 --> 00:26:49,180 Bueno, está 593 00:26:49,180 --> 00:26:51,539 claro que en esta situación 594 00:26:51,539 --> 00:26:53,579 que en esta situación 595 00:26:53,579 --> 00:26:56,000 es que no tenemos alternativa. 596 00:26:56,759 --> 00:26:58,039 Vamos a tener que hacer el casting 597 00:26:58,039 --> 00:26:59,940 porque todos los objetos que van aquí 598 00:26:59,940 --> 00:27:01,400 están declarados de este tipo. 599 00:27:01,759 --> 00:27:02,640 Entonces, no me queda más remedio. 600 00:27:03,559 --> 00:27:05,119 Pero hay otras situaciones en las cuales 601 00:27:05,119 --> 00:27:08,779 el declarar como la superclase es básico también. 602 00:27:09,680 --> 00:27:11,180 Por ejemplo, vamos a hacer un método 603 00:27:11,180 --> 00:27:15,779 para mostrar el nombre del cliente. 604 00:27:16,200 --> 00:27:18,240 Un método cualquiera que está por aquí 605 00:27:18,240 --> 00:27:31,359 para mostrar datos cliente. 606 00:27:32,940 --> 00:27:33,539 Vale. 607 00:27:33,539 --> 00:27:35,579 Entonces, mostrar datos cliente, 608 00:27:35,579 --> 00:27:38,539 El cliente hay que pasárselo como parámetro 609 00:27:38,539 --> 00:27:41,539 Bueno, pues aquí de nuevo nos viene la duda 610 00:27:41,539 --> 00:27:43,700 A ver, este método 611 00:27:43,700 --> 00:27:47,559 Quiero yo que me valga solo para clientes VIP 612 00:27:47,559 --> 00:27:49,940 Porque entonces a este método 613 00:27:49,940 --> 00:27:52,839 Le paso cliente VIP 614 00:27:52,839 --> 00:27:54,980 Vale 615 00:27:54,980 --> 00:27:59,660 Quiero que me valga para cualquier tipo de cliente 616 00:27:59,660 --> 00:28:01,119 Que este método lo pueda llamar 617 00:28:01,119 --> 00:28:02,819 Para mostrar datos de un cliente VIP 618 00:28:02,819 --> 00:28:04,019 Mostrar datos de un cliente 619 00:28:04,019 --> 00:28:06,140 sí, quiero poder llamar a este método 620 00:28:06,140 --> 00:28:07,660 para cualquier tipo de cliente. 621 00:28:08,359 --> 00:28:10,019 Pues entonces no te queda más remedio que llamarlo así. 622 00:28:11,680 --> 00:28:12,319 Entonces, este 623 00:28:12,319 --> 00:28:13,640 método le puedes pasar 624 00:28:13,640 --> 00:28:16,119 un objeto cliente normal, 625 00:28:17,000 --> 00:28:18,240 un objeto cliente VIP, 626 00:28:18,359 --> 00:28:19,420 porque también encaja ahí, 627 00:28:20,460 --> 00:28:22,160 un objeto cliente moroso, 628 00:28:22,160 --> 00:28:23,779 si tienes tú una subclase, 629 00:28:24,200 --> 00:28:26,220 cliente moroso de cliente, lo que te dé la gana. 630 00:28:27,460 --> 00:28:28,140 Entonces, esta es otra 631 00:28:28,140 --> 00:28:28,759 situación 632 00:28:28,759 --> 00:28:32,140 en la que es que no puedo elegir. 633 00:28:32,640 --> 00:28:33,839 Si yo quiero que este método 634 00:28:33,839 --> 00:28:35,940 sea usable, utilizable 635 00:28:35,940 --> 00:28:38,180 para cualquier tipo de cliente 636 00:28:38,180 --> 00:28:40,359 para cualquiera, tengo que poner 637 00:28:40,359 --> 00:28:42,220 aquí la referencia de la superclase 638 00:28:42,220 --> 00:28:44,460 porque si no tendría 639 00:28:44,460 --> 00:28:46,380 que hacer un método específico para mostrar datos 640 00:28:46,380 --> 00:28:47,900 cliente VIP, y aquí poner cliente VIP 641 00:28:47,900 --> 00:28:50,339 mostrar datos específicos 642 00:28:50,339 --> 00:28:52,279 cliente moroso, y ahí poner cliente moroso 643 00:28:52,279 --> 00:28:54,319 entonces no tiene sentido un método 644 00:28:54,319 --> 00:28:55,720 mostrar datos 645 00:28:55,720 --> 00:28:57,539 para cada tipo de cliente 646 00:28:57,539 --> 00:28:59,799 a mí me interesa más en mi aplicación 647 00:28:59,799 --> 00:29:02,220 un dato, mostrar dos clientes, le paso 648 00:29:02,220 --> 00:29:04,160 a un cliente y él ya 649 00:29:04,160 --> 00:29:06,059 que muestre, me da igual que sea BIP, que sea 650 00:29:06,059 --> 00:29:08,259 genérico, que sea lo que sea. 651 00:29:10,759 --> 00:29:11,240 Luego 652 00:29:11,240 --> 00:29:13,779 me voy a ver 653 00:29:13,779 --> 00:29:15,799 en muchas situaciones en las de 654 00:29:15,799 --> 00:29:18,160 situra de haber declarado 655 00:29:18,160 --> 00:29:19,779 una variable de una 656 00:29:19,779 --> 00:29:21,920 superclase y luego 657 00:29:21,920 --> 00:29:23,799 haberla instanciado como la subclase. 658 00:29:24,940 --> 00:29:26,339 Pues si eso ha ocurrido 659 00:29:26,339 --> 00:29:27,900 para acceder 660 00:29:27,900 --> 00:29:29,700 al contenido de la subclase 661 00:29:29,700 --> 00:29:31,279 tengo que hacer 662 00:29:31,279 --> 00:29:32,799 este casting. 663 00:29:33,980 --> 00:29:35,819 Tengo que hacer este casting 664 00:29:35,819 --> 00:29:37,380 ¿Te has muerto? 665 00:29:42,160 --> 00:29:42,720 Vale 666 00:29:42,720 --> 00:29:45,319 Ya vamos a 667 00:29:45,319 --> 00:29:47,619 Ya vamos a callarnos en breve 668 00:29:47,619 --> 00:29:51,380 Que no tenía nada que ver con programación 669 00:29:51,380 --> 00:29:53,880 Vale, entonces 670 00:29:53,880 --> 00:29:55,740 Ahora vosotros que estáis ahí 671 00:29:55,740 --> 00:29:57,099 Al quite de cualquier cosa 672 00:29:57,099 --> 00:29:58,539 Me diréis 673 00:29:58,539 --> 00:30:00,619 Ay, perdona 674 00:30:00,619 --> 00:30:05,430 Esta vez no va a pasar 675 00:30:05,430 --> 00:30:08,470 que ya estabais ahí con la incógnita 676 00:30:08,470 --> 00:30:10,349 diréis vosotros 677 00:30:10,349 --> 00:30:12,269 vale, estupendo, con esto 678 00:30:12,269 --> 00:30:14,049 de que la subclase 679 00:30:14,049 --> 00:30:16,250 cabe en la superclase, que bien 680 00:30:16,250 --> 00:30:17,930 un único método 681 00:30:17,930 --> 00:30:20,309 para mostrar datos de cualquier cliente 682 00:30:20,309 --> 00:30:22,230 estupendo, vale, pero ahora vienen los problemas 683 00:30:22,230 --> 00:30:23,609 cuando nos pongamos aquí dentro 684 00:30:23,609 --> 00:30:25,369 ahora vienen los problemas 685 00:30:25,369 --> 00:30:28,289 porque decimos, espérate, yo hago este método 686 00:30:28,289 --> 00:30:30,230 y es que no tengo ni idea 687 00:30:30,230 --> 00:30:32,650 de V que mostrar 688 00:30:32,650 --> 00:30:34,490 es decir, la dirección 689 00:30:34,490 --> 00:30:36,150 la puedo mostrar seguro. 690 00:30:37,710 --> 00:30:38,309 ¿Verdad? 691 00:30:38,990 --> 00:30:40,869 Es decir, v voy a poder 692 00:30:40,869 --> 00:30:42,890 mostrar su nif, perdón. 693 00:30:43,529 --> 00:30:44,170 Mucha dirección. 694 00:30:44,809 --> 00:30:45,970 Vale, hasta aquí sin problema. 695 00:30:47,970 --> 00:30:48,349 El 696 00:30:48,349 --> 00:30:50,950 nombre también 697 00:30:50,950 --> 00:30:52,750 estupendamente. 698 00:30:53,250 --> 00:30:54,829 Pero ahora me viene aquí un problema gordo 699 00:30:54,829 --> 00:30:56,970 que es, tú me has pasado un objeto 700 00:30:56,970 --> 00:30:58,450 cliente v 701 00:30:58,450 --> 00:31:00,970 y yo no sé 702 00:31:00,970 --> 00:31:02,430 si es un cliente normal 703 00:31:02,430 --> 00:31:04,170 o si es un cliente v. 704 00:31:04,490 --> 00:31:26,890 Porque en el caso de que sea un cliente VIP, la hemos liado, voy a necesitar mostrar aquí el otro dato que me falta. Si quiero que este método sea completo y funcione para todos, si quiero que sea completo y funcione para todos, tengo que averiguar de alguna manera si este que me has pasado se ha creado, se ha instanciado como VIP para además añadir lo que falta. 705 00:31:26,890 --> 00:31:28,750 pues así me he quedado 706 00:31:28,750 --> 00:31:31,390 ¿tengo alguna herramienta 707 00:31:31,390 --> 00:31:33,789 para ver cómo se ha instanciado 708 00:31:33,789 --> 00:31:35,369 un objeto 709 00:31:35,369 --> 00:31:36,549 de una superclase? 710 00:31:37,269 --> 00:31:38,990 sí que la tengo, que es el 711 00:31:38,990 --> 00:31:39,809 instance of 712 00:31:39,809 --> 00:31:42,710 entonces yo ahora, aquí he mostrado 713 00:31:42,710 --> 00:31:44,890 esto me vale, me da igual que v 714 00:31:44,890 --> 00:31:47,430 bueno, esto de v es que es muy feo 715 00:31:47,430 --> 00:31:53,230 me da igual que c 716 00:31:53,230 --> 00:31:54,910 sea genérico o v 717 00:31:54,910 --> 00:31:56,650 porque estas dos propiedades las tiene 718 00:31:56,650 --> 00:31:57,930 estas las voy a mostrar sí o sí 719 00:31:57,930 --> 00:31:59,910 pero ahora 720 00:31:59,910 --> 00:32:02,369 yo hago lo siguiente 721 00:32:02,369 --> 00:32:03,450 si c 722 00:32:03,450 --> 00:32:06,490 instance of 723 00:32:06,490 --> 00:32:09,970 cliente 724 00:32:09,970 --> 00:32:10,730 vip 725 00:32:10,730 --> 00:32:14,029 ¿y qué es el instance of? 726 00:32:14,630 --> 00:32:17,250 pues es un operador maravilloso 727 00:32:17,250 --> 00:32:18,390 que te dice 728 00:32:18,390 --> 00:32:20,670 si este objeto 729 00:32:20,670 --> 00:32:23,609 se instanció como esta clase 730 00:32:23,609 --> 00:32:25,750 si se instanció 731 00:32:25,750 --> 00:32:27,329 como la clase que pongas aquí 732 00:32:27,329 --> 00:32:28,769 eso te devuelve true 733 00:32:28,769 --> 00:32:30,569 si no te devuelve false 734 00:32:30,569 --> 00:32:33,809 entonces si el objeto que me han pasado aquí 735 00:32:33,809 --> 00:32:35,990 se instanció como cliente 736 00:32:35,990 --> 00:32:37,690 VIP, maravilloso 737 00:32:37,690 --> 00:32:39,589 ya sé que le puedo hacer ese casting 738 00:32:39,589 --> 00:32:40,930 y ya muestro lo que me falta 739 00:32:40,930 --> 00:32:43,809 entonces ahora ya podríamos hacer 740 00:32:43,809 --> 00:32:44,650 tranquilamente 741 00:32:44,650 --> 00:32:52,519 cliente VIP de C 742 00:32:52,519 --> 00:32:55,500 punto get dirección 743 00:32:55,500 --> 00:32:57,480 y ahora todo esto 744 00:32:57,480 --> 00:32:58,559 al system 745 00:32:58,559 --> 00:33:41,039 Me falta uno aquí 746 00:33:41,039 --> 00:33:42,339 Ese, me falta 747 00:33:42,339 --> 00:33:51,079 Pues este ahora ya es un método 748 00:33:51,079 --> 00:33:52,359 Como es la idea 749 00:33:52,359 --> 00:33:54,579 Que me vale para cualquier tipo de cliente 750 00:33:54,579 --> 00:33:55,319 Que esa es la idea 751 00:33:55,319 --> 00:33:57,640 Poder hacer una relación entre clases 752 00:33:57,640 --> 00:34:00,779 De forma que pueda yo tratar conjuntamente 753 00:34:00,779 --> 00:34:02,099 A todos los clientes 754 00:34:02,099 --> 00:34:03,099 Sean bien morosos 755 00:34:03,099 --> 00:34:04,799 a todos los animales 756 00:34:04,799 --> 00:34:06,480 sean gatos, perros, ratones 757 00:34:06,480 --> 00:34:08,940 así tengo que hacer los diseños 758 00:34:08,940 --> 00:34:11,099 entonces yo tengo un método, vamos a ver esto del cliente 759 00:34:11,099 --> 00:34:12,739 y le paso a un cliente 760 00:34:12,739 --> 00:34:15,099 que puede ser de cualquier 761 00:34:15,099 --> 00:34:16,579 tipo, de este 762 00:34:16,579 --> 00:34:18,820 o de las subclases, de cualquiera 763 00:34:18,820 --> 00:34:20,099 pero claro 764 00:34:20,099 --> 00:34:22,679 voy a tener que tirar de este operador 765 00:34:22,679 --> 00:34:24,699 no me va a quedar más remedio 766 00:34:24,699 --> 00:34:26,800 para ahora ya, una vez 767 00:34:26,800 --> 00:34:28,219 metida en las tripas del método 768 00:34:28,219 --> 00:34:30,739 pues distinguir en función 769 00:34:30,739 --> 00:34:32,900 del tipo que sea, hacer ya una cosa u otra 770 00:34:32,900 --> 00:34:35,820 porque serán objetos distintos, lógicamente 771 00:34:35,820 --> 00:34:46,039 bueno, pues la combinación de estas ideas 772 00:34:46,039 --> 00:34:48,280 es lo fundamental, luego a partir de aquí 773 00:34:48,280 --> 00:34:49,820 ya son detallitos 774 00:34:49,820 --> 00:34:52,199 pues de constructores, de no sé qué, de ciertas 775 00:34:52,199 --> 00:34:53,699 cosas, pero lo importante es tener 776 00:34:53,699 --> 00:34:55,639 la idea clara 777 00:34:55,639 --> 00:34:57,820 las ideas claras siguientes 778 00:34:57,820 --> 00:34:59,000 que 779 00:34:59,000 --> 00:35:02,179 la herencia con Stents 780 00:35:02,179 --> 00:35:04,280 lo que te facilita 781 00:35:04,280 --> 00:35:05,840 es, primero 782 00:35:05,840 --> 00:35:07,960 la escritura del código porque te permite 783 00:35:07,960 --> 00:35:09,659 crear otra clase distinta 784 00:35:09,659 --> 00:35:11,639 otra clase distinta 785 00:35:11,639 --> 00:35:14,099 copiando y pegando las propiedades de otra 786 00:35:14,099 --> 00:35:15,079 otra clase distinta 787 00:35:15,079 --> 00:35:18,239 pero claro, solamente la uso 788 00:35:18,239 --> 00:35:20,380 si realmente puedo enunciar 789 00:35:20,380 --> 00:35:21,619 cliente VIP 790 00:35:21,619 --> 00:35:23,099 es cliente 791 00:35:23,099 --> 00:35:25,440 si puedo sustituir extents por es 792 00:35:25,440 --> 00:35:27,719 entonces pues sí, tiene sentido 793 00:35:27,719 --> 00:35:29,900 si no puedo sustituir 794 00:35:29,900 --> 00:35:32,300 si esto no lo puedo 795 00:35:32,300 --> 00:35:33,119 sustituir 796 00:35:33,119 --> 00:35:35,179 por es 797 00:35:35,179 --> 00:35:36,199 y no me pega 798 00:35:36,199 --> 00:35:39,340 y me queda ahí una frase absurda 799 00:35:39,340 --> 00:35:41,079 pues ese diseño te lo tiras a la basura 800 00:35:41,079 --> 00:35:42,440 porque ese diseño está muy mal hecho 801 00:35:42,440 --> 00:35:45,280 ¿vale? eso por un lado 802 00:35:45,280 --> 00:35:46,380 bueno, pues entonces 803 00:35:46,380 --> 00:35:49,280 una vez que yo he establecido relaciones de herencia 804 00:35:49,280 --> 00:35:50,239 ya correctamente 805 00:35:50,239 --> 00:35:53,179 ahora yo puedo tratar a todos los objetos 806 00:35:53,179 --> 00:35:54,239 de las subclases 807 00:35:54,239 --> 00:35:56,039 a todos de forma común 808 00:35:56,039 --> 00:35:58,460 ¿vale? como aquí 809 00:35:58,460 --> 00:36:01,380 todos mis clientes 810 00:36:01,380 --> 00:36:03,559 todos mis clientes 811 00:36:03,559 --> 00:36:05,539 están metidos en referencias 812 00:36:05,539 --> 00:36:06,460 de tipo cliente 813 00:36:06,460 --> 00:36:08,820 y están tratados de forma común 814 00:36:08,820 --> 00:36:11,420 y ahora ya, que yo quiero mostrar datos 815 00:36:11,420 --> 00:36:12,940 de un cliente 816 00:36:12,940 --> 00:36:20,789 vale, pues por ejemplo 817 00:36:20,789 --> 00:36:22,550 mi método mostrar datos cliente 818 00:36:22,550 --> 00:36:27,360 que está aquí, pues le puedo pasar 819 00:36:27,360 --> 00:36:28,960 cualquier cliente 820 00:36:28,960 --> 00:36:31,159 le puedo pasar mi cliente 821 00:36:31,159 --> 00:36:32,820 C1, que era cliente normal 822 00:36:32,820 --> 00:36:34,659 vale 823 00:36:34,659 --> 00:36:36,860 se lo puedo pasar 824 00:36:36,860 --> 00:36:39,039 y mostrar los datos del C1 825 00:36:39,039 --> 00:36:41,539 Pero es que también a ese método 826 00:36:41,539 --> 00:36:45,320 También le puedo pasar el C2 827 00:36:45,320 --> 00:36:46,219 Que era de otro tipo 828 00:36:46,219 --> 00:36:49,159 Y me mostrará en ese caso 829 00:36:49,159 --> 00:36:50,340 Los datos del otro 830 00:36:50,340 --> 00:36:52,559 Y le puedo pasar cualquier objeto 831 00:36:52,559 --> 00:36:55,500 Que sea de la clase cliente o de las subclases 832 00:36:55,500 --> 00:36:56,619 ¿Vale? 833 00:36:56,639 --> 00:36:57,519 Aquí en este caso 834 00:36:57,519 --> 00:37:00,639 Voy a ver las C1 y C2 835 00:37:00,639 --> 00:37:03,599 Que C1 tenía esto y C2 tenía esto 836 00:37:03,599 --> 00:37:04,440 Pues voy a ver 837 00:37:04,440 --> 00:37:06,880 Las cinco líneas cuando ejecute esto 838 00:37:06,880 --> 00:37:33,539 El primer mostrar datos me ha hecho esto, los datos del primer cliente que era cliente normal y el segundo mostrar datos, este de aquí, me ha hecho esto, me ha mostrado el segundo, o sea, son dos objetos distintos de clases distintas, pero las he podido tratar con el mismo método. 839 00:37:33,539 --> 00:37:50,559 Y esto sin la herencia tendría que haber hecho mostrar datos cliente general, mostrar datos cliente VIP. Sin la herencia tendría que duplicar un método por cada subclase, una colección por cada subclase, ¿vale? 840 00:37:53,760 --> 00:37:55,840 Vale, venga, pues ahora ya sí que paramos aquí.