1 00:00:00,000 --> 00:00:22,699 Voy a grabar esta clase, por lo tanto, como es muy útil y la miráis constantemente, pues si habláis me autorizáis a grabar vuestra voz, así luego la escucháis otra vez cuando los ponéis en casa y miráis muchas veces estos vídeos, que hemos comprobado ahora, miráis mogollón estos vídeos. 2 00:00:22,699 --> 00:00:25,199 Muy bien. Enhorabuena. 3 00:00:26,100 --> 00:00:27,019 Pasas, tratas. 4 00:00:27,559 --> 00:00:43,689 Hay veces, en esta cosa de la herencia, en que creamos una jerarquía de objetos que, pero, me viene mal crear. 5 00:00:45,289 --> 00:00:46,170 ¿Qué quiere decir esto? 6 00:00:46,729 --> 00:00:49,369 Imaginaos lo que hemos hecho el viernes. 7 00:00:50,009 --> 00:00:53,670 Viernes hemos hecho un ejercicio sobre figuras geométricas. 8 00:00:54,270 --> 00:00:55,009 Vale, fenomenal. 9 00:00:55,530 --> 00:00:59,630 Cuando yo hablo de un cuadrado, yo sé que es un cuadrado, sé cómo se trata un cuadrado. 10 00:00:59,770 --> 00:01:02,450 Sé calcular su área, sé calcular su perímetro, etc. 11 00:01:02,729 --> 00:01:06,010 Cuando hablo de un triángulo, sé todo. 12 00:01:06,370 --> 00:01:09,950 Cuando hablo de un trapecio, sé todo, sé mis fórmulas. 13 00:01:10,370 --> 00:01:11,510 Si no las sé, las busco. 14 00:01:12,049 --> 00:01:16,349 Pero si yo hablo de una figura geométrica, no sé nada. 15 00:01:17,170 --> 00:01:21,890 Una figura geométrica en general, hasta si te digo que tiene cuatro lados, 16 00:01:21,890 --> 00:01:30,290 tú no puedes calcular ni su perímetro ni su área hasta que yo te haya definido qué figura 17 00:01:30,290 --> 00:01:40,030 geométrica es se entiende yo te digo un cuadro tiene cuatro lados que es un cuadrado la calcula 18 00:01:40,030 --> 00:01:45,849 es una forma si es un rectángulo de forma si es un trapecio puede ser natural de transformó 19 00:01:45,849 --> 00:01:54,150 Entonces, podrías tú encontrar la forma más general, o sea, al final un cuadrado es un rectángulo. 20 00:01:55,469 --> 00:01:59,049 Es un rectángulo especial con todos los lados iguales. 21 00:02:00,390 --> 00:02:03,689 Si tú aplicas las fórmulas de rectángulos al cuadrado funciona. 22 00:02:04,609 --> 00:02:10,969 La fórmula de cuadrado de rectángulo no, porque el cuadrado es un rectángulo, el rectángulo no es un cuadrado. 23 00:02:10,969 --> 00:02:15,090 Entonces, en nuestra jerarquía yo podría hacer que cuadrado herede de rectángulo. 24 00:02:15,849 --> 00:02:20,550 Sí, pero bueno, independientemente de todas estas cosas. 25 00:02:22,409 --> 00:02:28,590 Puede ser, cuando yo estoy tratando de figura geométrica, no puedo hacer nada. 26 00:02:28,789 --> 00:02:33,830 Hasta que tú no hayas dicho, oye, mira, esta figura geométrica es un cuadrado o es un triángulo, 27 00:02:34,270 --> 00:02:36,770 se queda allí, se queda como, vale, muy bien. 28 00:02:37,330 --> 00:02:42,729 Ahora, por como lo hemos hecho hasta ahora, yo puedo crear un objeto figura geométrica. 29 00:02:43,530 --> 00:02:45,789 Yo puedo hacer un new figura geométrica. 30 00:02:45,849 --> 00:02:47,750 Pero luego, ¿para qué me sirve? 31 00:02:49,409 --> 00:02:52,870 Porque si yo tengo figuras geométricas, tengo una figura geométrica, 32 00:02:53,289 --> 00:02:54,370 ¿puedo calcular su área? 33 00:02:57,210 --> 00:03:01,729 No, porque una figura geométrica no tiene área, ¿correcto? 34 00:03:04,759 --> 00:03:08,139 Incorrecto, todas las figuras geométricas tienen área. 35 00:03:09,800 --> 00:03:14,400 El problema es que se calcula de forma distinta, ¿me entendéis en esto? 36 00:03:14,400 --> 00:03:27,680 O sea, yo sé que, en general, todas las figuras geométricas tendrán un número de lados, tendrán un área y tendrán un perímetro. 37 00:03:28,439 --> 00:03:28,879 Lo sé. 38 00:03:30,379 --> 00:03:34,719 Pero luego, dependiendo del tipo de figura, se calcula de una forma o de otra. 39 00:03:35,379 --> 00:03:36,080 Queda claro esto. 40 00:03:36,979 --> 00:03:40,000 Entonces, a mí lo que me gustaría es decir, vale, muy bien, 41 00:03:40,000 --> 00:03:44,699 hagamos algo en común 42 00:03:44,699 --> 00:03:47,300 generalizamos las figuras geométricas 43 00:03:47,300 --> 00:03:49,159 pillo el cuadrado, pillo el rectángulo 44 00:03:49,159 --> 00:03:50,000 pillo el 45 00:03:50,000 --> 00:03:52,680 pentágono 46 00:03:52,680 --> 00:03:55,139 y digo, vale, todos estos de aquí tienen 47 00:03:55,139 --> 00:03:55,860 algo en común 48 00:03:55,860 --> 00:03:59,120 por ejemplo, perímetro y área 49 00:03:59,120 --> 00:04:01,060 o sea, se puede calcular su perímetro 50 00:04:01,060 --> 00:04:02,060 se puede calcular su área 51 00:04:02,060 --> 00:04:04,020 pero 52 00:04:04,020 --> 00:04:07,219 es específico de cada figura 53 00:04:07,219 --> 00:04:08,379 como se hace 54 00:04:08,379 --> 00:04:09,539 vale, fenomenal 55 00:04:09,539 --> 00:04:33,740 No puedo yo crear una jerarquía de herencia en el que por arriba pongo esta figura geométrica y ya allí digo, oye, mira, cualquier figura geométrica que herede de mí va a tener la posibilidad de calcular el área y calcular el perímetro, pero sin definir cómo se hace. 56 00:04:33,740 --> 00:04:39,120 yo quiero crear una figura geométrica 57 00:04:39,120 --> 00:04:41,220 que no sea un objeto 58 00:04:41,220 --> 00:04:43,220 que luego tú puedas crear una forma geométrica 59 00:04:43,220 --> 00:04:44,800 porque una forma geométrica no me interesa 60 00:04:44,800 --> 00:04:46,800 a mí me interesa el cuadrado, el triángulo y cosas por el estilo 61 00:04:46,800 --> 00:04:48,699 pero en vez de repetir 62 00:04:48,699 --> 00:04:50,500 en cada una de las formas 63 00:04:50,500 --> 00:04:52,899 reales, de las formas concretas 64 00:04:52,899 --> 00:04:54,459 parte de código 65 00:04:54,459 --> 00:04:56,660 o cosas que deberían estar 66 00:04:56,660 --> 00:04:58,899 en todas las formas geométricas 67 00:04:58,899 --> 00:05:00,720 yo quiero definir 68 00:05:00,720 --> 00:05:02,899 un esquema general 69 00:05:02,899 --> 00:05:04,560 no implementable 70 00:05:04,560 --> 00:05:13,480 que tendré como punto más alto de mi jerarquía, digamos así. 71 00:05:14,079 --> 00:05:19,240 Y luego, a partir de este esquema general, formaré los esquemas concretos. 72 00:05:20,060 --> 00:05:21,339 Cuadrado, triángulo, etc. 73 00:05:22,439 --> 00:05:26,220 Constantemente quiero crear una clase que no sea concreta, 74 00:05:26,620 --> 00:05:28,860 que no sea instanciable, 75 00:05:29,199 --> 00:05:33,819 a que sea una clase abstracta. 76 00:05:33,819 --> 00:05:34,439 ¿Vale? 77 00:05:35,399 --> 00:05:42,899 Una clase abstracta es una clase que puede definir lo que se llaman métodos abstractos. 78 00:05:43,500 --> 00:05:50,500 Un método abstracto es un método que tú me dices, este método existe, pero no te lo implemento. 79 00:05:51,360 --> 00:05:52,699 No hay una implementación. 80 00:05:53,259 --> 00:05:55,500 No hay el código que define cómo se hace. 81 00:05:55,860 --> 00:06:01,720 Yo te estoy diciendo que está el método calcular área, pero no te digo cómo se calcula el área, 82 00:06:01,819 --> 00:06:03,860 porque no te lo puedo decir de una figura geométrica. 83 00:06:04,439 --> 00:06:09,800 Cuando tú crearás un triángulo que extiende figura geométrica, 84 00:06:10,360 --> 00:06:15,000 el triángulo tendrá que implementar el método abstracto. 85 00:06:15,579 --> 00:06:20,920 El método abstracto calcularia, que tú has metido que todas las figuras geométricas tienen calcularia, 86 00:06:21,779 --> 00:06:26,779 pero tú lo implementarás en una subclase, no en la clase abstracta. 87 00:06:28,259 --> 00:06:28,699 ¿Entiendes? 88 00:06:30,100 --> 00:06:34,180 Pero a veces hay una clase que define un concepto genérico con unas características y métodos 89 00:06:34,180 --> 00:06:36,420 que no se pueden concretar directamente. 90 00:06:36,800 --> 00:06:38,379 Por ejemplo, una figura geométrica 91 00:06:38,379 --> 00:06:40,180 tiene sentido que tenga un método 92 00:06:40,180 --> 00:06:41,819 para calcular su perímetro y su área, 93 00:06:42,660 --> 00:06:45,079 pero cómo se calculan estos 94 00:06:45,079 --> 00:06:46,740 depende de la figura geométrica concreta. 95 00:06:46,939 --> 00:06:48,339 O, por ejemplo, un vehículo 96 00:06:48,339 --> 00:06:50,000 tendrá la capacidad de moverse, 97 00:06:50,500 --> 00:06:53,060 pero cómo lo hace depende del vehículo concreto. 98 00:06:53,060 --> 00:06:56,519 Cuando yo uso el moverse sobre un barco, 99 00:06:56,819 --> 00:06:59,259 hará una cosa distinta que moverse sobre un avión, 100 00:06:59,540 --> 00:07:00,620 que moverse sobre un tren, 101 00:07:00,899 --> 00:07:01,920 que moverse sobre un coche. 102 00:07:02,740 --> 00:07:03,920 Pero todo se puede mover. 103 00:07:04,180 --> 00:07:13,139 ¿Se entiende? Entonces, este moverse, este cálculo área, este cálculo perímetro, serán métodos abstractos. 104 00:07:13,300 --> 00:07:20,040 Métodos que todos los que deriven de esta clase, todos los que estendan esta clase, 105 00:07:20,160 --> 00:07:25,379 todos los que sean subclase de esta clase, van a tener que implementar, porque es normal que los tengan. 106 00:07:25,779 --> 00:07:32,439 Pero como depende de la subclase concreta, yo ahora te digo solo que existe, pero no te digo cómo sea. 107 00:07:32,439 --> 00:07:33,699 me lo dirás 108 00:07:33,699 --> 00:07:36,339 si yo uso una clase abstracta 109 00:07:36,339 --> 00:07:37,899 puedo dejar este método 110 00:07:37,899 --> 00:07:40,199 abstracto, sin implementación 111 00:07:40,199 --> 00:07:41,240 sin cuerpo 112 00:07:41,240 --> 00:07:42,779 ¿vale? 113 00:07:43,319 --> 00:07:45,920 cuando tú extenderás mi clase 114 00:07:45,920 --> 00:07:47,800 heredarás este método 115 00:07:47,800 --> 00:07:49,779 pero lo heredarás sin cuerpo 116 00:07:49,779 --> 00:07:51,079 y tendrás que 117 00:07:51,079 --> 00:07:58,139 ¿y cómo se llama 118 00:07:58,139 --> 00:07:59,680 cuando yo hago el cuerpo de un método 119 00:07:59,680 --> 00:08:00,860 que estaba en mi superclase? 120 00:08:02,259 --> 00:08:03,060 sobrescribirlo 121 00:08:03,060 --> 00:08:04,120 override 122 00:08:04,120 --> 00:08:06,639 ¿entiendes? 123 00:08:07,519 --> 00:08:09,339 es como si fuera un pseudo 124 00:08:09,339 --> 00:08:11,399 contrato en el que 125 00:08:11,399 --> 00:08:13,360 yo te digo, mira, todas las clases 126 00:08:13,360 --> 00:08:14,759 que van a heredar de mí 127 00:08:14,759 --> 00:08:17,560 tienen necesariamente que tener esto, esto y esto 128 00:08:17,560 --> 00:08:18,860 lo van a tener 129 00:08:18,860 --> 00:08:21,600 si no lo 130 00:08:21,600 --> 00:08:23,259 implementan, pues 131 00:08:23,259 --> 00:08:23,920 daré un error 132 00:08:23,920 --> 00:08:27,480 lo que puedo hacer es que tenga una clase abstracta 133 00:08:27,480 --> 00:08:29,379 y que tenga otro nivel de abstracción 134 00:08:29,379 --> 00:08:31,319 o sea, una clase, una subclase 135 00:08:31,319 --> 00:08:33,200 que también sea abstracta 136 00:08:33,200 --> 00:08:38,279 Entonces no tiene que implementar los métodos abstractos. 137 00:08:38,460 --> 00:08:41,840 Mientras que la clase abstracta puede contener dentro método abstracto. 138 00:08:41,919 --> 00:08:45,240 Pero una clase abstracta no se puede implementar. 139 00:08:45,379 --> 00:08:48,139 No puede hacer una new de una clase abstracta. 140 00:08:49,909 --> 00:08:56,129 Una clase abstracta puede declarar, además de métodos normales, también métodos abstractos. 141 00:08:57,690 --> 00:09:01,669 Porque a lo mejor algunas cosas sí que la puede implementar. 142 00:09:01,669 --> 00:09:10,149 Si yo tengo el método de cuenta lados y toda la figura geométrica tiene lados, pues lo puedo implementar directamente en figura geométrica. 143 00:09:10,789 --> 00:09:15,429 No todos los métodos de figura geométrica que se trata tienen que ser abstractos. 144 00:09:15,889 --> 00:09:21,669 Pero con que una clase tenga al menos un método abstracto, pues esa clase es abstracta. 145 00:09:30,389 --> 00:09:31,649 Métodos abstractos. 146 00:09:31,649 --> 00:09:38,149 Un método abstracto es aquel que no tiene más que la definición del mismo sin su implementación. 147 00:09:38,330 --> 00:09:41,269 Es decir, que no tiene la parte de las llaves. 148 00:09:42,370 --> 00:09:43,389 Y se declara así. 149 00:09:44,070 --> 00:09:49,710 Public abstract int método abstracto, sus parámetros. 150 00:09:50,350 --> 00:09:55,289 Y aquí en vez de abrir llave y poner el código, pongo directamente punto y coma. 151 00:09:56,330 --> 00:09:58,350 Esta es la declaración de un método abstracto. 152 00:09:58,889 --> 00:10:00,870 ¿Cuál es el cuerpo? ¿Qué hace? No lo sé. 153 00:10:00,870 --> 00:10:02,230 ¿Y cuándo lo sabré? 154 00:10:02,509 --> 00:10:08,090 Cuando una clase que extenda esa clase implemente este método sobre escribiendo. 155 00:10:08,330 --> 00:10:23,139 Sí, figura geométrica tendrá public abstract, double, calcular área, abierta paréntesis, cerrada paréntesis, punto y coma. 156 00:10:23,679 --> 00:10:28,679 ¿Cómo se calcula el área? No lo sé, pero de una figura geométrica puedo crear un área. 157 00:10:30,299 --> 00:10:36,419 Cuando extenderé figura geométrica creando cuadrado, cuadrado extends figura geométrica, 158 00:10:36,419 --> 00:10:41,440 cuadrado será obligado a sobreescribir el método calcular área. 159 00:10:42,200 --> 00:10:45,779 Y lo hará usando su fórmula para calcular el área. 160 00:10:46,559 --> 00:10:50,019 Ahora luego esto lo hacemos prácticamente. 161 00:10:50,019 --> 00:10:55,019 A ver, retomamos el ejercicio del viernes y lo volvemos a hacer con clase abstracta. 162 00:10:57,600 --> 00:11:04,179 Un método abstracto debe ser obligatoriamente redefinido en las subclases, no abstractas. 163 00:11:04,360 --> 00:11:07,179 Si la subclase es abstracta, lo puede dejar sin definir. 164 00:11:07,179 --> 00:11:12,559 permiten declarar en la superclase 165 00:11:12,559 --> 00:11:14,340 un comportamiento que deberán 166 00:11:14,340 --> 00:11:16,639 complementar todas las subclases 167 00:11:16,639 --> 00:11:18,360 pero sin decir nada 168 00:11:18,360 --> 00:11:19,539 sobre su implementación 169 00:11:19,539 --> 00:11:21,980 yo te estoy diciendo, todas mis subclases 170 00:11:21,980 --> 00:11:23,740 tienen que tener calcular área 171 00:11:23,740 --> 00:11:26,279 pero cómo se hará, pues no lo sé 172 00:11:26,279 --> 00:11:27,480 lo sabrá la subclase 173 00:11:27,480 --> 00:11:29,220 ¿dudas? 174 00:11:30,759 --> 00:11:31,340 ¿preguntas? 175 00:11:36,549 --> 00:11:38,730 vale, entonces aquí por ejemplo 176 00:11:38,730 --> 00:11:40,789 tengo una superclase, cuando esas tratas 177 00:11:40,789 --> 00:11:47,490 se le pone en cursiva. Una superclase que tiene dentro un método que es real y otro método, 178 00:11:47,490 --> 00:11:53,169 veis que está en cursiva, que es un método abstracto. El método 2 es abstracto. Cuando 179 00:11:53,169 --> 00:11:59,529 yo tengo la subclase que hereda de esta superclase, hereda el método 1 con ya su implementación, 180 00:11:59,649 --> 00:12:05,490 que si quiere puede sobreescribir o si quiere puede no sobreescribir. Lo ha heredado y luego 181 00:12:05,490 --> 00:12:12,210 tiene el método 2 que ha heredado el prototipo ha heredado el hecho que tiene que existir pero le 182 00:12:12,210 --> 00:12:20,190 falta el método para que esta clase no sea abstracta tiene necesariamente que implementar 183 00:12:20,190 --> 00:12:29,110 el método 2 si no lo implementa pues no funciona da un error entonces tengo dos opciones o pongo 184 00:12:29,110 --> 00:12:36,070 que esta subclase también es abstracta y entonces puede dejar el método 2 abstracto pero no puede 185 00:12:36,070 --> 00:12:41,710 hacer una new ni de superclase ni de subclase porque son abstractas las dos. O la otra opción 186 00:12:41,710 --> 00:12:46,330 es que en subclase no la pongo abstracta y entonces tengo que implementar todos los 187 00:12:46,330 --> 00:12:52,750 métodos abstractos que he regalado. Además que pueda sobreescribir los otros métodos si quiere. 188 00:12:52,750 --> 00:12:54,309 dudas 189 00:12:54,309 --> 00:12:58,879 una clase abstracta no se puede 190 00:12:58,879 --> 00:13:01,360 instanciar clases abstractas 191 00:13:01,360 --> 00:13:03,019 no puedo hacer una new 192 00:13:03,019 --> 00:13:05,179 de una clase abstracta, me va a dar 193 00:13:05,179 --> 00:13:05,580 error 194 00:13:05,580 --> 00:13:09,039 se puede instanciar 195 00:13:09,039 --> 00:13:11,240 clases heredadas siempre que no sean 196 00:13:11,240 --> 00:13:12,820 abstractas a su vez, vale 197 00:13:12,820 --> 00:13:15,259 entonces si yo tengo una clase abstracta 198 00:13:15,259 --> 00:13:17,299 ahí tengo otra clase que hereda esta clase abstracta 199 00:13:17,299 --> 00:13:19,259 y esta otra clase que hereda la subclase 200 00:13:19,899 --> 00:13:21,580 no es abstracta 201 00:13:21,580 --> 00:13:23,500 pues puedo hacer una new de la subclase 202 00:13:23,500 --> 00:13:25,320 Pero no, no, ni de la superclase. 203 00:13:26,120 --> 00:13:29,840 Se pueden instanciar subclases utilizando la referencia a la clase padre. 204 00:13:30,320 --> 00:13:33,480 Por ejemplo, si tengo esta situación de aquí, ¿vale? 205 00:13:33,580 --> 00:13:37,759 Clase figura donde tengo un método abstracto que es dibuja para dibujar esta figura. 206 00:13:38,340 --> 00:13:43,419 Luego tengo la clase rectángulo que extiende figura y que implementa con su código dibuja. 207 00:13:43,559 --> 00:13:46,919 Y la clase círculo que extiende figura y que implementa también la figura. 208 00:13:47,379 --> 00:13:50,360 Yo puedo crear figura f es igual a niu rectángulo. 209 00:13:50,980 --> 00:13:51,360 ¿Por qué? 210 00:13:51,360 --> 00:14:01,019 ¿Por qué puedo crear figura f es igual a newRectangulo? 211 00:14:11,179 --> 00:14:11,740 ¡Exacto! 212 00:14:11,879 --> 00:14:16,000 Porque la relación de herencia es una relación de esin 213 00:14:16,000 --> 00:14:18,940 Y un rectángulo es una figura 214 00:14:18,940 --> 00:14:21,179 Por lo tanto, cuando creo un rectángulo 215 00:14:21,179 --> 00:14:27,080 Lo puedo guardar tranquilamente en una referencia de tipo figura 216 00:14:27,080 --> 00:14:29,879 Porque todo lo que puede hacer una figura lo puede hacer un rectángulo 217 00:14:29,879 --> 00:14:31,240 Al revés, no 218 00:14:31,240 --> 00:14:34,440 No puede hacer rectángulo r es igual a newFigura 219 00:14:34,440 --> 00:14:36,039 Por dos razones 220 00:14:36,039 --> 00:14:37,279 Razón número uno 221 00:14:37,279 --> 00:14:47,539 Primero porque una figura no es un rectángulo 222 00:14:47,539 --> 00:14:48,639 Y segundo 223 00:14:48,639 --> 00:14:54,740 Segunda razón de por qué no puede hacer rectángulo R es igual a new figura 224 00:14:54,740 --> 00:14:58,259 Está escrito en negrita 225 00:14:58,259 --> 00:15:02,220 ¡Muy bien! 226 00:15:02,919 --> 00:15:04,059 ¿Cómo te has salido? 227 00:15:04,059 --> 00:15:06,480 Yo creo que te he perdido 228 00:15:06,480 --> 00:15:08,840 Enhorabuena 229 00:15:08,840 --> 00:15:11,620 Vale, hasta aquí hemos entendido esto 230 00:15:11,620 --> 00:15:16,659 esto se puede aplicar a cualquier cosa 231 00:15:16,659 --> 00:15:18,419 yo puedo hacer personas 232 00:15:18,419 --> 00:15:19,279 ¿se acuerdan? hay personas 233 00:15:19,279 --> 00:15:22,440 que le daban alumnos 234 00:15:22,440 --> 00:15:23,240 y profesores 235 00:15:23,240 --> 00:15:26,600 en una clase, en un instituto 236 00:15:26,600 --> 00:15:28,399 a mí me interesan alumnos 237 00:15:28,399 --> 00:15:30,379 y profesores, no me interesan 238 00:15:30,379 --> 00:15:31,120 personas 239 00:15:31,120 --> 00:15:34,299 la persona me interesa 240 00:15:34,299 --> 00:15:36,700 como molde para definir 241 00:15:36,700 --> 00:15:38,080 toda la estructura de una persona 242 00:15:38,080 --> 00:15:40,320 que comparten alumnos 243 00:15:40,320 --> 00:15:42,440 y profesores, pero luego cuando 244 00:15:42,440 --> 00:15:44,460 lo uso en la escuela, yo quiero por un lado 245 00:15:44,460 --> 00:15:46,419 alumnos y por un lado profesores. Es 246 00:15:46,419 --> 00:15:48,620 decir, que difícilmente 247 00:15:48,620 --> 00:15:50,340 yo crearé una persona 248 00:15:50,340 --> 00:15:52,559 como objeto. Yo o creo 249 00:15:52,559 --> 00:15:54,700 alumnos o creo profesores. 250 00:15:55,840 --> 00:15:56,360 ¿Entendéis? 251 00:15:56,919 --> 00:15:58,320 Entonces, persona sería 252 00:15:58,320 --> 00:16:02,139 abstracto. 253 00:16:03,820 --> 00:16:04,120 De esta 254 00:16:04,120 --> 00:16:06,259 forma no puedo crear una persona. 255 00:16:07,980 --> 00:16:08,639 Y luego 256 00:16:08,639 --> 00:16:09,139 herede. 257 00:16:11,139 --> 00:16:11,620 ¿Sí? 258 00:16:12,279 --> 00:16:12,759 Bueno. 259 00:16:14,139 --> 00:16:22,600 Dicho esto, viene otro concepto interesante que hemos usado en un ejercicio 2. 260 00:16:22,600 --> 00:16:26,379 Hemos hecho esto en lo del viernes que me preguntabas tú, Dennis. 261 00:16:27,139 --> 00:16:29,740 ¿Qué es el concepto del polimorfismo? 262 00:16:29,879 --> 00:16:30,740 ¿Qué es el polimorfismo? 263 00:16:31,259 --> 00:16:36,980 Dos métodos se definen como polimórficos, o sea, tienen polimorfismo, 264 00:16:36,980 --> 00:16:46,220 Si con el mismo nombre hacen funciones distintas, aunque similares, en objetos distintos. 265 00:16:50,100 --> 00:16:57,480 Es decir, si yo tengo la clase triangular y la clase cuadrada, 266 00:16:58,080 --> 00:17:02,519 y los dos tienen el método calcular área, 267 00:17:03,120 --> 00:17:04,480 calcular área hace lo mismo. 268 00:17:04,799 --> 00:17:05,700 ¿Qué hace calcular área? 269 00:17:06,960 --> 00:17:07,839 Calcular área. 270 00:17:08,079 --> 00:17:08,740 Calcular área. 271 00:17:08,740 --> 00:17:16,420 La función es la misma, ¿vale? Tiene el mismo nombre, pero ¿cómo lo hacen? Es distinto. 272 00:17:16,940 --> 00:17:25,579 El triángulo lo calculará como base por alteza dividido por 2, el cuadrado lo calculará como base por alteza, o sea, lado por lado, o lado por lado. 273 00:17:26,799 --> 00:17:34,920 O sea, hacen lo mismo, calcular el área, en funciones parecidas, son similares porque están haciendo lo mismo, 274 00:17:34,920 --> 00:17:41,319 pero son distintos si yo llamo calcular es un triángulo o calcular es un cuadrado. 275 00:17:41,319 --> 00:17:49,720 ¿Vale? Entonces este método se dice polimórfico, porque se adapta, adapta su forma, tiene varias 276 00:17:49,720 --> 00:17:54,240 formas dependiendo de si lo llamo sobre un triángulo o sobre un cuadrado, sobre un coche 277 00:17:54,240 --> 00:18:02,079 o sobre un barco, sobre un alumno o sobre un profesor. ¿Entiende? No es el mismo método, 278 00:18:02,079 --> 00:18:13,160 Son dos métodos parecidos con el mismo nombre que hacen la misma funcionalidad de forma distinta en objetos distintos. 279 00:18:15,220 --> 00:18:30,740 Normalmente esto deriva del hecho que yo tenía una clase superclase, he heredado de esta superclase y he especializado el método que estaba en la superclase en mis subclases. 280 00:18:30,740 --> 00:18:33,019 Yo tenía calculadores de figuras 281 00:18:33,019 --> 00:18:35,099 Ahora lo he pasado en triángulos 282 00:18:35,099 --> 00:18:36,640 Y lo he especificado para triángulos 283 00:18:36,640 --> 00:18:39,099 Lo he pasado a cuadrados y lo he especificado para cuadrados 284 00:18:39,099 --> 00:18:41,119 Y ahora tengo dos métodos que hacen lo mismo 285 00:18:41,119 --> 00:18:43,460 Pero que hacen cosas 286 00:18:43,460 --> 00:18:45,740 Que como lo hacen es distinto 287 00:18:45,740 --> 00:18:48,019 Dependiendo del objeto sobre el que lo llevo 288 00:18:48,019 --> 00:18:50,980 ¿Se entiende el polimorfismo? 289 00:18:54,259 --> 00:18:55,019 O concepto 290 00:18:55,019 --> 00:18:57,700 Por ejemplo, el polimorfismo es el método 291 00:18:57,700 --> 00:18:59,099 Calcular el rectángulo del círculo 292 00:18:59,099 --> 00:19:01,759 Polimorfismo 293 00:19:01,759 --> 00:19:08,279 Otro método de polimorfismo sería el método moverse de coche, o sea, vehículo, coche, bar. 294 00:19:09,220 --> 00:19:14,700 Otro método de polimorfismo es el método saludar de persona, alumno, profesor. 295 00:19:15,700 --> 00:19:18,960 Porque el alumno dice, hola, soy el alumno Stefano, 296 00:19:19,059 --> 00:19:20,819 y el profesor dice, hola, soy el profesor Kier. 297 00:19:23,900 --> 00:19:24,299 ¿Entiendes? 298 00:19:25,140 --> 00:19:26,359 Hacen lo mismo, saludan. 299 00:19:27,359 --> 00:19:31,180 Pero uno diciendo que es un alumno y diciendo que es su nombre, 300 00:19:31,180 --> 00:19:39,779 y otro en vez dice que es un profesor y pone su apellido. 301 00:19:40,140 --> 00:19:42,240 Por último, si hablamos de clases, 302 00:19:42,759 --> 00:19:47,480 el polimorfismo es lo que nos permite crear una clase con la referencia padre 303 00:19:47,480 --> 00:19:50,180 pero que apunta a una clase hija, ¿vale? 304 00:19:50,220 --> 00:19:51,740 Como hemos visto anteriormente. 305 00:19:51,839 --> 00:19:55,420 O sea, cuando decimos que figura F es igual a un rectángulo, 306 00:19:56,400 --> 00:19:58,319 estamos usando una forma de polimorfismo 307 00:19:58,319 --> 00:20:09,460 Porque estamos, sustancialmente, utilizando un puntero, un tipo de variable de tipo superclase, 308 00:20:09,980 --> 00:20:13,319 metiendo dentro un objeto de tipo subclase. 309 00:20:14,359 --> 00:20:19,079 Se puede hacer porque cualquier subclase antes crea un objeto para la superclase. 310 00:20:19,440 --> 00:20:24,160 Cualquier subclase es una superclase, entonces cualquier cosa que haga una superclase, 311 00:20:24,500 --> 00:20:25,640 la puede hacer una subclase. 312 00:20:25,640 --> 00:20:35,650 A lo mejor de forma distinta, pero lo puede hacer. Cuando se usa un método sobre un objeto, 313 00:20:35,650 --> 00:20:43,009 se usará el de la clase de la que ese objeto es instancia. ¿Vale? Esto lo hemos visto. Es decir, 314 00:20:43,009 --> 00:20:51,970 que cuando yo llamo, yo tengo una cadena de herencia. Tengo, no sé, vehículo, luego tengo 315 00:20:51,970 --> 00:20:59,650 coche y luego tengo coche fantástico, que heredan una de otra. Y tengo moverse. El vehículo tiene 316 00:20:59,650 --> 00:21:05,049 moverse, el coche tiene moverse y el coche fantástico tiene también moverse. ¿De acuerdo? 317 00:21:05,049 --> 00:21:14,210 Cuando yo llamo moverse sobre un objeto se puede usar el de vehículo, el de coche o el de coche 318 00:21:14,210 --> 00:21:23,589 fantástico. El que se elige depende de la instancia, no de la referencia. 319 00:21:23,589 --> 00:21:28,970 Si yo tengo esta cosa aquí, figura f es igual a un rectángulo, y ahora llamo 320 00:21:28,970 --> 00:21:37,279 f.calcularia, ¿dónde voy a mirar la implementación de este método? 321 00:21:37,279 --> 00:21:44,119 ¿Qué se usa? ¿Cuál método se usa? ¿El de figura o el de rectángulo? 322 00:21:44,119 --> 00:21:48,220 Es de la clase rectángulo porque la instancia es rectángulo. 323 00:21:50,369 --> 00:21:50,710 ¿Está claro? 324 00:21:54,210 --> 00:21:57,250 Podemos usar una superclase como parámetro formal 325 00:21:57,250 --> 00:22:03,890 y luego usar el método apropiado basándose sobre el objeto pasado como parámetro actual. 326 00:22:05,109 --> 00:22:07,569 Yo parámetro formal de un método puedo decir 327 00:22:07,569 --> 00:22:14,849 método haz algo que me pasas una figura. 328 00:22:14,849 --> 00:22:17,869 y dentro 329 00:22:17,869 --> 00:22:19,970 este método haz algo, calcula su área 330 00:22:19,970 --> 00:22:21,029 para hacer no sé qué 331 00:22:21,029 --> 00:22:23,970 ahora, si tú 332 00:22:23,970 --> 00:22:25,910 cuando usas este método haz algo 333 00:22:25,910 --> 00:22:27,890 que pilla una figura, me pasas un 334 00:22:27,890 --> 00:22:29,910 rectángulo, yo usaré 335 00:22:29,910 --> 00:22:32,589 la calcularía del rectángulo 336 00:22:32,589 --> 00:22:33,890 cuando tú 337 00:22:33,890 --> 00:22:36,309 si tú me pasas un triángulo, usaré la calcularía 338 00:22:36,309 --> 00:22:38,170 del triángulo, si tú me pasas un 339 00:22:38,170 --> 00:22:40,450 círculo, usaré la calcularía del círculo 340 00:22:40,450 --> 00:22:41,990 pero dentro 341 00:22:41,990 --> 00:22:43,930 en el código estoy usando figura 342 00:22:43,930 --> 00:22:54,230 y estoy usando este. Cuando tenemos que crear un objeto de una clase heredada podemos utilizar 343 00:22:54,230 --> 00:22:59,930 como clase referencial a la del padre o la del hijo. Tenemos una clase padre y una clase hijo. 344 00:22:59,930 --> 00:23:07,490 Puedo usar padre object es igual a new hijo. Funciona. Padre object es igual a new padre. 345 00:23:07,490 --> 00:23:15,289 Siempre y solo padre tiene que ser no astra. Si padre es una clase astral esto no lo puedo hacer. 346 00:23:15,289 --> 00:23:21,730 Pero si padre, como hemos hecho hasta ahora, es una clase no abstracta, puede hacer esto. 347 00:23:21,730 --> 00:23:29,670 E hijo object es igual a new object, new hijo. Estas tres cosas se pueden hacer, ¿vale? 348 00:23:29,670 --> 00:23:37,410 Lo que no puede hacer es, hijo object es igual a new padre, porque el hijo, 349 00:23:37,410 --> 00:23:39,849 el padre no es un hijo 350 00:23:39,849 --> 00:23:41,250 el hijo es un padre 351 00:23:41,250 --> 00:23:42,490 ¿sí? 352 00:23:44,049 --> 00:23:44,829 dicho así 353 00:23:44,829 --> 00:23:46,650 no tiene sentido, pero me entiendo 354 00:23:46,650 --> 00:23:48,509 vale 355 00:23:48,509 --> 00:23:51,329 hay tres formas posibles de estanciarla 356 00:23:51,329 --> 00:23:52,970 ¿vale? hijo barra h 357 00:23:52,970 --> 00:23:54,829 guardaño hijo barraño hijo 358 00:23:54,829 --> 00:23:56,250 ¿vale? lo que estamos diciendo ahora 359 00:23:56,250 --> 00:23:59,450 podremos acceder a todos los métodos de atributo del hijo 360 00:23:59,450 --> 00:24:00,589 y del padre ¿vale? 361 00:24:00,950 --> 00:24:03,490 si hay métodos sobrescritos solo accederemos a los del hijo 362 00:24:03,490 --> 00:24:05,490 queda claro esta cosa aquí 363 00:24:05,490 --> 00:24:07,730 si yo tengo una 364 00:24:07,730 --> 00:24:10,349 variable de tipo hijo 365 00:24:10,349 --> 00:24:11,549 y un objeto de tipo hijo 366 00:24:11,549 --> 00:24:13,849 puedo acceder a todos los métodos del hijo 367 00:24:13,849 --> 00:24:15,950 puedo acceder a todos los métodos del padre 368 00:24:15,950 --> 00:24:17,130 porque los tengo heredados 369 00:24:17,130 --> 00:24:20,630 pero si tengo un método sobrescrito 370 00:24:20,630 --> 00:24:22,470 no puedo acceder al del padre 371 00:24:22,470 --> 00:24:23,849 solo puedo acceder al del hijo 372 00:24:23,849 --> 00:24:31,109 si yo tengo un coche fantástico 373 00:24:31,109 --> 00:24:32,890 que heredaba de coche 374 00:24:32,890 --> 00:24:37,630 cuando uso el método sobre el coche fantástico 375 00:24:37,630 --> 00:24:39,210 no puedo usar el método 376 00:24:39,210 --> 00:24:40,250 moverse del coche. 377 00:24:40,730 --> 00:24:42,829 Siempre se usará el método 378 00:24:42,829 --> 00:24:44,869 moverse del coche fantástico. 379 00:24:47,390 --> 00:24:47,509 ¿Sí? 380 00:24:49,329 --> 00:24:50,309 Si yo tengo 381 00:24:50,309 --> 00:24:51,549 padre, padre, padre, 382 00:24:51,549 --> 00:24:53,509 bueno, el padre puede acceder 383 00:24:53,509 --> 00:24:55,390 solo a los métodos y atributos 384 00:24:55,390 --> 00:24:57,509 del padre. No hay un hijo aquí 385 00:24:57,509 --> 00:24:59,269 porque no se ha creado el hijo. 386 00:25:01,009 --> 00:25:01,130 ¿Sí? 387 00:25:01,930 --> 00:25:03,509 Entonces es imposible acceder a los 388 00:25:03,509 --> 00:25:05,470 del hijo. No existen ni sus 389 00:25:05,470 --> 00:25:07,490 atributos ni sus métodos 390 00:25:07,490 --> 00:25:10,490 Porque he creado un coche, no un coche fantástico. 391 00:25:10,490 --> 00:25:14,490 Entonces tengo un coche, no le puedo hacer dar al botón esto que salta. 392 00:25:14,490 --> 00:25:19,490 ¿De qué estoy hablando? ¿O estoy víctima de la nostalgia? 393 00:25:19,490 --> 00:25:23,490 ¿No habéis visto nunca el coche fantástico? 394 00:25:23,490 --> 00:25:29,490 Pues los coches normales no saltan. El coche fantástico sí, y habla también. 395 00:25:29,490 --> 00:25:33,490 Y luego existe una cosa llamada upcasting, ¿vale? 396 00:25:33,490 --> 00:25:37,309 Es cuando digo, el padre es un hijo. 397 00:25:39,029 --> 00:25:44,170 O sea, tengo una referencia padre con dentro un objeto hijo. 398 00:25:44,170 --> 00:25:49,170 ¿Se puede hacer? Sí, porque la subclase es una superclase. 399 00:25:50,210 --> 00:25:50,869 Porque se puede hacer. 400 00:25:52,130 --> 00:25:55,190 Podemos acceder, pero solo a los métodos atributos del padre. 401 00:25:55,309 --> 00:25:58,250 Porque cuando uso la referencia, él creerá que es un padre. 402 00:25:58,869 --> 00:26:01,930 Entonces, no ve los métodos alternativos de hijo. 403 00:26:03,490 --> 00:26:21,460 Si un método del padre está sobrescrito, ¿cuál se usa? El del hijo. Porque cuál se usa no depende de la referencia, sino depende de la cosa, del estado. Y ahora hacemos todas pruebas de esto. 404 00:26:21,460 --> 00:26:24,559 solo podemos acceder a los delijos 405 00:26:24,559 --> 00:26:26,259 si hacemos un downcasting 406 00:26:26,259 --> 00:26:28,240 explícito, esto es un upcasting 407 00:26:28,240 --> 00:26:30,119 estoy casteando hacia arriba 408 00:26:30,119 --> 00:26:32,859 en la jerarquía 409 00:26:32,859 --> 00:26:33,599 de 410 00:26:33,599 --> 00:26:35,119 herencia 411 00:26:35,119 --> 00:26:38,240 y yo puedo hacer un downcasting 412 00:26:38,240 --> 00:26:40,500 explícito, o sea, castear hacia abajo 413 00:26:40,500 --> 00:26:42,579 ¿vale? siempre y cuando 414 00:26:42,579 --> 00:26:43,799 lo pueda hacer porque si no explota 415 00:26:43,799 --> 00:26:45,700 el downcasting 416 00:26:45,700 --> 00:26:48,500 consiste en poner la referencia que 417 00:26:48,500 --> 00:26:50,579 queramos bajar hacia la clase heredada 418 00:26:50,579 --> 00:27:09,500 Por ejemplo, esto. ¿Os acordáis que aquí yo había creado var h que es un hijo, pero que es de tipo padre? Pues ahora haciendo esto le estoy diciendo, mira, tú eres de tipo hijo. Trátame esta referencia, este objeto, como si fuera un hijo. Que lo puede hacer porque en realidad dentro de esta referencia de tipo padre hay un hijo. 419 00:27:09,500 --> 00:27:11,880 ¿Vale? Si cuando lo hago 420 00:27:11,880 --> 00:27:13,599 no es verdad que esta 421 00:27:13,599 --> 00:27:15,559 bar h no apuntaba aquí, 422 00:27:15,640 --> 00:27:17,539 por ejemplo, si intento hacer hijo de 423 00:27:17,539 --> 00:27:19,839 bar p, pues me va 424 00:27:19,839 --> 00:27:21,440 a saltar una class cast exception. 425 00:27:22,140 --> 00:27:23,640 Estás intentando hacer un 426 00:27:23,640 --> 00:27:25,579 casting a una clase que 427 00:27:25,579 --> 00:27:27,460 no puedes hacer, porque 428 00:27:27,460 --> 00:27:29,799 no eres de ese tipo de clase. 429 00:27:30,380 --> 00:27:31,599 No, yo soy un vehículo que va a hacer 430 00:27:31,599 --> 00:27:33,539 un downcasting a un coche. 431 00:27:33,700 --> 00:27:35,240 No, tú eres un vehículo, no eres un coche. 432 00:27:40,559 --> 00:27:41,900 Y aquí empezarían interfaz, 433 00:27:42,319 --> 00:27:43,220 que hoy no va a pedir. 434 00:27:44,079 --> 00:27:47,700 Interfaces son clases abstractas donde no hay métodos concretos. 435 00:27:48,140 --> 00:27:49,279 Solo métodos abstractos. 436 00:27:51,039 --> 00:27:51,279 ¿Vale? 437 00:27:51,279 --> 00:27:55,579 Pero mañana o pasado. 438 00:27:58,240 --> 00:27:58,480 ¿Sí? 439 00:27:58,960 --> 00:27:59,920 ¿Dudas hasta aquí?