1 00:00:00,750 --> 00:00:07,990 Vale, esta clase está siendo grabada, si habláis me dais el consentimiento de grabaros, ¿vale? 2 00:00:08,189 --> 00:00:16,410 Entonces, aquí tenemos, hoy empezamos con, vamos a ver qué es el concepto de clase abstracta y polimorfismo, ¿vale? 3 00:00:17,129 --> 00:00:21,210 En realidad el polimorfismo ya lo conocemos, pero no sabemos qué se llama así, 4 00:00:21,210 --> 00:00:24,550 en realidad sabemos también qué se llama así, porque ya os lo he nombrado varias veces, ¿vale? 5 00:00:25,010 --> 00:00:27,089 Pero ya hablaremos de ello. 6 00:00:27,710 --> 00:00:30,210 Hoy el verdadero tema nuevo es la clase abstracta. 7 00:00:30,750 --> 00:00:31,890 ¿Por qué es una clase abstracta? 8 00:00:31,989 --> 00:00:39,329 ¿Habéis pensado alguna vez, ahora, mientras estabais haciendo estos ejercicios de herencia, 9 00:00:39,750 --> 00:00:49,329 que en determinados casos hay algunos métodos que tienen sentido en las clases hijas, 10 00:00:50,509 --> 00:00:52,990 ¿vale? En las clases hijas está claro, ¿vale? 11 00:00:53,049 --> 00:01:00,670 Pero en la clase padre, la clase de donde se hereda, tienen menos sentido de existir. 12 00:01:00,750 --> 00:01:05,650 Por ejemplo, vamos a hacer un ejemplo sencillo 13 00:01:05,650 --> 00:01:07,129 ¿Os acordáis dispositivo? 14 00:01:08,530 --> 00:01:13,250 Nosotros teníamos una clase dispositivo, uno de los primeros ejemplos de herencia que hemos hecho 15 00:01:13,250 --> 00:01:17,790 Ese dispositivo tenía sus métodos, sus funcionalidades, etc. 16 00:01:17,950 --> 00:01:20,370 Como por ejemplo, encender y apagar 17 00:01:20,370 --> 00:01:25,109 ¿Tiene sentido que un dispositivo se encienda o se apague? 18 00:01:26,609 --> 00:01:28,890 Sí, tiene bastante sentido 19 00:01:28,890 --> 00:01:33,230 Es una cosa que cualquier dispositivo, sea el dispositivo que sea 20 00:01:33,230 --> 00:01:36,370 Tiene sentido que se pueda encender y que se pueda apagar 21 00:01:36,370 --> 00:01:49,709 Estaría bien, como se dice, implementar, crear, codificar este método aquí en el dispositivo 22 00:01:49,709 --> 00:01:52,590 Ahora, cuando luego voy al estado 23 00:01:52,590 --> 00:02:05,150 Si os acordáis, nosotros estado lo utilizamos como ejemplo para luego en el móvil volver a sobreescribirlo 24 00:02:05,150 --> 00:02:14,150 Pero si lo pensáis, el estado, o sea, cómo se encuentra ahora el dispositivo o lo que tiene que hacer un dispositivo 25 00:02:14,150 --> 00:02:18,469 Es algo que depende mucho del dispositivo mismo 26 00:02:18,469 --> 00:02:24,610 Me explico. Un móvil tendrá un funcionamiento, podrá hacer cosas, podrá... 27 00:02:24,610 --> 00:02:34,449 El estado de un móvil, imaginándonos lo que puede ser, es cómo está la pantalla, o su RAM, o su potencia de cálculo, qué sé yo. 28 00:02:35,469 --> 00:02:42,669 Otros dispositivos distintos, como por ejemplo una televisión, podrían tener un estado completamente distinto. 29 00:02:42,669 --> 00:02:47,229 O un teléfono, no sé, una lavadora 30 00:02:47,229 --> 00:02:49,669 ¿Es siempre un dispositivo? Sí 31 00:02:49,669 --> 00:02:57,270 Pero mientras que el concepto de encendido y apagado se aplica bien a cualquier dispositivo posible 32 00:02:57,270 --> 00:03:04,729 Ya el concepto de estado depende mucho de la instancia concreta del dispositivo que yo tengo 33 00:03:04,729 --> 00:03:09,050 O sea que a nivel de dispositivo, a nivel de esta clase 34 00:03:09,050 --> 00:03:21,449 A lo mejor la implementación del estado es una cosa demasiado genérica, demasiado abstracta para implementarla aquí. 35 00:03:22,409 --> 00:03:30,569 Cuando ya estaré en el móvil, pues sé qué hacer para definir el estado del móvil. 36 00:03:30,710 --> 00:03:34,830 Cuando estaré en televisión, pues sabré el estado de la televisión. 37 00:03:34,830 --> 00:03:39,229 Pero en dispositivo, a lo mejor esta implementación que he hecho es demasiado genérica 38 00:03:39,229 --> 00:03:40,569 No me hace falta 39 00:03:40,569 --> 00:03:44,330 La idea de la clase abstracta es exactamente esta 40 00:03:44,330 --> 00:03:46,669 Es decir, oye, mira, como este método de aquí 41 00:03:46,669 --> 00:03:51,030 A este nivel de jerarquía de herencia 42 00:03:51,030 --> 00:03:53,710 Es demasiado abstracto 43 00:03:53,710 --> 00:03:57,030 Yo te pongo aquí que este método existe 44 00:03:57,030 --> 00:03:59,349 Pero no te doy la implementación 45 00:03:59,349 --> 00:04:08,449 Dejo aquí la existencia de todos los dispositivos tienen un método estado 46 00:04:08,449 --> 00:04:12,629 Pero no te digo el código del método estado 47 00:04:12,629 --> 00:04:18,110 Dejo este método como un método abstracto 48 00:04:18,110 --> 00:04:20,170 ¿Y qué es un método abstracto? 49 00:04:20,170 --> 00:04:23,949 Quiere decir que como no existe el código no lo puedo utilizar 50 00:04:23,949 --> 00:04:29,310 De hecho, como existe un método abstracto, también esta clase será abstracta 51 00:04:29,310 --> 00:04:32,930 Y cuando una clase es abstracta, no se puede implementar 52 00:04:32,930 --> 00:04:38,089 No puedo crear objetos de esa clase, no puedo crear objetos dispositivos como tales 53 00:04:38,089 --> 00:04:39,810 Voy a hacer mi dispositivo 54 00:04:39,810 --> 00:04:47,230 Porque habría una parte que no está codificada, no está implementada 55 00:04:47,230 --> 00:04:52,810 Pero a la vez te digo que cualquier clase que extenda dispositivo 56 00:04:52,810 --> 00:05:01,810 Entonces, cualquier clase que sea un dispositivo tendrá que tener este método y tendrá que implementarlo, sobreescribiéndolo. 57 00:05:02,750 --> 00:05:05,850 Entonces, desde abstracto se transformará en real. 58 00:05:07,230 --> 00:05:15,470 Entonces, lo que estoy obligando es que cualquier clase que extenda dispositivo tendrá estado. 59 00:05:15,589 --> 00:05:22,209 Entonces, yo podré utilizar estado en cualquier objeto que sea de una clase que extenda dispositivo. 60 00:05:22,810 --> 00:05:26,129 Sé que tiene que existir, porque te lo he puesto aquí como abstracto. 61 00:05:26,490 --> 00:05:29,089 Tu ron será de implementar este método. 62 00:05:29,870 --> 00:05:33,129 Pero el dispositivo por sí mismo, como no sé cómo implementarlo, 63 00:05:33,189 --> 00:05:36,149 porque es demasiado genérico, pues no lo voy a implementar yo. 64 00:05:36,730 --> 00:05:42,410 Lo voy a dejar a los implementadores de las clases que estenden este dispositivo. 65 00:05:44,050 --> 00:05:46,009 ¿Sí? ¿Se entiende más o menos el concepto? 66 00:05:46,069 --> 00:05:48,329 Ahora lo repasamos varias veces, ¿vale? 67 00:05:49,209 --> 00:05:51,930 Y entonces, ahí está la introducción. 68 00:05:51,930 --> 00:05:53,910 Que es una clase abstracta, ¿vale? 69 00:05:54,310 --> 00:05:59,629 Que a veces hay clases que definen un concepto muy genérico, ¿vale? 70 00:06:00,230 --> 00:06:07,949 Y que tienen características y métodos que en ese nivel no se pueden concretar, ¿vale? 71 00:06:07,990 --> 00:06:15,930 Un ejemplo típico que vosotros habéis hecho, que habéis implementado, pero a lo mejor os habréis dado cuenta de eso allí, es la figura geométrica. 72 00:06:16,970 --> 00:06:21,470 Cualquier figura geométrica tiene, por ejemplo, un perímetro y un área. 73 00:06:21,930 --> 00:06:29,889 ¿Justo? Pero es que cada figura geométrica tiene su forma de calcular el perímetro y la área. 74 00:06:30,290 --> 00:06:31,689 Son formas distintas. 75 00:06:32,129 --> 00:06:41,310 Entonces, ¿es justo decir cualquier figura geométrica, bueno, sumamos cualquier polígono, tiene un área? 76 00:06:41,850 --> 00:06:44,410 ¿Y tendrá que tener un método para calcular el área? 77 00:06:44,889 --> 00:06:46,610 Sí, tiene sentido. 78 00:06:47,250 --> 00:06:48,250 ¿Y cuál es este método? 79 00:06:48,250 --> 00:06:50,170 Pues no lo puedo saber 80 00:06:50,170 --> 00:06:55,730 Hasta que tú no me digas si es un triángulo, un cuadrado, un círculo o un hexágono 81 00:06:55,730 --> 00:06:57,889 Yo no sé cómo calcular su área 82 00:06:57,889 --> 00:07:02,329 Entonces la idea es que mi clase de figura geométrica 83 00:07:02,329 --> 00:07:05,810 Que algunos de vosotros ya habrán hecho en los ejercicios 84 00:07:05,810 --> 00:07:09,730 Pues la hago como abstracta 85 00:07:09,730 --> 00:07:13,949 Creo esta figura geométrica como clase abstracta 86 00:07:13,949 --> 00:07:20,389 le digo que como métodos abstractos tendrán que tener cálcula área y cálcula perímetro 87 00:07:20,389 --> 00:07:26,170 y por lo tanto estoy diciendo que cualquier clase que herede de figura geométrica 88 00:07:26,170 --> 00:07:31,810 tendrá que tener el método cálcula área y el método cálcula perímetro 89 00:07:31,810 --> 00:07:35,689 que pero serán concretos de la clase que creo 90 00:07:35,689 --> 00:07:39,930 cuando crearé la clase triángulo que extiende figura geométrica 91 00:07:39,930 --> 00:07:42,470 Yo sé que tendrá que tener un método 92 00:07:42,470 --> 00:07:44,209 Calcular área o un método 93 00:07:44,209 --> 00:07:46,230 Cálcula perímetro 94 00:07:46,230 --> 00:07:48,209 Pero como sé que es un triángulo 95 00:07:48,209 --> 00:07:50,069 Lo haré adaptado al triángulo 96 00:07:50,069 --> 00:07:53,870 ¿Make sense? 97 00:07:55,370 --> 00:07:56,730 Un ejemplo entonces es 98 00:07:56,730 --> 00:07:57,209 Sí 99 00:07:57,209 --> 00:08:01,879 No 100 00:08:01,879 --> 00:08:04,699 De hecho, el ejemplo que hemos hecho antes 101 00:08:04,699 --> 00:08:07,360 En el ejemplo de dispositivo, encender y apagar 102 00:08:07,360 --> 00:08:09,319 No son abstractos, están implementados 103 00:08:09,319 --> 00:08:10,060 Hacen algo 104 00:08:10,060 --> 00:08:13,060 Porque todos los dispositivos 105 00:08:13,060 --> 00:08:16,139 Hacen lo mismo independientemente que sea un móvil 106 00:08:16,139 --> 00:08:17,699 Que sea una lavadora 107 00:08:17,699 --> 00:08:19,300 Tú lo puedes encender y apagar 108 00:08:19,300 --> 00:08:21,920 Nuestro ejemplo muy sencillo 109 00:08:21,920 --> 00:08:22,120 ¿Vale? 110 00:08:22,459 --> 00:08:24,879 Lo que cambia es lo que hace de verdad 111 00:08:24,879 --> 00:08:26,680 El haz algo 112 00:08:26,680 --> 00:08:30,259 El darme tu estado 113 00:08:30,259 --> 00:08:30,620 ¿Vale? 114 00:08:30,620 --> 00:08:32,559 Entonces tú en una clase astrata 115 00:08:32,559 --> 00:08:35,500 Puedes implementar la parte genérica 116 00:08:35,500 --> 00:08:38,059 Que tú sabes que es igual en todos tus 117 00:08:38,059 --> 00:08:43,519 En todos los dispositivos que heredarán de ti 118 00:08:43,519 --> 00:08:47,320 Puedes implementar algunos métodos 119 00:08:47,320 --> 00:08:48,460 Que luego sabes 120 00:08:48,460 --> 00:08:51,440 Que algunos dispositivos que heredan de ti 121 00:08:51,440 --> 00:08:52,679 Sobrescribirán 122 00:08:52,679 --> 00:08:53,320 ¿Por qué no? 123 00:08:53,799 --> 00:08:56,340 Y luego habrá algunos métodos que dices 124 00:08:56,340 --> 00:08:57,240 Mira, este de aquí 125 00:08:57,240 --> 00:08:59,360 A este nivel de generalización 126 00:08:59,360 --> 00:09:00,460 A nivel de dispositivo 127 00:09:00,460 --> 00:09:01,720 No sabría qué poner 128 00:09:01,720 --> 00:09:04,740 Porque es demasiado concreta la idea 129 00:09:04,740 --> 00:09:06,639 Para poder ponerla a este nivel 130 00:09:06,639 --> 00:09:08,820 Seguro que si lo pongo aquí en implementación 131 00:09:08,820 --> 00:09:11,480 Vale para algunos dispositivos y para algunos otros no 132 00:09:11,480 --> 00:09:13,100 Entonces lo que hago es 133 00:09:13,100 --> 00:09:14,139 Poner un 134 00:09:14,139 --> 00:09:16,879 Método abstracto, ¿vale? 135 00:09:16,960 --> 00:09:19,340 Decir, todos tienen que tener este método 136 00:09:19,340 --> 00:09:21,039 Todos tienen que tener el método de estado 137 00:09:21,039 --> 00:09:23,379 Pero cada uno lo implementará 138 00:09:23,379 --> 00:09:24,659 Según sus necesidades 139 00:09:24,659 --> 00:09:26,720 ¿Sí? 140 00:09:28,399 --> 00:09:29,700 Entonces otro ejemplo 141 00:09:29,700 --> 00:09:31,539 Podría ser que un vehículo 142 00:09:31,539 --> 00:09:33,899 En general tiene la capacidad de moverse 143 00:09:33,899 --> 00:09:35,139 ¿Vale? O sea que 144 00:09:35,139 --> 00:09:42,279 Tiene que tener un método muévete, un método transporte, un método deslízate, qué sé yo. 145 00:09:42,960 --> 00:09:48,419 Pero, como luego se hace este método, depende mucho de qué tipo de vehículo es. 146 00:09:48,759 --> 00:09:53,639 Si es un barco, un avión, un tren, un coche, una bicicleta o lo que sea. 147 00:09:54,360 --> 00:10:02,379 Por lo tanto, vehículo podría ser una clase abstracta con algunos métodos y algunas características 148 00:10:02,379 --> 00:10:10,779 que son propias de todos los vehículos, entonces los implementa allí, y algunos métodos que son abstractos, que sé que todos los vehículos 149 00:10:10,779 --> 00:10:21,919 lo tienen que hacer, pero cómo lo hacen depende del vehículo concreto, o sea, de la subclase que estenda el vehículo, ¿sí? 150 00:10:22,539 --> 00:10:30,840 Entonces, una clase abstracta puede declarar, además que métodos normales, como los que hemos conocido nosotros, métodos abstractos, 151 00:10:30,840 --> 00:10:36,279 Métodos que no tienen las paréntesis, las llaves 152 00:10:36,279 --> 00:10:37,919 ¿Vale? No tienen cuerpo 153 00:10:37,919 --> 00:10:40,460 Te estoy diciendo que este método existe 154 00:10:40,460 --> 00:10:42,879 Pero no te estoy diciendo cómo se implementa 155 00:10:42,879 --> 00:10:44,879 Lo tendrás que implementar tú cuando me extendes 156 00:10:44,879 --> 00:10:45,879 ¿Vale? 157 00:10:49,460 --> 00:10:54,500 Un método abstracto es aquel que no tiene más que la definición del mismo 158 00:10:54,500 --> 00:10:56,299 Sin su implementación 159 00:10:56,299 --> 00:10:59,179 Como por ejemplo, esta cosa aquí que veis 160 00:10:59,179 --> 00:10:59,980 ¿Vale? 161 00:10:59,980 --> 00:11:02,100 public abstract int 162 00:11:02,100 --> 00:11:04,580 método abstracto, tipo 1 para 1 163 00:11:04,580 --> 00:11:06,120 tipo 2 para 2, etc 164 00:11:06,120 --> 00:11:08,299 punto y coma, define 165 00:11:08,299 --> 00:11:10,120 un método abstracto, vale 166 00:11:10,120 --> 00:11:12,200 es esta aquí la clave 167 00:11:12,200 --> 00:11:13,879 que nos da, vale, este abstract 168 00:11:13,879 --> 00:11:16,059 cuando yo pongo abstract 169 00:11:16,059 --> 00:11:18,279 el modificador abstract en un método 170 00:11:18,279 --> 00:11:19,379 estoy diciendo que este método 171 00:11:19,379 --> 00:11:21,899 no me espero que esté implementado 172 00:11:21,899 --> 00:11:24,299 por lo tanto al final no me espero 173 00:11:24,299 --> 00:11:26,259 una llave, el cuerpo del 174 00:11:26,259 --> 00:11:28,159 método y luego otra llave 175 00:11:28,159 --> 00:11:31,399 Que lo cierra diciendo, este bloque aquí es el cuerpo de este método. 176 00:11:31,899 --> 00:11:34,620 Porque no lo voy a implementar, es un método abstracto. 177 00:11:36,019 --> 00:11:36,620 ¿Sí? 178 00:11:37,659 --> 00:11:38,259 Vale. 179 00:11:38,940 --> 00:11:44,559 Un método abstracto debe ser obligatoriamente redefinido en sus subclases no abstractas. 180 00:11:45,019 --> 00:11:45,220 ¿Vale? 181 00:11:45,379 --> 00:11:50,620 Si yo heredo desde la clase vehículo que tiene un método abstracto, 182 00:11:51,019 --> 00:11:54,299 heredo esta clase, creo coche que hereda de vehículo, 183 00:11:54,740 --> 00:11:57,379 pues coche tiene dos opciones. 184 00:11:57,379 --> 00:12:05,600 O es abstracto él también, es una clase abstracta él también, entonces puede dedicar algunos métodos abstractos. 185 00:12:05,899 --> 00:12:11,299 O si esa clase, si la subclase no es abstracta, es una subclase como toda la que hemos dicho nosotros, 186 00:12:11,720 --> 00:12:15,379 tiene que implementar todos los métodos abstractos. 187 00:12:17,500 --> 00:12:23,019 De esta forma yo me aseguro que cualquier subclase de una clase abstracta tiene esos métodos. 188 00:12:23,019 --> 00:12:24,980 A lo mejor no hace nada con esos métodos 189 00:12:24,980 --> 00:12:26,240 A lo mejor devuelve null 190 00:12:26,240 --> 00:12:29,639 A lo mejor es abierta la llave 191 00:12:29,639 --> 00:12:30,419 Cerra la llave 192 00:12:30,419 --> 00:12:31,860 Que sería muy mala programación 193 00:12:31,860 --> 00:12:35,159 Pero algo tiene que hacer 194 00:12:35,159 --> 00:12:36,799 Puede ser nada 195 00:12:36,799 --> 00:12:38,679 Puede ser imprimir algo en pantalla 196 00:12:38,679 --> 00:12:41,460 Puede ser hacer una base de datos 197 00:12:41,460 --> 00:12:42,980 No lo sé, pero algo tiene que hacer 198 00:12:42,980 --> 00:12:45,759 Tengo que implementar 199 00:12:45,759 --> 00:12:46,960 Esa cosa 200 00:12:46,960 --> 00:12:50,179 Ese método abstracto 201 00:12:50,179 --> 00:12:50,419 ¿Sí? 202 00:12:53,019 --> 00:13:01,720 Se permite declarar en la superclase un comportamiento que deberán cumplimentar todas las subclases. 203 00:13:02,179 --> 00:13:09,019 Es decir, si os acordáis, en la orientación a objetos, los métodos definen comportamientos. 204 00:13:09,419 --> 00:13:11,580 Definen qué puede hacer este objeto. 205 00:13:11,580 --> 00:13:22,860 Una clase abstracta me está definiendo que cualquier subclase mía podrá hacer una determinada cosa sin definir cómo se hace esa determinada cosa. 206 00:13:23,019 --> 00:13:28,139 Yo te digo que cada vehículo podrá moverse, pero no te digo cómo. 207 00:13:28,659 --> 00:13:30,460 Cómo dependerá de la subclase que eres. 208 00:13:30,639 --> 00:13:35,000 La subclase coche implementará moverse de una forma distinta a la clase barco. 209 00:13:35,580 --> 00:13:38,080 Pero las dos tendrán el método moverse. 210 00:13:39,120 --> 00:13:45,759 Figura geométrica tendrá calcular área, pero cómo se calcula esta área depende de la subclase. 211 00:13:45,759 --> 00:13:51,879 La subclase triángulo tendrá una implementación de calcular área distinta de la clase cuadrada. 212 00:13:51,879 --> 00:13:54,659 Que tendrá, porque heredan los dos 213 00:13:54,659 --> 00:13:56,580 De figuras geométricas, tendrá que calcular área 214 00:13:56,580 --> 00:13:58,740 Pero se calculará de forma distinta 215 00:13:58,740 --> 00:14:00,600 ¿Dudas? 216 00:14:07,440 --> 00:14:10,259 Nosotros no hemos hablado mucho de UML 217 00:14:10,259 --> 00:14:11,639 ¿Lo habéis visto en algún lado? 218 00:14:11,960 --> 00:14:13,179 UML, todavía no 219 00:14:13,179 --> 00:14:17,100 Universal Modeling Language 220 00:14:17,100 --> 00:14:18,419 Es un lenguaje 221 00:14:18,419 --> 00:14:20,100 Universal 222 00:14:20,100 --> 00:14:22,000 Para poder hablar 223 00:14:22,000 --> 00:14:23,320 De programación 224 00:14:23,320 --> 00:14:26,100 Cuando se tiene que dar las especificas 225 00:14:26,100 --> 00:14:27,019 De un sistema 226 00:14:27,019 --> 00:14:31,320 ¿Vale? Sobre todo esto en el mundo de la ingeniería del software 227 00:14:31,320 --> 00:14:37,200 ¿Vale? Se necesita ser formalmente completos 228 00:14:37,200 --> 00:14:40,279 Para que vosotros entendáis cuál es el ejercicio 229 00:14:40,279 --> 00:14:42,440 Es un poco como si yo os dijera en un examen 230 00:14:42,440 --> 00:14:44,080 Hazme una clase que hace cosas 231 00:14:44,080 --> 00:14:47,940 Y tú te pones y haces tu clase que hace cosas al azar 232 00:14:47,940 --> 00:14:49,659 Y te digo, no, no era lo que habías pensado 233 00:14:49,659 --> 00:14:51,320 ¿Vale? Cero 234 00:14:51,320 --> 00:14:53,240 Pues no puede ser, ¿vale? 235 00:14:53,240 --> 00:14:57,120 Entonces, a nivel nuestro de ejercicios sencillos 236 00:14:57,120 --> 00:14:58,899 Ponemos una descripción sencilla 237 00:14:58,899 --> 00:15:03,559 Cuando se llega a tener que hacer sistemas muy, muy complejos 238 00:15:03,559 --> 00:15:06,120 Pensad a un sistema como un sistema operativo 239 00:15:06,120 --> 00:15:06,659 ¿Vale? 240 00:15:06,980 --> 00:15:08,519 Que tiene un mogollón de módulos 241 00:15:08,519 --> 00:15:09,980 Un mogollón de clases 242 00:15:09,980 --> 00:15:13,460 Un mogollón de cosas que se puedan interlazar entre ellas 243 00:15:13,460 --> 00:15:15,399 Y que tienen que tener vínculos entre ellos 244 00:15:15,399 --> 00:15:22,279 Hablarlo en lenguaje natural, normal, castellano y cosas por el estilo 245 00:15:22,279 --> 00:15:23,379 después se va a ver un caos. 246 00:15:24,000 --> 00:15:28,539 Entonces, existe una forma de hacer lo que son los UML, 247 00:15:29,080 --> 00:15:32,620 que sustancialmente proporciona una serie de diagramas, 248 00:15:32,799 --> 00:15:36,840 una serie de modos formales, ¿vale? 249 00:15:36,840 --> 00:15:40,480 Métodos formales para definir cómo están hechas las clases, 250 00:15:40,659 --> 00:15:43,879 qué tienen que tener, cómo tienen que relacionarse. 251 00:15:44,480 --> 00:15:49,019 A veces, estos cuadraditos que os he hecho yo, que ponían tres celdas, 252 00:15:49,019 --> 00:15:50,740 Una celda ponía el nombre 253 00:15:50,740 --> 00:15:52,419 Una celda ponía los atributos 254 00:15:52,419 --> 00:15:54,179 Y una celda ponía los métodos 255 00:15:54,179 --> 00:15:55,379 Pues ese es un OML 256 00:15:55,379 --> 00:15:58,840 Es el diagrama de clases de OML 257 00:15:58,840 --> 00:15:59,799 ¿Vale? 258 00:16:00,840 --> 00:16:02,039 Tiene el diagrama 259 00:16:02,039 --> 00:16:05,080 De clases de OML 260 00:16:05,080 --> 00:16:06,159 Si alguna vez veréis 261 00:16:06,159 --> 00:16:09,419 Unos diagramas hechos como parecidos a estos que veis ahora mismo 262 00:16:09,419 --> 00:16:11,879 Si quiero hacer una clase abstracta 263 00:16:11,879 --> 00:16:13,120 La pongo en cursiva 264 00:16:13,120 --> 00:16:15,200 O pongo específicamente 265 00:16:15,200 --> 00:16:17,179 Un modificador que pone abstract 266 00:16:17,179 --> 00:16:18,299 ¿Sí? 267 00:16:19,019 --> 00:16:24,580 Esto es para que tengáis una idea de que es OML muy muy básica 268 00:16:24,580 --> 00:16:33,019 Luego hay asignaturas que lo que hacen es profundizar en los 12 o 13 diagramas que proporciona OML 269 00:16:33,019 --> 00:16:36,080 Que sustancialmente sirven para organizarnos 270 00:16:36,080 --> 00:16:37,779 Es documentación 271 00:16:37,779 --> 00:16:44,919 La idea es que cuando he documentado bien un plano OML o un documento OML 272 00:16:44,919 --> 00:16:52,440 Luego lo puedo dar a todos los grupos de trabajo implicados en el mismo sistema y todos saben que hace lo de todo. 273 00:16:52,779 --> 00:16:57,320 Y qué métodos hay en cada clase, cómo interaccionan las clases y cómo se relacionan. 274 00:16:57,799 --> 00:17:05,259 ¿Os acordáis la flechita que utilizábamos para conectar una subclase a una superclase? 275 00:17:05,319 --> 00:17:07,079 No sé si la habéis visto en los dibujos. 276 00:17:07,079 --> 00:17:14,980 Cuando yo os decía, esta es una relación, es un, y la clase, la otra clase, eran conectadas por una flechita. 277 00:17:15,400 --> 00:17:19,900 Porque la flechita es como ML indica la relación de herencia. 278 00:17:21,039 --> 00:17:25,579 Si yo conecto dos clases con una flechita, estoy diciendo que esta hereda de esta otra. 279 00:17:27,039 --> 00:17:30,680 Entonces, aquí, por ejemplo, en este diagrama de clases que vemos aquí, 280 00:17:31,079 --> 00:17:35,180 vemos que la clase subclase hereda de la clase superclase, 281 00:17:35,180 --> 00:17:37,799 Que es una clase abstracta porque está escrita en cursivo 282 00:17:37,799 --> 00:17:43,500 Y que la clase superclase tiene el método 1 y el método 2 283 00:17:43,500 --> 00:17:47,519 Y entonces la subclase tendrá también el método 1 y el método 2 284 00:17:47,519 --> 00:17:52,440 Y el método 2, si no me equivoco, está en cursiva 285 00:17:52,440 --> 00:17:55,640 Por lo tanto, el método 2 es el abstracto 286 00:17:55,640 --> 00:17:58,500 Y tendrá que ser reimplementado 287 00:17:58,500 --> 00:18:01,759 O mejor, implementado en la subclase 288 00:18:01,759 --> 00:18:04,920 Mientras el método 1 289 00:18:04,920 --> 00:18:06,759 Si no está en cursiva 290 00:18:06,759 --> 00:18:09,279 Pues entonces es un método no abstracto 291 00:18:09,279 --> 00:18:10,480 Es un método real 292 00:18:10,480 --> 00:18:12,579 Entonces la subclase puede 293 00:18:12,579 --> 00:18:13,920 O no hacer nada 294 00:18:13,920 --> 00:18:16,720 Y entonces lo hereda directamente desde la superclase 295 00:18:16,720 --> 00:18:17,819 Porque ya está implementado 296 00:18:17,819 --> 00:18:19,819 O reescribirlo 297 00:18:19,819 --> 00:18:22,680 Con la sobrescriptura que hemos visto el otro día 298 00:18:22,680 --> 00:18:26,299 Si es que quiere añadir algo 299 00:18:26,299 --> 00:18:27,599 Con respecto a lo que hace 300 00:18:27,599 --> 00:18:30,839 La superclase 301 00:18:30,839 --> 00:18:33,880 ¿Sí? Bueno, esto para que lo veáis 302 00:18:33,880 --> 00:18:36,400 De vez en cuando 303 00:18:36,400 --> 00:18:37,700 A lo mejor volverá a salir 304 00:18:37,700 --> 00:18:39,640 Esto de un L en algún diagrama 305 00:18:39,640 --> 00:18:40,660 Y cosas por el estilo, ¿vale? 306 00:18:41,660 --> 00:18:43,599 Es porque en algún momento teníamos que empezar 307 00:18:43,599 --> 00:18:45,359 A hablar de él, pues hoy 308 00:18:45,359 --> 00:18:46,039 Es ese 309 00:18:46,039 --> 00:18:51,619 ¿Vale? Entonces, cosas 310 00:18:51,619 --> 00:18:53,140 Sobre las clases abstractas 311 00:18:53,140 --> 00:18:55,420 Vamos a ver el ejemplo y luego vemos que se puede hacer 312 00:18:55,420 --> 00:18:56,740 Y que no se puede hacer, ¿vale? 313 00:18:56,799 --> 00:18:59,740 Aquí tenemos public abstract class figura 314 00:18:59,740 --> 00:19:00,500 ¿Vale? 315 00:19:00,500 --> 00:19:03,839 Con pables astrat void dibuja 316 00:19:03,839 --> 00:19:04,619 ¿Vale? 317 00:19:04,779 --> 00:19:07,119 Entonces, esta de aquí podría ser una clase astrata 318 00:19:07,119 --> 00:19:09,799 Es una clase que no tiene una implementación 319 00:19:09,799 --> 00:19:11,180 Y tiene el método dibuja 320 00:19:11,180 --> 00:19:15,339 Cualquier clase que extenda figura 321 00:19:15,339 --> 00:19:20,339 Tiene que implementar el método dibuja 322 00:19:20,339 --> 00:19:22,200 Pero claro, dibujar una figura 323 00:19:22,200 --> 00:19:24,759 Una figura dependerá de qué figura eres 324 00:19:24,759 --> 00:19:26,799 No es lo mismo dibujar un cuadrado 325 00:19:26,799 --> 00:19:27,759 Que dibujar un triángulo 326 00:19:27,759 --> 00:19:30,279 asumiendo que sepamos dibujar 327 00:19:30,279 --> 00:19:31,180 formas como 328 00:19:31,180 --> 00:19:33,119 si no aquí podría ser calcular 329 00:19:33,119 --> 00:19:37,019 entonces veremos que por ejemplo 330 00:19:37,019 --> 00:19:38,619 la public clase rectángulo 331 00:19:38,619 --> 00:19:39,400 está en la figura 332 00:19:39,400 --> 00:19:42,079 pues tendrá que implementar dibujo 333 00:19:42,079 --> 00:19:44,539 pregunta para vosotros 334 00:19:44,539 --> 00:19:46,759 ¿rectángulo es una clase abstracta? 335 00:19:48,200 --> 00:19:49,119 ¿por qué no? 336 00:19:50,400 --> 00:19:51,799 porque no pone abstract 337 00:19:51,799 --> 00:19:55,019 entonces si no es abstracta 338 00:19:55,019 --> 00:19:56,980 tiene que implementar 339 00:19:56,980 --> 00:19:58,980 Todos los métodos abstractos 340 00:19:58,980 --> 00:20:00,279 De la clase que estende 341 00:20:00,279 --> 00:20:03,480 No los puede dejar sin implementación 342 00:20:03,480 --> 00:20:05,519 Si no, da un error 343 00:20:05,519 --> 00:20:07,839 ¿Ok? 344 00:20:08,359 --> 00:20:10,980 Ahora, si yo pusiera public abstract 345 00:20:10,980 --> 00:20:13,240 Clase rectángulo extensa figura 346 00:20:13,240 --> 00:20:14,980 ¿Podría dejar 347 00:20:14,980 --> 00:20:16,640 Dibuja sin implementar? 348 00:20:17,299 --> 00:20:18,460 Sí, tranquilamente 349 00:20:18,460 --> 00:20:21,339 Porque estoy extendiendo, pero sigo siendo 350 00:20:21,339 --> 00:20:22,900 Abstracto 351 00:20:22,900 --> 00:20:25,200 Porque a lo mejor por debajo del rectángulo hay 352 00:20:25,200 --> 00:20:28,900 Rectángulo normal 353 00:20:28,900 --> 00:20:31,000 Y cuadrado, que es un rectángulo especial 354 00:20:31,000 --> 00:20:36,920 Y también 355 00:20:36,920 --> 00:20:39,180 Esta public class círculo está en la figura 356 00:20:39,180 --> 00:20:41,440 Que igualmente tendrá que implementar dibujas 357 00:20:41,440 --> 00:20:43,180 Cada uno tendrá su propia implementación 358 00:20:43,740 --> 00:20:45,059 Esto es como si fuera 359 00:20:45,059 --> 00:20:46,900 Un menú, ¿vale? 360 00:20:46,940 --> 00:20:49,240 La parte abstracta, donde te digo 361 00:20:49,240 --> 00:20:51,000 Mira, las figuras abstractas 362 00:20:51,000 --> 00:20:52,779 Lo que pueden hacer es esto, esto, esto, esto 363 00:20:52,779 --> 00:20:54,500 ¿Cómo lo hacen? 364 00:20:54,920 --> 00:20:56,920 Depende del hijo 365 00:20:56,920 --> 00:20:58,960 ¿Vale? Dependerá de 366 00:20:58,960 --> 00:21:00,700 Que figura es en concreto 367 00:21:00,700 --> 00:21:02,619 Pero toda la figura tiene que poder 368 00:21:02,619 --> 00:21:05,240 Calcular el perímetro, calcular el área 369 00:21:05,240 --> 00:21:07,420 Y calcular su volumen 370 00:21:07,420 --> 00:21:08,599 Si la extrapolo 371 00:21:08,599 --> 00:21:11,460 Aquí hago todos los 372 00:21:11,460 --> 00:21:13,359 Posibles comportamientos de una figura 373 00:21:13,359 --> 00:21:16,079 Sin implementarlo 374 00:21:16,079 --> 00:21:17,259 Porque no se implementarlo 375 00:21:17,259 --> 00:21:19,599 Una figura es demasiado genérica para implementarla 376 00:21:19,599 --> 00:21:21,039 Entonces 377 00:21:21,039 --> 00:21:23,039 Asumiendo que sepa hacer 378 00:21:23,039 --> 00:21:25,059 Más o menos una clase abstracta 379 00:21:25,059 --> 00:21:27,019 ¿Qué puede o no puede hacer 380 00:21:27,019 --> 00:21:28,299 Con las clases abstractas? 381 00:21:28,299 --> 00:21:30,319 Cosa fundamental e importante 382 00:21:30,319 --> 00:21:34,059 No se pueden instanciar clases abstractas 383 00:21:34,059 --> 00:21:37,740 No puede hacer figura x es igual a new figura 384 00:21:37,740 --> 00:21:39,380 ¿Por qué no? 385 00:21:40,319 --> 00:21:50,710 Porque tendría un objeto con un método cuyo cuerpo no existe 386 00:21:50,710 --> 00:21:55,650 Entonces cuando luego llamo x.dibuja, ¿qué debería hacer si su método no existe? 387 00:21:56,630 --> 00:21:59,150 Una figura abstracta no puede ser concreta 388 00:21:59,150 --> 00:22:01,190 No puedo crear un objeto 389 00:22:01,190 --> 00:22:03,509 Concreto a partir de una clase 390 00:22:03,509 --> 00:22:04,150 Abstract 391 00:22:04,150 --> 00:22:11,339 Se pueden instanciar clases herederas 392 00:22:11,339 --> 00:22:13,220 Siempre que no sean abstractas a su vez 393 00:22:13,220 --> 00:22:15,099 Es decir, nadie me prohíbe 394 00:22:15,099 --> 00:22:16,599 Hacer rectángulo X 395 00:22:16,599 --> 00:22:18,000 Es igual a un rectángulo 396 00:22:18,000 --> 00:22:20,079 Rectángulo es ten de figura 397 00:22:20,079 --> 00:22:22,740 Pero lo que habrá hecho es implementar 398 00:22:22,740 --> 00:22:24,680 Todos los métodos abstractos 399 00:22:24,680 --> 00:22:25,680 Entonces ahora 400 00:22:25,680 --> 00:22:28,660 Podré tranquilamente crearme un objeto 401 00:22:28,660 --> 00:22:30,140 Rectángulo o un objeto círculo 402 00:22:30,140 --> 00:22:39,619 Y la cosa divertida es que se pueden instanciar su clase usando la referencia a la clase padre 403 00:22:39,619 --> 00:22:46,599 Es decir, si puede hacer figuraX es igual a newRectangulo 404 00:22:46,599 --> 00:22:51,829 Que en un cierto sentido ya lo hemos hecho 405 00:22:51,829 --> 00:22:58,589 Cuando nosotros hacíamos un array de personas y poníamos dentro los empleados 406 00:22:58,589 --> 00:23:01,650 Empleados o gerentes, que todos eran personas 407 00:23:01,650 --> 00:23:03,509 Pues aquí lo estaba haciendo 408 00:23:03,509 --> 00:23:06,930 Porque la referencia de mi array 409 00:23:06,930 --> 00:23:08,930 Cada celda puede tener una persona 410 00:23:08,930 --> 00:23:11,970 Pero yo dentro de la persona ponía un empleado 411 00:23:11,970 --> 00:23:13,269 Un new empleado 412 00:23:13,269 --> 00:23:15,170 Estaba haciendo esto 413 00:23:15,170 --> 00:23:18,410 Figura f es igual a new rectángulo 414 00:23:18,410 --> 00:23:21,009 ¿Por qué puedo hacerlo? 415 00:23:21,769 --> 00:23:29,569 Porque la relación de extend de herencia 416 00:23:29,569 --> 00:23:32,690 Me dice que un rectángulo es una figura 417 00:23:32,690 --> 00:23:37,299 Oye, pero ahora tengo un problema 418 00:23:37,299 --> 00:23:40,559 Si yo lo considero como figura, esto es abstracto 419 00:23:40,559 --> 00:23:46,240 No, porque su instancia es un rectángulo 420 00:23:46,240 --> 00:23:47,779 Yo he hecho ni un rectángulo 421 00:23:47,779 --> 00:23:50,019 Entonces, ¿os acordáis de eso? 422 00:23:50,099 --> 00:23:52,059 De que cuando luego llamo el método dibuja 423 00:23:52,059 --> 00:23:55,559 Se aplica a la instancia 424 00:23:55,559 --> 00:23:58,859 Por lo tanto, se aplicará el dibuja de rectángulo 425 00:23:58,859 --> 00:24:00,700 Que sí tiene implementación 426 00:24:00,700 --> 00:24:04,299 No el dibuja de figura que no tiene implementación 427 00:24:04,299 --> 00:24:08,259 y esto es el polimorfismo 428 00:24:08,259 --> 00:24:09,039 que ahora le pasa 429 00:24:09,039 --> 00:24:11,779 dudas hasta aquí 430 00:24:11,779 --> 00:24:13,619 por ahora tiene que quedar claro que 431 00:24:13,619 --> 00:24:16,460 hay clases abstractas y clases no abstractas 432 00:24:16,460 --> 00:24:18,000 la clase no abstracta la conocéis 433 00:24:18,000 --> 00:24:18,920 la habéis hecho mil veces 434 00:24:18,920 --> 00:24:22,299 las clases abstractas pueden indicar 435 00:24:22,299 --> 00:24:23,859 métodos abstractos 436 00:24:23,859 --> 00:24:25,700 métodos que yo no te digo que hace 437 00:24:25,700 --> 00:24:27,740 pero te digo que si tiene que existir 438 00:24:27,740 --> 00:24:30,720 en el momento en que yo soy una clase abstracta 439 00:24:30,720 --> 00:24:33,400 no puedes crear instancias mías 440 00:24:33,400 --> 00:24:37,119 No puedes hacer new de esa clase abstracta 441 00:24:37,119 --> 00:24:37,500 ¿Vale? 442 00:24:37,779 --> 00:24:40,140 Si figura en una clase abstracta no puede hacer new figura 443 00:24:40,140 --> 00:24:41,680 Porque no se puede 444 00:24:41,680 --> 00:24:44,079 Porque hay partes que no son concretas 445 00:24:44,079 --> 00:24:45,099 Que no existe código 446 00:24:45,099 --> 00:24:46,180 ¿Vale? 447 00:24:47,759 --> 00:24:52,460 A partir de una clase abstracta puedes heredar en otras clases 448 00:24:52,460 --> 00:24:53,700 Puedes hacer subclases 449 00:24:53,700 --> 00:24:54,099 ¿Vale? 450 00:24:54,200 --> 00:24:58,160 Estas subclases pueden ser abstractas a su vez 451 00:24:58,160 --> 00:25:02,099 Entonces crear una cadena de clases abstractas 452 00:25:02,099 --> 00:25:08,259 Pero lo más normal es que las clases que heredan de una clase abstracta sean concretas, sean normales. 453 00:25:08,319 --> 00:25:14,519 Y entonces, la obligación que tienen es que todos los métodos abstractos los tienen que implementar. 454 00:25:14,759 --> 00:25:17,519 ¿Y los métodos no abstractos? 455 00:25:19,059 --> 00:25:22,089 No tiene por qué. 456 00:25:22,609 --> 00:25:28,369 Si no lo reimplementa, heredará el del padre, tal y cual. 457 00:25:28,829 --> 00:25:32,569 Y si lo reimplementa, lo estará sobrescribiendo el del padre. 458 00:25:32,569 --> 00:25:34,690 Como hemos sobrescrito alguna vez 459 00:25:34,690 --> 00:25:37,650 Algunos métodos en clases anteriores 460 00:25:37,650 --> 00:25:39,150 ¿Sí? 461 00:25:39,990 --> 00:25:44,029 Sí, te da un error 462 00:25:44,029 --> 00:25:46,049 Te da un error Java 463 00:25:46,049 --> 00:25:47,690 Diciéndote, oye mira, tú aquí 464 00:25:47,690 --> 00:25:49,569 Estás diciendo que está en desfigura 465 00:25:49,569 --> 00:25:51,089 Figura tiene este método de astrato 466 00:25:51,089 --> 00:25:52,289 Y tú no lo has implementado 467 00:25:52,289 --> 00:25:56,390 Un error que se puede detectar 468 00:25:56,390 --> 00:25:58,029 A tiempo de compilación 469 00:25:58,029 --> 00:25:59,490 O sea, antes de ejecutarlo 470 00:25:59,490 --> 00:26:02,190 El Java, el Eclipse 471 00:26:02,190 --> 00:26:04,349 Os pone la raíta roja debajo 472 00:26:04,349 --> 00:26:05,849 Diciendo que aquí falta algo 473 00:26:05,849 --> 00:26:08,089 Lo veréis ahora 474 00:26:08,089 --> 00:26:09,750 Hacemos un ejemplo 475 00:26:09,750 --> 00:26:10,970 Y ponemos 476 00:26:10,970 --> 00:26:13,710 No lo ponemos este de aquí 477 00:26:13,710 --> 00:26:15,089 Oye, mira, aquí falta 478 00:26:15,089 --> 00:26:17,650 Y 479 00:26:17,650 --> 00:26:20,329 Puedo hacer 480 00:26:20,329 --> 00:26:22,589 Instancias de las clases 481 00:26:22,589 --> 00:26:23,210 Hijos 482 00:26:23,210 --> 00:26:26,269 Y la cosa 483 00:26:26,269 --> 00:26:28,190 Un poquito más interesante es esta de aquí 484 00:26:28,190 --> 00:26:30,289 Puedo crear una instancia 485 00:26:30,289 --> 00:26:32,450 De la clase hijo 486 00:26:32,450 --> 00:26:34,250 Pero guardarla 487 00:26:34,250 --> 00:26:36,490 en una referencia de la clase 488 00:26:36,490 --> 00:26:38,650 piada, ¿vale? A este punto 489 00:26:38,650 --> 00:26:40,390 dos o tres veces 490 00:26:40,390 --> 00:26:42,430 ya lo hemos dicho de la diferencia entre 491 00:26:42,430 --> 00:26:43,829 referencia e instancia 492 00:26:43,829 --> 00:26:45,869 ¿sí? Si queréis 493 00:26:45,869 --> 00:26:48,250 lo repasamos un segundo 494 00:26:48,250 --> 00:26:52,029 para que nos entendamos, ¿vale? 495 00:26:52,190 --> 00:26:53,990 Pero la idea es que cuando yo hago una new 496 00:26:53,990 --> 00:26:56,089 de algo 497 00:26:56,089 --> 00:26:59,029 ¿qué bien escribo? 498 00:26:59,829 --> 00:27:03,680 Lo que estoy haciendo es crear por algún 499 00:27:03,680 --> 00:27:13,420 lado en la memoria un objeto algo que tendrá dentro sus propios parámetros y 500 00:27:13,420 --> 00:27:19,480 que podré hacer sobre él lo que sea vale si yo hago sólo algo creo este 501 00:27:19,480 --> 00:27:26,500 objeto que en automático se destruye porque no tengo lo que se llama un 502 00:27:26,500 --> 00:27:33,099 manejador un handler no tengo forma de acceder a este trozo de memoria con algo 503 00:27:33,099 --> 00:27:35,319 Y nada más, he creado el objeto 504 00:27:35,319 --> 00:27:37,039 Y ahora no tengo forma 505 00:27:37,039 --> 00:27:38,420 De acercarme a él 506 00:27:38,420 --> 00:27:40,160 De referenciarlo 507 00:27:40,160 --> 00:27:42,640 Necesito por algún lado 508 00:27:42,640 --> 00:27:43,640 Un 509 00:27:43,640 --> 00:27:46,660 Trozo de memoria 510 00:27:46,660 --> 00:27:48,599 Que me diga dónde ir 511 00:27:48,599 --> 00:27:50,660 Para encontrar el objeto 512 00:27:50,660 --> 00:27:52,859 Su referencia 513 00:27:52,859 --> 00:27:54,339 Esta es la referencia 514 00:27:54,339 --> 00:27:55,519 Aquí está la referencia 515 00:27:55,519 --> 00:27:58,579 ¿Cómo lo hacemos nosotros esto normalmente? 516 00:27:58,759 --> 00:28:00,839 Decimos que existe una referencia 517 00:28:00,839 --> 00:28:01,700 De tipo algo 518 00:28:01,700 --> 00:28:03,359 Que puede contener algo 519 00:28:03,359 --> 00:28:05,400 Que se llama X por ejemplo 520 00:28:05,400 --> 00:28:07,680 Que es igual a esta cosa de aquí 521 00:28:07,680 --> 00:28:10,559 Esta línea de código 522 00:28:10,559 --> 00:28:13,160 Me crea dos cosas en memoria 523 00:28:13,160 --> 00:28:14,359 Por un lado 524 00:28:14,359 --> 00:28:17,759 X que es una referencia a un objeto 525 00:28:17,759 --> 00:28:20,059 Y por otro lado 526 00:28:20,059 --> 00:28:23,140 Una instancia de la clase algo 527 00:28:23,140 --> 00:28:24,519 Que es el objeto mismo 528 00:28:24,519 --> 00:28:28,990 Entonces cuando yo hago 529 00:28:28,990 --> 00:28:33,539 Super algo 530 00:28:33,539 --> 00:28:40,279 Entendido como super algo, una clase padre de algo 531 00:28:40,279 --> 00:28:41,839 Algo extende super algo 532 00:28:41,839 --> 00:28:48,599 Este x de aquí en realidad como referencia es un super algo 533 00:28:48,599 --> 00:28:59,450 Pero como instancia sigue siendo una instancia de algo 534 00:28:59,450 --> 00:29:04,529 Es lo que se está diciendo aquí en este parrafito de antes 535 00:29:04,529 --> 00:29:08,529 Que yo puedo crear una instancia de una subclase 536 00:29:08,529 --> 00:29:12,750 Y referenciarla con una superclase 537 00:29:12,750 --> 00:29:16,809 Tener una variable de tipo superclase 538 00:29:16,809 --> 00:29:21,269 Que apunte a un objeto de tipo subclase 539 00:29:21,269 --> 00:29:25,230 Y esto lo puede hacer porque algo es un superalgo 540 00:29:25,230 --> 00:29:26,210 Porque lo excede 541 00:29:26,210 --> 00:29:28,329 Al revés no podría 542 00:29:28,329 --> 00:29:31,599 ¿Dudas? 543 00:29:32,680 --> 00:29:33,440 ¿Preguntas? 544 00:29:37,730 --> 00:29:38,589 Esta parte de aquí 545 00:29:38,589 --> 00:29:40,589 Se puede instanciar subclase 546 00:29:40,589 --> 00:29:43,150 Utilizando la referencia a la clase padre 547 00:29:43,150 --> 00:29:48,170 La clase padre es figura, la subclase es rectángulo 548 00:29:48,170 --> 00:29:51,150 Puedo crear una nueva instancia de rectángulo 549 00:29:51,150 --> 00:29:54,710 Referenciándola con una figura 550 00:29:54,710 --> 00:29:56,829 ¿Dudas? 551 00:29:59,730 --> 00:30:06,549 Entonces, aquí subentra el concepto de polimorfismo 552 00:30:07,130 --> 00:30:08,769 Para poder utilizar estas cosas 553 00:30:08,769 --> 00:30:12,289 Asumiendo que yo pueda tener referencias 554 00:30:12,289 --> 00:30:14,470 que me dicen, este objeto 555 00:30:14,470 --> 00:30:16,410 como referencia es 556 00:30:16,410 --> 00:30:18,269 una figura, pero en realidad 557 00:30:18,269 --> 00:30:20,470 dentro es un rectángulo 558 00:30:20,470 --> 00:30:22,089 y cosas por el estilo, a ver 559 00:30:22,089 --> 00:30:22,809 esto 560 00:30:22,809 --> 00:30:25,890 a qué me expone 561 00:30:25,890 --> 00:30:28,529 y qué implica y qué puedo hacer con ello. 562 00:30:28,849 --> 00:30:30,410 ¿Vale? En general 563 00:30:30,410 --> 00:30:32,210 cuando hablamos de polimorfismo 564 00:30:32,210 --> 00:30:34,269 ¿Vale? Desde el griego poli 565 00:30:34,269 --> 00:30:36,089 muchos morfos 566 00:30:36,089 --> 00:30:37,470 que es forma, creo. 567 00:30:37,990 --> 00:30:39,410 Muchas formas, creo. 568 00:30:40,950 --> 00:30:41,990 Dos métodos. 569 00:30:41,990 --> 00:30:43,349 son polimórficos 570 00:30:43,349 --> 00:30:45,569 si con el mismo nombre 571 00:30:45,569 --> 00:30:48,049 hacen funciones distintas 572 00:30:48,049 --> 00:30:49,710 aunque similares 573 00:30:49,710 --> 00:30:51,349 en objetos distintos 574 00:30:51,349 --> 00:30:53,990 yo tengo el método 575 00:30:53,990 --> 00:30:54,630 moverse 576 00:30:54,630 --> 00:30:56,730 que tiene el mismo nombre 577 00:30:56,730 --> 00:30:59,349 pero hace cosas distintas si yo lo uso 578 00:30:59,349 --> 00:31:01,589 sobre un tren que si yo lo uso 579 00:31:01,589 --> 00:31:02,289 sobre un coche 580 00:31:02,289 --> 00:31:04,730 tengo el cálculo área 581 00:31:04,730 --> 00:31:07,609 que es el mismo nombre, el mismo método 582 00:31:07,609 --> 00:31:09,569 pero hace cosas distintas 583 00:31:09,569 --> 00:31:11,430 si yo lo llamo sobre un triángulo 584 00:31:11,430 --> 00:31:13,950 O si yo lo llamo sobre un cuadrado 585 00:31:13,950 --> 00:31:15,069 ¿Sí? 586 00:31:15,910 --> 00:31:17,890 El objetivo es el mismo 587 00:31:17,890 --> 00:31:18,930 Es calcular el área 588 00:31:18,930 --> 00:31:22,369 ¿Vale? O sea que la operación abstracta 589 00:31:22,369 --> 00:31:23,910 Es la misma 590 00:31:23,910 --> 00:31:25,630 Pero la forma 591 00:31:25,630 --> 00:31:27,589 La implementación de esa 592 00:31:27,589 --> 00:31:29,150 De cómo se hace esa cosa 593 00:31:29,150 --> 00:31:31,309 Depende del aspecto sobre el que lo llamo 594 00:31:31,309 --> 00:31:32,049 ¿Sí? 595 00:31:33,029 --> 00:31:35,430 Un ejemplo, el método del ritmo es 596 00:31:35,430 --> 00:31:37,289 Calcular áreas de rectángulos de círculo 597 00:31:37,289 --> 00:31:39,690 ¿Vale? El método se llama igual 598 00:31:39,690 --> 00:31:42,609 Pero hace cosas distintas en rectángulo y círculo 599 00:31:42,609 --> 00:31:44,750 Para obtener la misma cosa 600 00:31:44,750 --> 00:31:46,029 Que es calcular el área 601 00:31:46,029 --> 00:31:50,490 Si hablamos a nivel de clase 602 00:31:50,490 --> 00:31:53,309 El polimorfismo es lo que nos permite 603 00:31:53,309 --> 00:31:55,210 Crear una clase con la referencia padre 604 00:31:55,210 --> 00:31:57,210 Que pero apunta a una clase hija 605 00:31:57,210 --> 00:31:58,289 Lo que decíamos antes 606 00:31:58,289 --> 00:32:00,630 De figura F es igual a new rectángulo 607 00:32:00,630 --> 00:32:02,150 Es esta cosa aquí 608 00:32:02,150 --> 00:32:05,049 Utilizando el polimorfismo 609 00:32:05,049 --> 00:32:07,250 Utilizando que figura 610 00:32:07,250 --> 00:32:10,049 si tiene el objeto 611 00:32:10,049 --> 00:32:11,329 el método 612 00:32:11,329 --> 00:32:13,970 abstracto 613 00:32:13,970 --> 00:32:15,829 entonces lo puede utilizar, moverse 614 00:32:15,829 --> 00:32:17,990 pero luego dentro estará implementado 615 00:32:17,990 --> 00:32:20,089 de otra forma, de forma de rectángulo 616 00:32:20,089 --> 00:32:21,109 de forma de círculo 617 00:32:21,109 --> 00:32:23,529 pues es donde digamos 618 00:32:23,529 --> 00:32:25,910 nos interesa tener el polimorfismo 619 00:32:25,910 --> 00:32:30,569 cuando se usa un método sobre un objeto 620 00:32:30,569 --> 00:32:33,910 se usará el de la clase del que el objeto es instancia 621 00:32:33,910 --> 00:32:35,369 esta es la clave 622 00:32:35,369 --> 00:32:36,430 fundamental del 623 00:32:36,430 --> 00:32:38,650 polimorfismo 624 00:32:38,650 --> 00:32:40,829 cuando yo llamo el método 625 00:32:40,829 --> 00:32:43,089 cálculo área sobre una 626 00:32:43,089 --> 00:32:45,470 variable, sobre una referencia 627 00:32:45,470 --> 00:32:47,630 no es la referencia 628 00:32:47,630 --> 00:32:49,130 que manda, sino 629 00:32:49,130 --> 00:32:51,589 la instancia a la que se referencia 630 00:32:51,589 --> 00:32:52,829 la que manda 631 00:32:52,829 --> 00:32:54,950 es decir que 632 00:32:54,950 --> 00:32:57,190 si yo tengo 633 00:32:57,190 --> 00:32:58,490 una cosa del estilo y 634 00:32:58,490 --> 00:33:01,130 llamo x.método 635 00:33:01,130 --> 00:33:03,230 se utilizará 636 00:33:03,230 --> 00:33:04,970 el método método 637 00:33:04,970 --> 00:33:07,230 De super algo o de algo 638 00:33:07,230 --> 00:33:09,630 De algo 639 00:33:09,630 --> 00:33:11,369 Porque no obstante 640 00:33:11,369 --> 00:33:12,789 X sea un super algo 641 00:33:12,789 --> 00:33:15,089 Entonces x.método1 642 00:33:15,089 --> 00:33:17,470 Debería llamar algo de super algo 643 00:33:17,470 --> 00:33:19,410 El método de super algo 644 00:33:19,410 --> 00:33:21,130 Pues en realidad 645 00:33:21,130 --> 00:33:23,609 La instancia es algo 646 00:33:23,609 --> 00:33:24,910 He hecho un new de algo 647 00:33:24,910 --> 00:33:27,670 Por lo tanto yo voy a buscar la implementación 648 00:33:27,670 --> 00:33:29,849 De este método en la clase algo 649 00:33:29,849 --> 00:33:31,269 No en la clase super algo 650 00:33:31,269 --> 00:33:32,369 En la clase i 651 00:33:32,369 --> 00:33:33,569 No en la clase a 652 00:33:33,569 --> 00:33:43,779 Acabo la práctica 653 00:33:43,779 --> 00:33:44,720 Ahora hay ejemplos 654 00:33:44,720 --> 00:33:46,400 Y luego después 655 00:33:46,400 --> 00:33:48,700 Acabo la teoría 656 00:33:48,700 --> 00:33:53,299 Creo que hay un ejemplo 657 00:33:53,299 --> 00:33:58,119 Luego lo hacemos 658 00:33:58,119 --> 00:34:01,180 Pero ya lo hemos hecho 659 00:34:01,180 --> 00:34:05,019 Cuando hemos hecho empleado y gerente 660 00:34:05,019 --> 00:34:06,920 Y llamábamos el mismo método 661 00:34:06,920 --> 00:34:07,859 Sobre empleado excedente 662 00:34:07,859 --> 00:34:12,500 Aquí hemos hecho otro enfoque 663 00:34:12,500 --> 00:34:13,260 No hemos hecho 664 00:34:13,260 --> 00:34:15,500 Os explico la teoría y luego os hago la práctica 665 00:34:15,500 --> 00:34:17,199 Sino os he hecho hacer alguna vez 666 00:34:17,199 --> 00:34:18,940 En la práctica, os he dado ejemplos ya 667 00:34:18,940 --> 00:34:21,300 En días anteriores y ahora os estoy explicando 668 00:34:21,300 --> 00:34:22,599 La teoría detrás de eso 669 00:34:22,599 --> 00:34:24,679 De esta forma sí, luego os voy a hacer unos ejemplos 670 00:34:24,679 --> 00:34:27,579 ¿Dónde estábamos? 671 00:34:27,699 --> 00:34:28,659 Aquí, sí 672 00:34:28,659 --> 00:34:29,840 ¿Cuántos euros al mes? 673 00:34:29,840 --> 00:34:32,039 Esto es lo que decía 674 00:34:32,039 --> 00:34:33,659 Entonces cuando yo llamo 675 00:34:33,659 --> 00:34:37,159 Un método sobre una diferencia 676 00:34:37,159 --> 00:34:38,059 Sobre una variable 677 00:34:38,059 --> 00:34:40,699 Voy a mirar en realidad 678 00:34:40,699 --> 00:34:42,659 La instancia interna de esta materia 679 00:34:42,659 --> 00:34:44,599 Si no fuera así 680 00:34:44,599 --> 00:34:47,239 En una situación 681 00:34:47,239 --> 00:34:48,420 Como esta 682 00:34:48,420 --> 00:34:50,480 Figura f igual a un rectángulo 683 00:34:50,480 --> 00:34:53,159 Si ahora llamara f.calcularia 684 00:34:53,159 --> 00:34:55,679 Si mandara figura 685 00:34:55,679 --> 00:34:57,559 Figura me iría 686 00:34:57,559 --> 00:34:59,360 Al método calcularia abstracto 687 00:35:00,300 --> 00:35:00,980 Entonces me diría 688 00:35:00,980 --> 00:35:02,619 No, no tienes una implementación 689 00:35:02,619 --> 00:35:03,320 No puedes hacer nada 690 00:35:03,320 --> 00:35:09,380 Sin embargo, como lo que se usa es el rectángulo 691 00:35:09,380 --> 00:35:11,739 Pues entonces él dice, vale, no importa 692 00:35:11,739 --> 00:35:17,079 Aún si tú estás usando una referencia figura que es superclase 693 00:35:17,079 --> 00:35:20,960 Yo sé que lo que estás utilizando es un objeto rectángulo 694 00:35:20,960 --> 00:35:23,780 Voy a llamar el método del rectángulo 695 00:35:23,780 --> 00:35:27,480 La implementación que sí existe dentro del rectángulo 696 00:35:27,480 --> 00:35:31,980 Y si yo tuviera figura f es igual a new figura 697 00:35:31,980 --> 00:35:34,539 y ahora hiciera f.calcularia 698 00:35:34,539 --> 00:35:35,079 ¿qué pasaría? 699 00:35:39,769 --> 00:35:40,309 me grita 700 00:35:40,309 --> 00:35:42,409 no puedo 701 00:35:42,409 --> 00:35:45,230 no puede existir figura f 702 00:35:45,230 --> 00:35:46,250 es igual a newfigure 703 00:35:46,250 --> 00:35:48,949 no puedo crear una instancia 704 00:35:48,949 --> 00:35:51,050 de una clase abstracta 705 00:35:51,050 --> 00:35:57,130 vale, entonces podemos usar 706 00:35:57,130 --> 00:35:58,889 una superclase 707 00:35:58,889 --> 00:36:00,969 como parámetro formal y luego 708 00:36:00,969 --> 00:36:02,869 usar el método apropiado 709 00:36:02,869 --> 00:36:04,789 basándose sobre el objeto pasado 710 00:36:04,789 --> 00:36:05,849 como parámetro actual 711 00:36:05,849 --> 00:36:11,480 Es decir, que esta cosa del polimortismo 712 00:36:11,480 --> 00:36:15,320 Y de que puedo mezclar padres e hijos 713 00:36:15,320 --> 00:36:16,340 En un cierto sentido 714 00:36:16,340 --> 00:36:20,400 Me permite también utilizarse a nivel de métodos 715 00:36:20,400 --> 00:36:22,659 Yo puedo declarar un método 716 00:36:22,659 --> 00:36:26,079 Que como parámetro pilla un figura 717 00:36:26,079 --> 00:36:28,980 Esto sería el parámetro formal 718 00:36:28,980 --> 00:36:31,099 Que cuando lo defino digo 719 00:36:31,099 --> 00:36:33,400 Public void 720 00:36:33,400 --> 00:36:35,800 Calcula área 721 00:36:35,800 --> 00:36:38,159 de entre paréntesis figura 722 00:36:38,159 --> 00:36:38,900 X 723 00:36:38,900 --> 00:36:42,119 y a la hora de utilizar este 724 00:36:42,119 --> 00:36:44,099 método, llamarlo 725 00:36:44,099 --> 00:36:45,159 con un rectángulo 726 00:36:45,159 --> 00:36:47,820 hacer cálcula 727 00:36:47,820 --> 00:36:50,019 área entre paréntesis 728 00:36:50,019 --> 00:36:51,420 de mi rectángulo 729 00:36:51,420 --> 00:36:52,639 no se que más 730 00:36:52,639 --> 00:36:55,559 haría lo mismo que aquí 731 00:36:55,559 --> 00:36:57,380 estoy asociando 732 00:36:57,380 --> 00:37:00,139 una figura como referencia 733 00:37:00,139 --> 00:37:02,280 a un objeto que en realidad es un rectángulo 734 00:37:02,280 --> 00:37:04,099 pero eso me abre 735 00:37:04,099 --> 00:37:06,000 un mundo, que yo pueda hacer 736 00:37:06,000 --> 00:37:08,099 operaciones, pueda hacer métodos 737 00:37:08,099 --> 00:37:10,039 sobre figuras en general 738 00:37:10,039 --> 00:37:12,119 y luego pasarle 739 00:37:12,119 --> 00:37:12,980 como parámetros 740 00:37:12,980 --> 00:37:16,300 rectángulos, cuadrados, círculos 741 00:37:16,300 --> 00:37:18,039 triángulos, lo que me da la gana 742 00:37:18,039 --> 00:37:20,099 porque yo lo que estoy haciendo es sobre 743 00:37:20,099 --> 00:37:22,360 rectángulos, yo estoy llamando 744 00:37:22,360 --> 00:37:23,760 allí dentro y utilizando 745 00:37:23,760 --> 00:37:26,079 cosas abstractas 746 00:37:26,079 --> 00:37:28,360 dibuja, calcula 747 00:37:28,360 --> 00:37:30,119 área, cosas por el estilo, como si fuera 748 00:37:30,119 --> 00:37:32,219 una figura, lo que me permite hacer 749 00:37:32,219 --> 00:37:34,159 un figura, pero luego cuando 750 00:37:34,159 --> 00:37:36,059 le paso el parámetro, no le paso 751 00:37:36,059 --> 00:37:37,800 un figura, le paso un rectángulo 752 00:37:37,800 --> 00:37:40,199 entonces estaré utilizando todos estos métodos 753 00:37:40,199 --> 00:37:42,360 que he utilizado, que existen abstractos 754 00:37:42,360 --> 00:37:44,000 en figuras y que ahora están 755 00:37:44,000 --> 00:37:45,699 implementados en rectángulos 756 00:37:45,699 --> 00:37:47,059 entonces me funciona 757 00:37:47,059 --> 00:37:50,420 entonces puedo hacer cosas abstractas con las figuras 758 00:37:50,420 --> 00:37:52,159 y luego cada 759 00:37:52,159 --> 00:37:54,039 figura se 760 00:37:54,039 --> 00:37:56,260 implementará y hará el trabajo 761 00:37:56,260 --> 00:37:57,679 como figura propia 762 00:37:57,679 --> 00:37:59,659 si es un rectángulo hará lo que hace un rectángulo 763 00:37:59,659 --> 00:38:01,760 si es un cuadrado hará lo que hace un cuadrado 764 00:38:01,760 --> 00:38:11,659 Cuando tenemos que crear un objeto de una clase de dada 765 00:38:11,659 --> 00:38:15,099 Podemos utilizar como clase diferenciada la clase del padre o la del hijo 766 00:38:15,099 --> 00:38:15,599 ¿Vale? 767 00:38:15,960 --> 00:38:18,079 Tenemos una clase padre y una hijo 768 00:38:18,079 --> 00:38:18,500 ¿Vale? 769 00:38:18,900 --> 00:38:22,780 Es decir, que todos estos tres métodos, estas tres cosas pueden pasar 770 00:38:22,780 --> 00:38:24,039 ¿Sí? 771 00:38:24,260 --> 00:38:26,380 Si yo tengo una clase padre 772 00:38:26,380 --> 00:38:27,739 Que es padre 773 00:38:27,739 --> 00:38:30,119 Y una clase hijo que estén de padre 774 00:38:30,119 --> 00:38:32,820 Estas tres cosas me valen 775 00:38:32,820 --> 00:38:33,440 ¿Vale? 776 00:38:33,440 --> 00:38:36,360 Padre object es igual a new hijo 777 00:38:36,360 --> 00:38:37,820 Me vale 778 00:38:37,820 --> 00:38:41,260 Padre object es igual a new padre 779 00:38:41,260 --> 00:38:42,179 Me vale 780 00:38:42,179 --> 00:38:43,380 Siempre y cuando 781 00:38:43,380 --> 00:38:46,059 No sea abstracto 782 00:38:46,059 --> 00:38:47,880 Padre no sea abstracto 783 00:38:47,880 --> 00:38:50,940 Solo si padre no es abstracto 784 00:38:50,940 --> 00:38:52,480 Si a padre es abstracto 785 00:38:52,480 --> 00:38:53,460 Esto no me funciona 786 00:38:53,460 --> 00:38:55,340 Y también puedo hacer 787 00:38:55,340 --> 00:38:56,699 Hijo objecto es igual a new hijo 788 00:38:56,699 --> 00:38:59,480 Lo que no puedo hacer es 789 00:38:59,480 --> 00:39:01,199 Hijo objecto es igual a new padre 790 00:39:01,199 --> 00:39:03,980 Porque hijo no es un padre 791 00:39:03,980 --> 00:39:05,840 Perdón, porque padre no es un hijo 792 00:39:05,840 --> 00:39:11,860 Estas son las tres cosas 793 00:39:11,860 --> 00:39:14,019 Que puede hacer 794 00:39:14,019 --> 00:39:15,639 A nivel de herencia 795 00:39:15,639 --> 00:39:17,480 ¿Sí? Y cuando digo padre 796 00:39:17,480 --> 00:39:19,639 Digo padre, abuelo, tatarabuelo 797 00:39:19,639 --> 00:39:20,139 Lo que sea 798 00:39:20,139 --> 00:39:23,579 ¿Sí? Eso no importa 799 00:39:23,579 --> 00:39:24,639 A nivel de herencia 800 00:39:24,639 --> 00:39:27,239 Si tengo A que hereda de B que hereda de C 801 00:39:27,239 --> 00:39:28,860 Pues C es un A 802 00:39:28,860 --> 00:39:31,179 C es un B que es un A 803 00:39:31,179 --> 00:39:33,360 ¿Sí? 804 00:39:34,619 --> 00:39:37,159 Entonces, estas son las cosas que puedo utilizar 805 00:39:37,159 --> 00:39:38,260 Acordaos de esto 806 00:39:38,260 --> 00:39:40,380 O sea, que quiere decir que 807 00:39:40,380 --> 00:39:43,659 Yo cuando tengo un hijo y utilizo poligonfismo 808 00:39:43,659 --> 00:39:45,079 Lo que hemos hecho hasta ahora 809 00:39:45,079 --> 00:39:47,539 Hasta antes de ver las clases abstractas 810 00:39:47,539 --> 00:39:48,880 Era esta cosa aquí 811 00:39:48,880 --> 00:39:50,980 ¿Vale? En el sentido que nosotros o los padres 812 00:39:50,980 --> 00:39:52,460 Era una clase normal y corriente 813 00:39:52,460 --> 00:39:54,139 Que podía instanciar 814 00:39:54,139 --> 00:39:56,539 Porque no tenía métodos abstractos 815 00:39:56,539 --> 00:39:59,280 Y luego en el hijo si quería sobreescribía 816 00:39:59,280 --> 00:40:01,440 Y eso es perfectamente legítimo 817 00:40:01,440 --> 00:40:02,460 Lo puede hacer 818 00:40:02,460 --> 00:40:04,920 Las clases abstractas 819 00:40:04,920 --> 00:40:06,500 Añaden un pasito más 820 00:40:06,500 --> 00:40:08,800 Que es, ok, mas si yo tengo un método 821 00:40:08,800 --> 00:40:10,300 Que en la clase padre 822 00:40:10,300 --> 00:40:11,940 Sé que tiene que estar 823 00:40:11,940 --> 00:40:13,559 Pero no puedo definir 824 00:40:13,559 --> 00:40:16,599 Prácticamente el método 825 00:40:16,599 --> 00:40:18,940 Crea 826 00:40:18,940 --> 00:40:20,360 Calcular área de la figura 827 00:40:20,360 --> 00:40:22,579 ¿Vale? ¿Cómo puedo decir 828 00:40:22,579 --> 00:40:24,400 Oye mira, todas las figuras pueden poder 829 00:40:24,400 --> 00:40:26,719 Calcular su área, pero sin decir 830 00:40:26,719 --> 00:40:27,300 Cómo se hace 831 00:40:27,300 --> 00:40:29,940 ¿Sí? 832 00:40:30,579 --> 00:40:33,019 And finally 833 00:40:33,019 --> 00:40:36,670 El morfismo 834 00:40:36,670 --> 00:40:37,630 Downcasting 835 00:40:37,630 --> 00:40:39,730 La última cosa 836 00:40:39,730 --> 00:40:41,650 Que ya he utilizado 837 00:40:41,650 --> 00:40:44,750 Es lo que se llama el downcasting 838 00:40:44,750 --> 00:40:46,869 El downcasting es cuando 839 00:40:46,869 --> 00:40:48,250 Yo tengo una referencia 840 00:40:48,250 --> 00:40:49,909 Y la quiero 841 00:40:49,909 --> 00:40:52,949 Tratar como si fuera un hijo 842 00:40:52,949 --> 00:40:54,769 Yo tengo figura 843 00:40:54,769 --> 00:40:56,590 Y quiero, oye, mira 844 00:40:56,590 --> 00:40:58,130 Pero esta figura X 845 00:40:58,130 --> 00:40:59,969 En realidad es un rectángulo 846 00:40:59,969 --> 00:41:03,050 Y como necesito un método que solo existe en rectángulo 847 00:41:03,050 --> 00:41:04,230 Y no existe en figura 848 00:41:04,230 --> 00:41:06,769 Quiere hacer un downcast 849 00:41:06,769 --> 00:41:08,389 De este objeto 850 00:41:08,389 --> 00:41:10,550 Desde padre a hijo 851 00:41:10,550 --> 00:41:11,730 Y como se hace 852 00:41:11,730 --> 00:41:14,469 Nosotros esto ya lo hemos hecho 853 00:41:14,469 --> 00:41:16,530 Hemos hecho algunas veces 854 00:41:16,530 --> 00:41:18,630 Que tenía una referencia a persona 855 00:41:18,630 --> 00:41:20,989 Y quería utilizar un método de empleado 856 00:41:20,989 --> 00:41:22,289 Entonces decía, oye mira 857 00:41:22,289 --> 00:41:25,090 Esta referencia de aquí, tráetamela como un empleado 858 00:41:25,090 --> 00:41:26,969 Y a este punto le puedes sacar 859 00:41:26,969 --> 00:41:28,150 Todos los métodos de empleado 860 00:41:28,150 --> 00:41:30,389 Entonces ya lo hemos hecho 861 00:41:30,389 --> 00:41:32,030 Como se llama, downcast 862 00:41:32,030 --> 00:41:35,210 Cuidado que si intentáis hacer un downcast 863 00:41:35,210 --> 00:41:37,110 Y los tipos no son correctos 864 00:41:37,110 --> 00:41:39,389 Puede hacer una class cast exception 865 00:41:39,389 --> 00:41:40,309 ¿Vale? 866 00:41:40,349 --> 00:41:42,250 Una excepción de tipo cast 867 00:41:42,250 --> 00:41:44,190 Class cast 868 00:41:44,190 --> 00:41:45,489 ¿Sí? 869 00:41:46,949 --> 00:41:47,869 Y aquí 870 00:41:47,869 --> 00:41:54,300 Esto era lo que hizo lo de empleado 871 00:41:54,300 --> 00:41:55,679 En una array que metías 872 00:41:55,679 --> 00:41:56,360 Hay historias 873 00:41:56,360 --> 00:41:59,059 Y para saber si tal metías lo de nistel 874 00:41:59,059 --> 00:42:01,119 Para saber que tal y a partir de ahí el cast 875 00:42:01,119 --> 00:42:02,920 Sí, interesante 876 00:42:02,920 --> 00:42:05,519 Cuando hacéis un downcast 877 00:42:05,519 --> 00:42:07,800 Deberíais 878 00:42:07,800 --> 00:42:09,380 Antes comprobar 879 00:42:09,380 --> 00:42:11,320 Que lo que queréis 880 00:42:11,320 --> 00:42:13,719 Downcastar es una instancia 881 00:42:13,719 --> 00:42:15,059 De lo que queréis 882 00:42:15,059 --> 00:42:15,880 Hacer 883 00:42:15,880 --> 00:42:18,800 ¿Sí? Entonces, ¿cómo sería esto? 884 00:42:19,179 --> 00:42:20,599 If var h 885 00:42:20,599 --> 00:42:22,900 Instance of hijo 886 00:42:22,900 --> 00:42:25,219 Entonces, trátame var h 887 00:42:25,219 --> 00:42:27,320 Como hijo y haz lo que quieras 888 00:42:27,320 --> 00:42:28,800 Si te da false 889 00:42:28,800 --> 00:42:31,079 Quiere decir que esta variable aquí 890 00:42:31,079 --> 00:42:32,860 No es una instancia de hijo 891 00:42:32,860 --> 00:42:34,320 Entonces no puedes hacer 892 00:42:34,320 --> 00:42:36,320 Un downcast 893 00:42:36,320 --> 00:42:37,679 Porque si lo haces saltaría 894 00:42:37,679 --> 00:42:42,599 Ahora probamos todas esas cosas 895 00:42:42,599 --> 00:42:45,139 Con ejemplitos