1 00:00:00,750 --> 00:00:08,789 Vale, voy a grabar este ejemplo así si habláis, si os interesáis a grabar vuestra voz, ¿vale? 2 00:00:08,929 --> 00:00:13,150 Entonces voy a crear un pequeño ejemplo de clase abstracta, ¿vale? 3 00:00:13,150 --> 00:00:18,750 Lo hemos hablado tanto, mucho, por lo tanto vamos a trabajar con esto de las figuras geométricas 4 00:00:18,750 --> 00:00:22,910 porque es más o menos más claro en la cabeza, como primer ejemplo. 5 00:00:23,050 --> 00:00:24,989 Luego hacemos ejemplos sobre otras cosas, ¿vale? 6 00:00:24,989 --> 00:00:32,929 Entonces, voy a crearme una clase, que es la clase figura o figura geométrica, ¿vale? 7 00:00:34,270 --> 00:00:42,990 Esta clase de aquí quiero que sea una clase abstracta, es decir, por ahora no dejamos las abstractas, luego así vemos qué pasa, ¿vale? 8 00:00:43,369 --> 00:00:50,969 Entonces, una clase figura, cuando tengo una figura tengo que tener algo común a todas las figuras del multiverso. 9 00:00:50,969 --> 00:01:05,750 que tiene en todas las figuras del multiverso, triángulo, cuadrado, rectángulo, y un método 10 00:01:05,750 --> 00:01:38,599 que por ejemplo es si public void dimeLados que dice si tengo más numLados, string s es igual 11 00:01:38,599 --> 00:01:41,420 a numlados 12 00:01:41,420 --> 00:01:48,650 si 13 00:01:48,650 --> 00:01:52,269 numlados 14 00:01:52,269 --> 00:01:54,909 menos o igual a cero 15 00:01:54,909 --> 00:01:58,719 S es igual 16 00:01:58,719 --> 00:02:01,099 infinitos 17 00:02:01,099 --> 00:02:08,259 ¿Os gusta? 18 00:02:10,580 --> 00:02:11,840 Así cuando tengo el círculo 19 00:02:11,840 --> 00:02:14,080 le pondré cero lados 20 00:02:14,080 --> 00:02:17,000 y así me dice que tiene lados infinitos. 21 00:02:18,740 --> 00:02:18,840 ¿Sí? 22 00:02:19,960 --> 00:02:20,900 Va, ok. 23 00:02:20,900 --> 00:02:23,099 Esto es mi figura. 24 00:02:24,219 --> 00:02:25,300 Voy aquí 25 00:02:25,300 --> 00:02:28,039 y digo 26 00:02:28,039 --> 00:02:31,000 hago un main 27 00:02:31,000 --> 00:02:33,960 una clase main para probar estas cosas 28 00:02:33,960 --> 00:02:40,060 y ahora nadie me prohíbe de crear 29 00:02:40,060 --> 00:02:41,199 un objeto figura 30 00:02:41,199 --> 00:02:44,000 figura f 31 00:02:44,000 --> 00:02:46,240 es igual a new figura 32 00:02:46,240 --> 00:02:51,990 f.numLados 33 00:02:51,990 --> 00:02:54,810 es igual a 4 34 00:02:54,810 --> 00:02:57,750 y ahora digo 35 00:02:57,750 --> 00:03:00,330 F punto 36 00:03:00,330 --> 00:03:01,469 Dime lados 37 00:03:01,469 --> 00:03:02,430 ¿Vale? 38 00:03:03,270 --> 00:03:03,990 Aquí 39 00:03:03,990 --> 00:03:07,569 Tengo cuatro lados 40 00:03:07,569 --> 00:03:09,189 Le pongo cero lados 41 00:03:09,189 --> 00:03:12,330 Y dice tengo infinitos lados 42 00:03:12,330 --> 00:03:13,830 ¿Sí? ¿De acuerdo? 43 00:03:14,509 --> 00:03:15,870 Vale, esto feo 44 00:03:15,870 --> 00:03:18,150 ¿Vale? Hemos dicho no lo quiero hacer 45 00:03:18,150 --> 00:03:19,330 Lo quiero poner aquí 46 00:03:19,330 --> 00:03:22,370 Entonces necesito 47 00:03:22,370 --> 00:03:24,610 Un constructor, me voy aquí y me hago un constructor 48 00:03:24,610 --> 00:03:27,110 Figura 49 00:03:27,110 --> 00:03:51,139 public figura de int numlados, dis.numlados, es igual a numlados, t. Función. ¿Dudas hasta aquí? 50 00:03:51,139 --> 00:03:59,520 Vale. Ahora, aquí subentra el concepto de val, pero esta clase versífigura es relativamente fea, 51 00:03:59,520 --> 00:04:07,199 vale en el sentido que ahora yo se me ha quedado un poco coja porque en realidad la figura tiene 52 00:04:07,199 --> 00:04:11,520 muchas otras cosas en común todas las figuras que pero no las estoy poniendo aquí porque no 53 00:04:11,520 --> 00:04:17,759 puedo porque podría decir vale yo quiero que las figuras puedan calcular su área puedo saberla aquí 54 00:04:17,759 --> 00:04:26,399 no entonces me bloqueo pero si dijera hoy mira yo quiero que cuando uno usa esta figura pues 55 00:04:26,399 --> 00:04:33,779 sea obligado a implementar algunos métodos que todas las figuras tienen, como por ejemplo 56 00:04:33,779 --> 00:04:35,560 el calcular su área. 57 00:04:35,560 --> 00:04:44,300 Pues entonces decido, digo mira, voy a ponerlo así, este es el cústico, voy a decir public 58 00:04:44,300 --> 00:04:51,800 abstract doble calcula área punto com. 59 00:04:51,800 --> 00:04:56,100 Esto se enfada, ¿vale? 60 00:04:56,100 --> 00:05:00,980 Pero lo que estoy diciendo aquí es, si yo quiero ahora construir un método que exista 61 00:05:00,980 --> 00:05:08,100 en la figura, que no puedo saber cómo se implementa, pero que si alguien hereda de 62 00:05:08,100 --> 00:05:16,279 mí sea obligado a implementarlo, y que sepa implementarlo, cuando el cuadrado implementará 63 00:05:16,279 --> 00:05:20,759 la figura, pues lo hará, ¿vale? 64 00:05:20,759 --> 00:05:24,339 Entonces, ¿qué voy a hacer aquí? 65 00:05:24,339 --> 00:05:25,420 se enfada porque me dice, 66 00:05:25,519 --> 00:05:26,300 the abstract method 67 00:05:26,300 --> 00:05:29,060 can only be defined 68 00:05:29,060 --> 00:05:30,639 by an abstract class. 69 00:05:31,540 --> 00:05:32,740 No puedo definir 70 00:05:32,740 --> 00:05:33,699 un método abstracto 71 00:05:33,699 --> 00:05:35,120 si la clase no es abstracta. 72 00:05:35,300 --> 00:05:36,279 No problemo. 73 00:05:40,240 --> 00:05:41,439 Mi clase es abstracta. 74 00:05:42,120 --> 00:05:42,959 Todo fenomenal. 75 00:05:43,939 --> 00:05:45,040 Oye, como un constructor 76 00:05:45,040 --> 00:05:46,139 de una clase abstracta, 77 00:05:46,199 --> 00:05:47,259 si no puedo construir 78 00:05:47,259 --> 00:05:48,079 la clase abstracta, 79 00:05:48,139 --> 00:05:48,620 no, no puedo. 80 00:05:49,300 --> 00:05:49,879 Y de hecho, 81 00:05:51,279 --> 00:05:51,759 se enfada. 82 00:05:55,110 --> 00:05:56,350 No se puede construir 83 00:05:56,350 --> 00:05:56,889 una figura. 84 00:05:58,329 --> 00:05:59,610 La figura es abstracta. 85 00:05:59,610 --> 00:06:04,310 Si yo construyera una figura, me quedaría este método y ¿qué hago con ello? 86 00:06:08,029 --> 00:06:08,490 ¿Me entiende? 87 00:06:10,490 --> 00:06:11,509 ¿Dudas hasta aquí? 88 00:06:14,009 --> 00:06:14,310 ¿Vamos? 89 00:06:15,449 --> 00:06:17,689 Entonces ya no puedo crear figuras. 90 00:06:18,970 --> 00:06:22,410 Si voy aquí, me dice, cannot distance the type figura. 91 00:06:22,810 --> 00:06:24,370 No puedo distanciarla por el tipo figura. 92 00:06:24,470 --> 00:06:25,350 ¿Por qué? Porque es astral. 93 00:06:26,910 --> 00:06:28,470 Pero si tengo un constructor. 94 00:06:29,410 --> 00:06:33,230 Si el constructor me sirve para crear este objeto, ¿vale? 95 00:06:33,230 --> 00:06:35,829 desde una subclase. 96 00:06:36,269 --> 00:06:38,209 O sea, la subclase llamará a este constructo 97 00:06:38,209 --> 00:06:39,990 para implementar la parte 98 00:06:39,990 --> 00:06:40,569 de en un lado. 99 00:06:41,790 --> 00:06:43,850 Pero por sí mismo no se puede llamar. 100 00:06:47,149 --> 00:06:47,910 Esto fue. 101 00:06:48,889 --> 00:06:49,910 Vale, muy bien. 102 00:06:50,269 --> 00:06:51,189 Entonces estamos aquí. 103 00:06:52,470 --> 00:06:53,990 Me creo otra clase. Vamos a 104 00:06:53,990 --> 00:06:56,170 implementar. Me creo otra clase de rectángulo. 105 00:06:58,269 --> 00:06:58,790 Rectángulo. 106 00:07:03,829 --> 00:07:04,389 Rectángulo 107 00:07:04,389 --> 00:07:07,930 que tiene, tiene int 108 00:07:07,930 --> 00:07:09,870 lado horizontal 109 00:07:09,870 --> 00:07:11,490 int 110 00:07:11,490 --> 00:07:13,269 lado vertical 111 00:07:13,269 --> 00:07:15,310 ¿si? 112 00:07:16,009 --> 00:07:17,709 cuidado, rectángulo ¿qué es? 113 00:07:18,769 --> 00:07:19,850 una figura 114 00:07:19,850 --> 00:07:21,629 entonces puede decir 115 00:07:21,629 --> 00:07:23,250 extends 116 00:07:23,250 --> 00:07:24,610 figura 117 00:07:24,610 --> 00:07:27,389 ¿vale? y se enfada 118 00:07:27,389 --> 00:07:28,430 ¿por qué se enfada? 119 00:07:32,939 --> 00:07:35,399 porque en el momento en que extendo una clase 120 00:07:35,399 --> 00:07:36,560 abstracta 121 00:07:36,560 --> 00:07:37,480 ¿vale? 122 00:07:38,199 --> 00:07:44,120 pillo el deber de implementar todos sus métodos abstractos. 123 00:07:44,860 --> 00:07:45,399 Y no lo he hecho. 124 00:07:46,199 --> 00:07:49,519 Además, esto se enfadará probablemente por el constructor. 125 00:07:50,060 --> 00:07:51,560 Sí, implicit sobre constructor. 126 00:07:52,120 --> 00:07:53,779 Vamos a ver que si pongo el constructor, 127 00:07:53,779 --> 00:08:02,980 public rectángulo que pilla 4, 128 00:08:02,980 --> 00:08:28,699 no, int lado h, int lado v, lo que hace es super 4, dis.lado h es igual a lado h, dis.lado v es igual a lado v. 129 00:08:28,699 --> 00:08:53,210 Sí, lo que decíamos ayer, el número de lados de un rectángulo siempre será 4, no lo hago pasar por parámetros, no puedo hacer rectángulos de 7 lados, que no existen, ¿sí? Claro, entonces, si ahora hago así, él sigue enfadándose, pero, oye, estoy usando ahora, no estoy usando el constructor por defecto, estoy usando el constructor definido aquí, no entiendo por qué te enfades, 130 00:08:53,210 --> 00:09:02,049 Aquí me dice, the type Rectangulo must implement the inherited abstract method figura.calcularia. 131 00:09:02,990 --> 00:09:11,210 El tipo Rectangulo tiene que implementar el método abstracto heredado calcularia. 132 00:09:12,129 --> 00:09:13,190 Tiene que hacerlo. 133 00:09:13,610 --> 00:09:17,289 De hecho aquí me da también quick fixes de, oye mira que hago. 134 00:09:18,009 --> 00:09:18,850 Y hay dos opciones. 135 00:09:18,850 --> 00:09:22,070 Añade los métodos no implementados 136 00:09:22,070 --> 00:09:23,730 O otra opción 137 00:09:23,730 --> 00:09:26,029 Haz que el rectángulo sea abstracto 138 00:09:26,029 --> 00:09:28,070 Podría ser que esta clase 139 00:09:28,070 --> 00:09:29,169 Yo tenga figura 140 00:09:29,169 --> 00:09:31,230 Luego tenga figura plana 141 00:09:31,230 --> 00:09:32,610 Y figura 3D 142 00:09:32,610 --> 00:09:33,590 ¿Vale? 143 00:09:33,669 --> 00:09:35,730 Entonces figura es para todos 144 00:09:35,730 --> 00:09:39,730 Y de ellos heredan figura plana o figura 3D 145 00:09:39,730 --> 00:09:41,649 Y estas también sean abstractas 146 00:09:41,649 --> 00:09:44,690 Y luego desde figura normal, plana 147 00:09:44,690 --> 00:09:47,009 Heredan rectángulo cuadrado es lo que tenemos 148 00:09:47,009 --> 00:09:49,509 y de figura 3D eran esfera, 149 00:09:49,649 --> 00:09:50,730 cubo y cosas por el estilo. 150 00:09:52,809 --> 00:09:55,110 Puedo heredar y ser abstracto. 151 00:09:55,710 --> 00:09:57,210 Si soy abstracto, no necesito 152 00:09:57,210 --> 00:09:59,330 implementar nada. Puedo implementar 153 00:09:59,330 --> 00:10:00,330 o no. 154 00:10:02,110 --> 00:10:03,289 Entonces, a nosotros nos interesa 155 00:10:03,289 --> 00:10:05,090 esta opción, ¿vale? Aquí. 156 00:10:06,429 --> 00:10:07,309 Este era el método 157 00:10:07,309 --> 00:10:08,049 que me faltaba. 158 00:10:09,269 --> 00:10:11,470 Entonces, public double calcularia 159 00:10:11,470 --> 00:10:13,029 return 0 porque 160 00:10:13,029 --> 00:10:14,090 él no sabe cómo hacer. 161 00:10:14,450 --> 00:10:17,230 Yo sé que tengo que hacer return. 162 00:10:18,450 --> 00:10:35,169 lado H por lado V. Perfecto. Ya lo tenemos. Ahora tenemos figura que es abstracto, no puedo 163 00:10:35,169 --> 00:10:41,169 calcularlo, rectángulo que cuando creo un rectángulo me llama, me crea una figura y una vez creada la 164 00:10:41,169 --> 00:10:49,450 figura implementa lo que sea. Y implementa, fijaos, le hice el overwrite. Aquí me está definiendo que 165 00:10:49,450 --> 00:10:58,330 este de aquí está overheadando este de aquí. Esto me sirve porque hago un control del procesador 166 00:10:58,330 --> 00:11:09,789 que entiende que mi intención es hacer un override de este nombre aquí, de este método aquí, 167 00:11:09,789 --> 00:11:20,460 y si me equivoco y no lo hago exactamente igual, me da un error. Por ejemplo, si yo quito esto, 168 00:11:20,460 --> 00:11:27,789 perfecto. Pero en el momento en que le digo que es un override, me está diciendo, mira, tú estás 169 00:11:27,789 --> 00:11:36,730 intentando overridear, pero no existe este método para sobrescribir. Este método, con el entero, 170 00:11:36,730 --> 00:11:45,129 con esta firma, no existe en la clase superior. Está diciendo, el método calcular a int, vale, 171 00:11:45,129 --> 00:11:46,070 del tipo rectángulo. 172 00:11:46,190 --> 00:11:47,289 Mast Override and Implemented 173 00:11:47,289 --> 00:11:49,509 or Supertype Method. 174 00:11:50,990 --> 00:11:53,110 Esto, calcular el int, 175 00:11:53,429 --> 00:11:55,289 debería estar en el padre. 176 00:11:56,029 --> 00:11:56,809 Y no está. 177 00:11:57,529 --> 00:11:59,450 Por lo tanto, no me puedes meter Override. 178 00:12:01,090 --> 00:12:04,500 Es como una forma extra 179 00:12:04,500 --> 00:12:06,480 para estar seguro que si yo estoy 180 00:12:06,480 --> 00:12:08,179 declarando, lo voy a sobrescribir 181 00:12:08,179 --> 00:12:10,399 y él me ayuda a decir, vale, si lo has 182 00:12:10,399 --> 00:12:11,940 sobrescribido correctamente o no. 183 00:12:13,779 --> 00:12:14,519 De esta forma. 184 00:12:15,000 --> 00:12:15,139 Así. 185 00:12:15,139 --> 00:12:24,580 ¿Esto está bien? Vamos a jugar con él. Entonces, ¿qué puedo hacer ahora? Puedo crear un rectángulo. 186 00:12:27,899 --> 00:12:32,980 Dejadme antes de jugar hacer otra cosa. Crea una cosa solo para rectángulos. 187 00:12:32,980 --> 00:12:44,860 Que es public void rectanglear. Que solo lo pueden hacer los rectángulos. 188 00:12:45,139 --> 00:12:57,200 ¿Vale? Es decir, si yo soy muy rectángulo y mucho rectángulo, está rephraseando algo. 189 00:12:57,200 --> 00:13:04,259 ¿Sí? Entonces, ¿ahora qué puedo hacer aquí? Puedo crear un rectángulo. 190 00:13:05,539 --> 00:13:09,919 Rectángulo, R es igual a new rectángulo. 191 00:13:09,919 --> 00:13:14,679 parámetros, tengo que poner 192 00:13:14,679 --> 00:13:16,299 el lado horizontal y vertical 193 00:13:16,299 --> 00:13:18,700 7, 3 194 00:13:18,700 --> 00:13:22,480 vale, fenomenal, y ahora que puedo hacer 195 00:13:22,480 --> 00:13:24,179 con rectángulo, R punto 196 00:13:24,179 --> 00:13:26,639 pues puedo acceder a su lado 197 00:13:26,639 --> 00:13:28,519 H, puedo acceder a su lado V 198 00:13:28,519 --> 00:13:30,220 puedo acceder a num lados 199 00:13:30,220 --> 00:13:32,899 que es del padre, veis que es de figura 200 00:13:32,899 --> 00:13:34,620 aquí no puedo hacer zoom 201 00:13:34,620 --> 00:13:36,899 porque a veces se me bloquea el vídeo 202 00:13:36,899 --> 00:13:37,659 si a vosotros 203 00:13:37,659 --> 00:13:39,899 no lo veis 204 00:13:39,899 --> 00:13:41,100 está en streaming 205 00:13:41,100 --> 00:13:45,299 luego está calcularia 206 00:13:45,299 --> 00:13:46,320 que es de rectángulo 207 00:13:46,320 --> 00:13:48,759 también dimelados que es de figura 208 00:13:48,759 --> 00:13:51,039 o sea yo desde aquí puedo acceder 209 00:13:51,039 --> 00:13:52,440 a todo lo que es rectángulo 210 00:13:52,440 --> 00:13:54,600 y a todo lo que es figura 211 00:13:54,600 --> 00:13:57,440 también puedo rectangulear 212 00:13:57,440 --> 00:13:59,419 que es una cosa solo de rectángulo 213 00:13:59,419 --> 00:14:00,360 que no existe en figura 214 00:14:00,360 --> 00:14:01,399 ¿sí? 215 00:14:02,159 --> 00:14:03,200 puedo hacer todas estas cosas 216 00:14:03,200 --> 00:14:04,259 entonces le puedo decir 217 00:14:04,259 --> 00:14:11,080 siso r.calcularia 218 00:14:11,080 --> 00:14:17,059 Luego puedo hacer R.rectangular. 219 00:14:17,399 --> 00:14:20,820 Luego puedo hacer R.dimelados. 220 00:14:22,440 --> 00:14:23,200 Todo esto funciona. 221 00:14:26,860 --> 00:14:27,039 ¿Vale? 222 00:14:29,279 --> 00:14:34,720 Fijaos que esto es de figura sobre escrito en rectángulo. 223 00:14:36,080 --> 00:14:39,379 Esto es solo de rectángulo. 224 00:14:40,000 --> 00:14:42,120 Y esto es solo de figura. 225 00:14:42,120 --> 00:14:50,000 sea definido en figuras y no sea sobre escrito en rectángulos. Puedo usar métodos sobre escritos, 226 00:14:50,000 --> 00:14:57,620 métodos míos y métodos de mi padre. ¿Duda hasta aquí? Vale. Otra cosa que puedo hacer es, 227 00:14:57,620 --> 00:15:20,509 figura f es igual a new rectángulo de 3, 4. Ahora, si yo hago este punto, aquí me aparecen 228 00:15:20,509 --> 00:15:27,509 numlados, me aparece calcularia, me aparece bimelados, pero no me aparece ni 229 00:15:27,509 --> 00:15:37,490 rectángular ni calcular de figura. Entonces vamos a ver qué pasa. Primero no puedo acceder, no me 230 00:15:37,490 --> 00:15:45,750 aparecen ni lado h ni lado v. No puedo acceder a esas variables porque ellos son una figura como 231 00:15:45,750 --> 00:15:53,710 referencia. El rectángulo es una figura. Como mi manejador del objeto es una figura, 232 00:15:53,710 --> 00:15:59,409 sólo puede usar los comandos de figura. No puede usar los comandos del rectángulo. ¿Se entiende? 233 00:16:03,370 --> 00:16:08,519 Entonces, yo aquí puedo hacer este punto, 234 00:16:08,519 --> 00:16:11,360 Dime lados 235 00:16:11,360 --> 00:16:15,200 Y va a funcionar 236 00:16:15,200 --> 00:16:16,100 Perfectamente 237 00:16:16,100 --> 00:16:19,299 Tengo cuatro lados 238 00:16:19,299 --> 00:16:29,830 Pongo un círculo divisorio 239 00:16:29,830 --> 00:16:33,230 Esto lo escribe el primer objeto 240 00:16:33,230 --> 00:16:33,730 Hasta aquí 241 00:16:33,730 --> 00:16:36,450 Y luego empieza otro objeto 242 00:16:36,450 --> 00:16:37,210 ¿Vale? 243 00:16:37,210 --> 00:16:38,730 Y este objeto dice 244 00:16:38,730 --> 00:16:39,490 Tengo cuatro lados 245 00:16:39,490 --> 00:16:43,509 Ahora, si yo hago esto mismo 246 00:16:43,509 --> 00:16:46,840 Con este 247 00:16:46,840 --> 00:16:52,129 Este calcular 248 00:16:52,129 --> 00:16:57,690 es el de figura o el de rectángulo 249 00:17:09,079 --> 00:17:11,339 por 250 00:17:14,079 --> 00:17:16,480 por qué por 251 00:17:18,720 --> 00:17:19,279 por 252 00:17:20,960 --> 00:17:24,859 por 253 00:17:30,880 --> 00:17:31,440 por 254 00:17:34,740 --> 00:17:43,609 Estoy llamando 255 00:17:43,609 --> 00:17:46,329 el método de rectángulo 256 00:17:46,329 --> 00:17:47,990 y no de figura por 257 00:17:47,990 --> 00:17:53,359 ¿Por qué estaba acercando a la instancia? 258 00:17:53,519 --> 00:17:54,500 ¿Al método de la instancia? 259 00:17:56,500 --> 00:17:57,299 Por 260 00:17:57,299 --> 00:18:04,150 ¡Exacto! 261 00:18:04,789 --> 00:18:05,170 Por 262 00:18:05,170 --> 00:18:08,190 ¿Qué estamos estudiando esta mañana? 263 00:18:09,930 --> 00:18:11,930 Ah, porque es polimórfico 264 00:18:11,930 --> 00:18:13,190 Pero es un método polimórfico. 265 00:18:13,490 --> 00:18:16,069 ¡Por polimorfismo! ¡Muy bien! 266 00:18:16,170 --> 00:18:17,289 Habéis llegado enseguida. 267 00:18:18,950 --> 00:18:19,190 ¿Vale? 268 00:18:19,849 --> 00:18:20,410 ¿Sí? 269 00:18:21,890 --> 00:18:23,730 Y la razón es... 270 00:18:23,730 --> 00:18:25,529 O sea, por polimorfismo, y nosotros 271 00:18:25,529 --> 00:18:27,230 informáticos los entendemos. ¿Vale? 272 00:18:27,329 --> 00:18:29,410 Si lo quiero explicar, pues porque 273 00:18:29,410 --> 00:18:31,990 efectivamente se usa el método 274 00:18:31,990 --> 00:18:33,990 de la instancia, 275 00:18:33,990 --> 00:18:35,990 no de la referencia. 276 00:18:36,930 --> 00:18:38,609 La referencia es de tipo figura, 277 00:18:39,069 --> 00:18:40,970 pero la instancia es un rectángulo. 278 00:18:40,970 --> 00:18:42,569 Entonces va a usar 279 00:18:42,569 --> 00:18:43,569 Calcular 280 00:18:43,569 --> 00:18:46,509 Por otro lado, ¿existe calcular en figuras? 281 00:18:47,789 --> 00:18:48,589 No 282 00:18:48,589 --> 00:18:49,769 No está definido 283 00:18:49,769 --> 00:18:51,170 Entonces, ¿qué debería hacer? 284 00:18:54,170 --> 00:18:56,930 Lo puedo usar sobre una figura 285 00:18:56,930 --> 00:18:58,869 Justo porque en realidad 286 00:18:58,869 --> 00:18:59,990 Es un rectángulo 287 00:18:59,990 --> 00:19:03,390 Y estoy usando su versión rectangular 288 00:19:03,390 --> 00:19:05,130 De la del calcular 289 00:19:05,130 --> 00:19:07,289 Estoy usando calcular del rectángulo 290 00:19:07,289 --> 00:19:08,490 Sí 291 00:19:08,490 --> 00:19:10,269 O sea, has creado 292 00:19:10,269 --> 00:19:11,950 un objeto nuevo 293 00:19:11,950 --> 00:19:14,329 con la clase figura 294 00:19:14,329 --> 00:19:16,069 que es un rectángulo 295 00:19:16,069 --> 00:19:17,710 con la clase rectángulo 296 00:19:17,710 --> 00:19:19,970 pero diciendo que 297 00:19:19,970 --> 00:19:22,390 su referencia, su tipo de variable 298 00:19:22,390 --> 00:19:24,490 es una figura, ¿por qué puede hacerlo? 299 00:19:24,589 --> 00:19:26,230 porque rectángulo es una figura 300 00:19:26,230 --> 00:19:29,609 es 301 00:19:29,609 --> 00:19:32,890 píllalo con las, cuando yo te digo 302 00:19:32,890 --> 00:19:34,990 float 303 00:19:34,990 --> 00:19:37,029 f 304 00:19:37,029 --> 00:19:38,269 no, mi 305 00:19:38,269 --> 00:19:40,970 número es igual a 306 00:19:40,970 --> 00:19:41,470 5 307 00:19:41,470 --> 00:19:43,930 5 es un float 308 00:19:43,930 --> 00:19:47,950 no, pero entonces ¿por qué me lo pilla? 309 00:19:49,569 --> 00:19:51,269 porque 5 es también un float 310 00:19:51,269 --> 00:19:56,079 un float no es un int 311 00:19:56,079 --> 00:19:57,859 pero cualquier int es un float 312 00:19:57,859 --> 00:20:03,170 para esto extrae números primitivos 313 00:20:03,170 --> 00:20:04,710 entonces píllalo con la 314 00:20:04,710 --> 00:20:06,869 con pizzas 315 00:20:06,869 --> 00:20:09,509 ¿sí? pero la idea es esa 316 00:20:09,509 --> 00:20:11,670 cualquier rectángulo es una figura 317 00:20:11,670 --> 00:20:13,710 entonces yo puedo decir 318 00:20:13,710 --> 00:20:15,009 ay mira, esta es una figura, sí 319 00:20:15,009 --> 00:20:22,009 pongo dentro un rectángulo perfecto ahora el manejador el que decide qué puede hacer es de 320 00:20:22,009 --> 00:20:28,990 tipo figura entonces cuando hago este punto me saldrán todas las opciones que tiene una figura 321 00:20:28,990 --> 00:20:37,269 o un rectángulo el rectángulo tiene cosas extra para hacer él no puede hacerlas pero todo lo que 322 00:20:37,269 --> 00:20:47,940 puede hacer una figura, lo puede hacer. Porque el rectángulo es una figura. Esto es un up-casting. 323 00:20:52,019 --> 00:21:00,299 No, porque si ahora yo quisiera decir, vale, ok, pero yo sé que f es un rectángulo. ¿Puedo usar 324 00:21:00,299 --> 00:21:09,680 algo de rectángulo? ¿Puedo hacer este método de aquí que es sólo de rectángulos usando f? No, 325 00:21:09,680 --> 00:21:14,579 No, porque si yo hago este punto, no aparece aquí rectángulear. 326 00:21:15,740 --> 00:21:18,420 Porque una figura no puede hacer como un rectángulo. 327 00:21:18,599 --> 00:21:19,819 Es el rectángulo que hace así. 328 00:21:20,200 --> 00:21:22,839 Pero ella lo que puede hacer es decir, oye, mira, espera, espera, espera. 329 00:21:24,799 --> 00:21:25,279 Rectángulo. 330 00:21:28,490 --> 00:21:32,819 F, para que se entienda. 331 00:21:33,880 --> 00:21:34,319 Punto. 332 00:21:35,160 --> 00:21:36,660 Y ahora me está diciendo, pilla este. 333 00:21:37,720 --> 00:21:40,099 Trátalo como si fuera un rectángulo. 334 00:21:40,099 --> 00:21:46,740 Y a este punto me salen todas las opciones que puedan hacer un rectángulo, ¿vale? 335 00:21:47,420 --> 00:21:49,500 Incluido rectangulear. 336 00:21:50,720 --> 00:21:52,240 Y me funciona. 337 00:21:53,079 --> 00:22:00,480 Porque en realidad F es una referencia de tipo figura, pero dentro tiene un objeto rectángulo. 338 00:22:00,880 --> 00:22:02,099 Entonces puede hacer un... 339 00:22:03,440 --> 00:22:05,059 Explícito. 340 00:22:05,519 --> 00:22:07,259 Es explícito. 341 00:22:07,259 --> 00:22:10,299 Hacer un downcasting explícito 342 00:22:10,299 --> 00:22:12,339 Al decir, oye mira, tú eres una figura, lo sé 343 00:22:12,339 --> 00:22:14,920 Pero compórtate como un rectángulo 344 00:22:14,920 --> 00:22:16,000 ¿Por qué? Porque lo digo yo 345 00:22:16,000 --> 00:22:18,519 ¿Está claro? 346 00:22:18,660 --> 00:22:19,000 ¿Qué es? 347 00:22:22,180 --> 00:22:22,980 No me lo va a hacer 348 00:22:22,980 --> 00:22:46,170 No me permite hacer, ¿vale? 349 00:22:49,170 --> 00:22:50,230 Necesito otra parte 350 00:22:50,230 --> 00:22:52,150 Lo hacemos solo en un minuto 351 00:22:52,150 --> 00:22:52,609 ¿Vale? 352 00:22:52,609 --> 00:22:54,089 Vamos a hacer 353 00:22:54,089 --> 00:22:56,450 Triángulo también 354 00:22:56,450 --> 00:22:58,369 O otra cosa 355 00:22:58,369 --> 00:22:58,869 ¿Vale? 356 00:22:58,869 --> 00:23:38,839 Necesito triángulo, triángulo, el triángulo que tiene, tiene interlado uno, interlado dos, interlado tres, extensa figura, aquí tiene public, triangle, surche, constructorus infilde, tac, tac, tac, tac, ¿vale? 357 00:23:38,839 --> 00:23:40,579 de un lado se los quito 358 00:23:40,579 --> 00:23:42,140 le pongo 3 359 00:23:42,140 --> 00:23:43,259 vale 360 00:23:43,259 --> 00:23:45,220 y 361 00:23:45,220 --> 00:23:48,839 como estoy extendiendo triángulos 362 00:23:48,839 --> 00:23:50,519 la figura se enfada 363 00:23:50,519 --> 00:23:51,779 porque dice le falta 364 00:23:51,779 --> 00:23:54,559 los métodos he dedicado 365 00:23:54,559 --> 00:23:56,339 entonces los añado 366 00:23:56,339 --> 00:23:59,099 como calculo la área del triángulo 367 00:23:59,099 --> 00:24:00,880 pues no tengo ni idea 368 00:24:00,880 --> 00:24:01,940 pues 369 00:24:01,940 --> 00:24:03,220 da siempre 370 00:24:03,220 --> 00:24:06,980 hay una fórmula para calcular la área del triángulo 371 00:24:06,980 --> 00:24:09,819 a partir de los lados, pero no me las he de vengar, ¿vale? 372 00:24:10,039 --> 00:24:11,339 Es solo base para el truco. 373 00:24:13,619 --> 00:24:17,059 Pero luego lo modificamos, a lo mejor esto hace unas cosas raras. 374 00:24:19,559 --> 00:24:30,940 Si ahora vuelvo aquí y le digo, oye, mira, haz un casting petra, 375 00:24:31,059 --> 00:24:34,519 que aquí le hago el método que solo los triángulos pueden hacer, 376 00:24:34,519 --> 00:24:37,779 que es public void triangular. 377 00:24:37,779 --> 00:24:57,420 que dice inciso triángulo. Si ahora yo le digo a esta figura, que es una figura, que es un 378 00:24:57,420 --> 00:25:11,829 rectángulo, oye mira, puede ser un triángulo y triangulear. Él me dice claro, cómo no, soy una 379 00:25:11,829 --> 00:25:20,390 figura, existe triángulo que hereda de figura, pues te voy a tratar como un triángulo. Yo lo 380 00:25:20,390 --> 00:25:34,779 lanzo y ¿qué pasa? Explota. Con una class-cast exception. Tú eres un rectángulo, me estás 381 00:25:34,779 --> 00:25:41,680 diciendo trátame como un triángulo, pero yo no tengo dentro la estructura de un triángulo, 382 00:25:41,680 --> 00:25:46,759 entonces no puedo ser un triángulo. Yo tengo todo lo que tiene figura y todo lo que tiene 383 00:25:46,759 --> 00:25:51,420 un rectángulo. Si tú me dices, úsame como figura, fenomenal. Úsame como rectángulo, fenomenal. 384 00:25:51,680 --> 00:25:56,079 Pero cuando tú me dices, oye, mira, úsame como un triángulo, pues no es correcta. 385 00:25:57,380 --> 00:26:02,720 No es un casting correcto. No puedo tratar un cuadrado, un rectángulo, como si fuera un triángulo. 386 00:26:04,380 --> 00:26:10,299 Entonces, él explota. Cuidado que no lo entiende él. 387 00:26:10,299 --> 00:26:14,880 Porque una figura, técnicamente, es castigable a un triángulo. 388 00:26:14,880 --> 00:26:17,519 si tú aquí en vez de 389 00:26:17,519 --> 00:26:19,960 new rectángulo hubieses hecho new triángulo 390 00:26:19,960 --> 00:26:21,599 pues lo habrías podido hacer 391 00:26:21,599 --> 00:26:24,279 ¿entiendes? 392 00:26:27,079 --> 00:26:29,519 pero no lo puedes hacer con este 393 00:26:29,519 --> 00:26:30,440 rectángulo de aquí 394 00:26:30,440 --> 00:26:35,170 que da la posibilidad 395 00:26:35,170 --> 00:26:38,049 de cerciorarme 396 00:26:38,049 --> 00:26:39,430 si 397 00:26:39,430 --> 00:26:42,690 f instancio 398 00:26:42,690 --> 00:26:47,869 triángulo 399 00:26:47,869 --> 00:26:51,319 entonces hablo 400 00:26:51,319 --> 00:26:55,720 triángulo 401 00:26:55,720 --> 00:27:01,690 and say if 402 00:27:01,690 --> 00:27:25,950 f instancio cuadrado, no, que es rectángulo, pues entonces, rectángulo f, punto, 403 00:27:25,950 --> 00:27:55,339 ¿me entiendes? Si yo no lo sé, si este es un triángulo o un rectángulo, porque me lo han dado por teclado, 404 00:27:55,339 --> 00:27:57,380 porque está en un array, porque no lo sé qué. 405 00:27:57,740 --> 00:27:59,359 Siempre me puedo preguntar, oye, mira, 406 00:27:59,420 --> 00:28:01,339 si eres un triángulo, entonces da un 407 00:28:01,339 --> 00:28:03,380 cast a la triángulo y usa los métodos 408 00:28:03,380 --> 00:28:05,680 de triángulo. Si es un rectángulo, 409 00:28:05,779 --> 00:28:07,319 da un cast a un rectángulo y usa 410 00:28:07,319 --> 00:28:08,220 los métodos de rectángulo. 411 00:28:12,240 --> 00:28:14,099 ¿Está de acuerdo con esto? ¿Está aquí? 412 00:28:15,660 --> 00:28:15,859 ¿Sí? 413 00:28:16,559 --> 00:28:17,000 Entonces, 414 00:28:18,259 --> 00:28:20,319 cosa uno, 415 00:28:20,460 --> 00:28:22,200 me creo un rectángulo 416 00:28:22,200 --> 00:28:24,400 y tengo rectángulo, ¿vale? 417 00:28:24,519 --> 00:28:26,480 Y uso como referencia un rectángulo. 418 00:28:26,480 --> 00:28:28,480 Esto puede hacer todo lo que hace un rectángulo. 419 00:28:28,640 --> 00:28:34,960 opción número 2 crea un rectángulo pero lo pongo dentro de la figura esto puede hacer sólo lo que 420 00:28:34,960 --> 00:28:42,380 hace una figura a menos que no haga un down casting explícito siempre y cuando pueda hacerlo 421 00:28:44,119 --> 00:28:53,380 ya seguro que lo esté seguro que lo puede hacer la tercera opción que venía aquí era 422 00:28:53,380 --> 00:28:58,720 es crear un padre con tipo padre pero aquí no lo puede hacer puede hacer figura este 423 00:28:58,720 --> 00:29:11,940 F2 es igual a new figura de 3. ¿Por qué no? Porque es una clase abstracta. Si la clase 424 00:29:11,940 --> 00:29:28,420 es abstracta no puedo crearla. ¿Dudas? Vamos a crear una clase nueva. Cuadrado. ¿De qué 425 00:29:28,420 --> 00:29:51,420 era el cuadrado? Extends. Rectángulo. Bueno, implícito sobre constructo de rectángulo 426 00:29:51,420 --> 00:30:14,099 no funciona vale public cuadrado intel super l l lo veis cuadrado es un rectángulo con todos 427 00:30:14,099 --> 00:30:21,400 los lados iguales y mi constructor de rectángulo pillaba los dos lados vertical y horizontal pues 428 00:30:21,400 --> 00:30:27,400 le estoy pasando como parámetros el mismo para que el vertical y horizontal tengan el mismo tamaño 429 00:30:27,400 --> 00:30:37,470 en automático esto me costará me costará una figura de cuatro lados tendré una figura de 430 00:30:37,470 --> 00:30:44,670 cuatro lados con alrededor un rectángulo que tiene el lado del lado iguales y comentó con 431 00:30:44,670 --> 00:30:59,609 alrededor este cuadrado aquí sí cuadrado porque yo estando de rectángulo porque yo estando rectángulo 432 00:30:59,609 --> 00:31:00,450 entonces ahí está. 433 00:31:03,099 --> 00:31:05,359 ¿Y por qué has puesto un solo parámetro 434 00:31:05,359 --> 00:31:07,440 en el constructor de cuadrados? 435 00:31:07,460 --> 00:31:09,200 Porque ¿cuántos parámetros necesitas 436 00:31:09,200 --> 00:31:09,839 para un cuadrado? 437 00:31:13,240 --> 00:31:16,220 Te dices, un cuadrado de lado 2 y 2. 438 00:31:17,339 --> 00:31:18,480 O dices, un cuadrado de lado 2. 439 00:31:19,779 --> 00:31:21,000 Aquí, cuadrado de lado 2. 440 00:31:21,359 --> 00:31:22,579 Luego te lo duplico 441 00:31:22,579 --> 00:31:24,180 porque en mi estructura 442 00:31:24,180 --> 00:31:25,579 del ejemplo que estoy haciendo, 443 00:31:25,920 --> 00:31:27,599 pues el rectángulo necesita dos lados, 444 00:31:27,799 --> 00:31:28,900 el horizontal y el vertical. 445 00:31:29,519 --> 00:31:30,980 Pues horizontal y vertical son 446 00:31:30,980 --> 00:31:33,079 dos y dos. 447 00:31:34,220 --> 00:31:37,220 para que sean cuadrados. 448 00:31:37,220 --> 00:31:43,220 Tened en cuenta que aquí tengo que sobreescribir, calcular área. 449 00:31:43,220 --> 00:31:52,480 No, porque técnicamente yo estoy redando el de rectángulo 450 00:31:52,480 --> 00:31:55,480 y ya rectángulo lo ha implementado. 451 00:31:55,480 --> 00:31:58,480 Entonces no hay problema, está implementado ya. 452 00:31:58,480 --> 00:32:01,480 ¿Me vale el calcular área de rectángulo? 453 00:32:01,480 --> 00:32:06,480 Sí, porque sustancialmente estos serán igual, me están haciendo dos por dos. 454 00:32:06,480 --> 00:32:39,140 ¿Vale? Vamos a complicarlo un poquito. Vamos a poner que la figura, además de este método abstracto, tiene también el método abstracto, cálcula perímetro, entonces errores por todos lados, triángulo, cálcula perímetro del triángulo, pues vamos a crear cálcula perímetro y será lado 1 más lado 2 más lado 3. 455 00:32:39,640 --> 00:32:49,200 Justo. Vale. Me voy al rectángulo. El rectángulo me dice, oye, mira, no está implementado. Vamos a implementar. 456 00:32:50,400 --> 00:33:00,680 ¿Cómo se calcula el perímetro del rectángulo? 2 por lado H más 2 por lado V. 457 00:33:00,680 --> 00:33:06,269 Bueno, vale. Quería hacer una cosa distinta, pero... ¿Sí? 458 00:33:06,269 --> 00:33:20,140 Y hacemos también que esto escriba RECTÁNGULO PERÍMETRO. 459 00:33:20,140 --> 00:33:44,589 El método calcula perímetro escribe soy rectángulo, calculo mi perímetro y lo calculo. 460 00:33:44,589 --> 00:33:53,450 Imaginámonos que ahora a nivel de cuadrado quiera sobreescribir también eso. 461 00:33:53,450 --> 00:33:55,910 Entonces le pongo atoverride 462 00:33:55,910 --> 00:34:01,339 y le pongo 463 00:34:01,339 --> 00:34:13,889 esto aquí. Y ahora digo, soy cuadrado. 464 00:34:15,349 --> 00:34:15,769 Y aún 465 00:34:15,769 --> 00:34:16,730 si esto me vale, 466 00:34:17,630 --> 00:34:19,170 pues lo que hago yo ahora es 467 00:34:19,170 --> 00:34:21,750 4 por lado h. 468 00:34:27,210 --> 00:34:27,769 Misma cosa. 469 00:34:28,369 --> 00:34:30,230 Me valía el otro. Pero es para ver que 470 00:34:30,230 --> 00:34:31,289 ahora escribo otra cosa. 471 00:34:33,429 --> 00:34:33,949 Entonces 472 00:34:33,949 --> 00:34:36,289 me vuelvo a mi main y voy a 473 00:34:36,289 --> 00:34:37,269 jugar con esto. 474 00:34:38,070 --> 00:34:39,030 Voy a 475 00:34:39,030 --> 00:34:41,329 anular todo. 476 00:34:42,230 --> 00:34:44,389 Y va a crear un rectángulo. 477 00:34:48,530 --> 00:34:54,269 Nu rectángulo 7, 3. 478 00:34:54,510 --> 00:34:54,869 Otra vez. 479 00:34:55,070 --> 00:34:57,170 2, 3. 480 00:34:58,489 --> 00:35:00,489 Y luego un cuadrado. 481 00:35:01,730 --> 00:35:04,590 Es igual a nu cuadrado. 482 00:35:09,940 --> 00:35:15,579 Y luego figura F1. 483 00:35:15,579 --> 00:35:23,260 Es igual a new rectángulo de 5, 6. 484 00:35:24,340 --> 00:35:31,960 Y figura fc2 es igual a new cuadrado de 5. 485 00:35:33,880 --> 00:35:40,019 Si ahora yo llamo r2.calculaperímetro, 486 00:35:40,019 --> 00:35:51,199 que me hará, dice, soy un rectángulo perímetro y calculará superado, ahora no lo sé cuánto es. 487 00:35:51,199 --> 00:36:07,010 Dame un segundo, que así acabo. Esto me dice el perímetro, pero lo ha calculado como rectángulo. 488 00:36:07,010 --> 00:36:25,110 ¿Lo veis? Si ahora hago lo mismo usando C, ¿qué hará? Usa cuadrado. Y hasta aquí todo bien. 489 00:36:26,369 --> 00:36:40,119 Si ahora hago lo mismo y pongo S1, ¿qué hará? ¿Qué método usa? El de figura. 490 00:36:40,119 --> 00:37:01,159 ¿El de rectángulo o el de cuadrado? El de rectángulo. ¿Veis? ¿Por qué? Porque soy una referencia de tipo figura, pero dentro soy un rectángulo y se usa el método de la estancia. 491 00:37:01,159 --> 00:37:07,159 último 492 00:37:07,159 --> 00:37:11,489 ¿cuál se usa? 493 00:37:16,380 --> 00:37:17,659 el de cuadrado 494 00:37:17,659 --> 00:37:24,610 porque soy una referencia de figura 495 00:37:24,610 --> 00:37:28,530 pero en realidad soy un cuadrado 496 00:37:28,530 --> 00:37:30,849 perdón, necesito lo último 497 00:37:30,849 --> 00:37:34,429 rectángulo R3 498 00:37:34,429 --> 00:37:36,929 es igual a 499 00:37:36,929 --> 00:37:38,389 µ cuadrado 500 00:37:38,389 --> 00:37:40,829 de 7. 501 00:37:40,949 --> 00:37:41,469 ¿Lo puedo hacer? 502 00:37:42,570 --> 00:37:43,289 Sí. 503 00:37:43,769 --> 00:37:45,369 El cuadrado es un rectángulo. 504 00:37:46,110 --> 00:37:49,150 Y si ahora hago esto otra vez 505 00:37:49,150 --> 00:37:51,150 y hago R3, 506 00:37:51,329 --> 00:37:51,750 ¿qué hace? 507 00:37:53,050 --> 00:37:54,710 Cuidado que el rectángulo lo tiene. 508 00:37:54,969 --> 00:37:55,429 ¿Qué hago? 509 00:37:55,769 --> 00:37:56,349 ¿Cuál usa? 510 00:37:58,050 --> 00:37:59,449 El de cuadrado. 511 00:38:00,010 --> 00:38:01,710 Porque dentro es un cuadrado. 512 00:38:04,730 --> 00:38:06,389 Aquí escribo rectángulo cuadrado. 513 00:38:06,449 --> 00:38:08,150 esto es perímetro 514 00:38:08,150 --> 00:38:09,969 hay que cambiar 515 00:38:09,969 --> 00:38:11,550 ahora lo volvemos a rehacer 516 00:38:11,550 --> 00:38:12,889 y reanudar