1 00:00:00,000 --> 00:00:05,960 Vale, entonces, si habláis, me autorizáis a grabar vuestra voz, ¿vale? 2 00:00:06,360 --> 00:00:12,380 Vamos a ver otra parte de este tema que estamos viendo, que son un poco... 3 00:00:12,380 --> 00:00:19,140 La unidad se llama Usos avanzados de programación orientada a objetos, de clases y de objetos, ¿vale? 4 00:00:19,199 --> 00:00:26,780 O sea, que en la primera parte, antes de diciembre, al fin y al cabo, hemos visto clases y objetos puros, 5 00:00:26,780 --> 00:00:32,119 que era la programación orientada a objetos, y qué quiere decir objeto, qué quiere decir definir una clase, 6 00:00:32,619 --> 00:00:41,960 a partir de eso estamos viendo las herramientas avanzadas, lo que se puede hacer con clases y objetos 7 00:00:41,960 --> 00:00:49,380 que no se podía hacer antes con programación estructurada, imperativa estructurada básica. 8 00:00:49,380 --> 00:01:08,640 Entonces, nosotros hemos visto el concepto de herencia, hemos visto que una clase puede especializar otra clase añadiendo algunas cosas, o si yo tengo muchas clases parecidas, puedo pillar la parte parecida y generalizarla en una clase de la que luego todas se herederán. 9 00:01:08,640 --> 00:01:24,340 Y luego hemos visto que puedo jugar con esas cosas, ¿vale? Utilizando sobre todo que en una referencia de una superclase puedo en realidad poner una instancia, un objeto que sea instancia de una subclase, ¿vale? 10 00:01:24,340 --> 00:01:35,900 Por ahora, los ejercicios que hemos hecho y la prueba que hemos hecho, principalmente nos hemos focalizado sobre el concepto de utilizar el instance of. 11 00:01:35,900 --> 00:02:00,760 O sea, yo tengo un objeto que no sé qué instancia es y con InstanceOff puedo intentar entender cuál es la instancia real que está detrás de esta referencia para que luego pueda transformar este objeto en la clase correcta, en el tipo correcto, para poder utilizar todos los métodos y todas las variables que pertenecen a ese mismo objeto. 12 00:02:00,760 --> 00:02:19,500 Como por ejemplo nosotros en el ejemplo de ayer teníamos figura geométrica y lo que hacíamos era, si la figura es tan soft de cuadrado, entonces podía transformar esta figura en un cuadrado, considerarlo un cuadrado y a ese punto que podía considerarlo un cuadrado podía calcular su área, podía calcular ver su lado. 13 00:02:19,900 --> 00:02:21,759 Cosa que no podía hacer cuando era una figura geométrica. 14 00:02:22,900 --> 00:02:26,080 De todas formas, ahora volveremos más con esto. 15 00:02:26,080 --> 00:02:34,000 entonces, justo ayer cuando hicimos este problema, vimos que nos surgía un problemilla 16 00:02:34,000 --> 00:02:42,680 este problemilla era relacionado con el hecho que la clase más genérica, la clase figura geométrica 17 00:02:43,680 --> 00:02:52,580 no me permitía calcular el área, porque como de cada figura el área se calcula de una forma distinta 18 00:02:52,580 --> 00:02:55,039 si yo no sé que figura es 19 00:02:55,039 --> 00:02:57,280 si es un cuadrado, si es un rombo, si es un trapecio 20 00:02:57,280 --> 00:02:59,259 si es un triángulo 21 00:02:59,259 --> 00:03:00,879 etc, etc, no puedo 22 00:03:00,879 --> 00:03:02,939 seleccionar la fórmula correcta para 23 00:03:02,939 --> 00:03:03,800 calcular su área 24 00:03:03,800 --> 00:03:07,039 pero sin embargo yo sé que todas las 25 00:03:07,039 --> 00:03:09,099 figuras, sea cual sea las figuras 26 00:03:09,099 --> 00:03:10,860 si tienen la posibilidad 27 00:03:10,860 --> 00:03:11,900 de calcular su área 28 00:03:11,900 --> 00:03:14,000 entonces 29 00:03:14,000 --> 00:03:17,060 el concepto de figura geométrica 30 00:03:17,060 --> 00:03:19,500 que tiene 31 00:03:19,500 --> 00:03:20,979 una característica, un método 32 00:03:20,979 --> 00:03:32,580 general, que yo sé que todas las figuras deberían tener, pero que no puedo implementar, porque no sé qué figura exactamente es, 33 00:03:32,580 --> 00:03:41,479 y la fórmula cambia, se especifica en cada una de las figuras distintas, pues es un candidato perfecto para hacer una clase abstracta. 34 00:03:41,479 --> 00:03:57,879 La clase abstracta es una clase que me define algunas cosas de un concepto que yo estoy modelizando, pero otras cosas yo no las puedo implementar. 35 00:03:58,159 --> 00:04:07,020 Puedo definir que sí deberían estar, pero no tengo los mecanismos, no tengo los medios para implementarla en este momento. 36 00:04:07,020 --> 00:04:30,100 Entonces, la dejo abierta, la dejo abstracta, diciendo tiene que estar, pero yo no te digo cómo es, hasta que tú, en un futuro, heredes de esta clase abstracta y implementes de forma concreta los métodos que yo había dejado con esto deberían estar, pero no sé cómo se hace. 37 00:04:30,100 --> 00:04:33,079 ¿Sí? Ejemplo más concreto 38 00:04:33,079 --> 00:04:35,300 Si yo tengo una figura geométrica 39 00:04:35,300 --> 00:04:38,439 Sé que toda la figura geométrica tendrá un número de lados 40 00:04:38,439 --> 00:04:40,319 ¿Vale? Eso lo puedo poner 41 00:04:40,319 --> 00:04:43,920 Ya el círculo es complejo, pero bueno, imaginaos así 42 00:04:43,920 --> 00:04:45,459 Polígonos, ¿vale? 43 00:04:45,800 --> 00:04:48,379 Imaginaos que yo tengo la clase polígonos 44 00:04:48,379 --> 00:04:51,779 Entonces sé que los polígonos tendrán que tener un cierto número de lados 45 00:04:51,779 --> 00:04:55,120 ¿Sí? Entonces yo podría implementar ya 46 00:04:55,120 --> 00:04:58,699 Que esta clase tiene un int número de lados 47 00:04:59,319 --> 00:05:00,220 Esto lo tiene que tener. 48 00:05:01,220 --> 00:05:06,000 Y puedo hasta crearme un constructor que lo que hace es pasarme el número de lados 49 00:05:06,000 --> 00:05:10,180 y yo pondré este número de lados dentro de mi variable número de lados. 50 00:05:10,500 --> 00:05:13,519 Ese es algo concreto que puedo hacer ya. 51 00:05:14,000 --> 00:05:17,240 Todas las figuras, todos los polígonos tendrán esta cosa. 52 00:05:17,899 --> 00:05:20,959 Ahora, yo sé también que un polígono siempre tendrá un perímetro. 53 00:05:20,959 --> 00:05:24,920 Y que un polígono siempre tendrá un área. 54 00:05:25,680 --> 00:05:32,720 El problema es que, dado un polígono cualquiera, yo no sé su perímetro. 55 00:05:33,560 --> 00:05:33,939 ¿Por qué? 56 00:05:34,319 --> 00:05:40,220 Porque además de saber el número de lados, tengo que saber el valor de estos lados. 57 00:05:41,000 --> 00:05:43,339 Una cosa es si yo hiciera polígonos regulares. 58 00:05:44,300 --> 00:05:47,920 Entonces, si yo soy pedígono regulares, o sea que todos los lados son iguales, 59 00:05:47,920 --> 00:05:54,500 pues podría pedirte el número de lados y el valor de uno de los lados y ya sé calcularme el perímetro. 60 00:05:54,920 --> 00:06:06,339 Pero en un polígono general, yo debería saber todos los valores de todos los lados, y no sé cuántos lados hay, entonces tengo un poco un problema. 61 00:06:07,399 --> 00:06:10,420 ¿Sí? A lo mejor podría hacer una rey, pero dejámoslo así. 62 00:06:11,079 --> 00:06:18,560 Entonces, la parte que yo sé que tienen que existir, pero que no puedo generalizar, ¿vale? 63 00:06:18,579 --> 00:06:23,680 Porque no hay una fórmula para calcular el área de cualquier polígono sin saber qué polígono es. 64 00:06:23,680 --> 00:06:27,540 pues entonces lo voy a declarar como abstracto 65 00:06:27,540 --> 00:06:29,759 voy a crear un método abstracto 66 00:06:29,759 --> 00:06:32,540 que me dice, oye mira, yo aquí tendré que poner 67 00:06:32,540 --> 00:06:35,620 el cálculo del área, el cálculo del perímetro 68 00:06:35,620 --> 00:06:39,420 pero como no te puedo dar una cosa suficientemente general 69 00:06:39,420 --> 00:06:42,639 para implementarla ya, para escribir el código ya 70 00:06:42,639 --> 00:06:45,399 te voy a decir que tiene que existir 71 00:06:45,399 --> 00:06:47,459 pero no existe 72 00:06:47,459 --> 00:06:51,500 pero no se implementa 73 00:06:51,500 --> 00:06:55,300 eso se llama un método abstracto 74 00:06:55,300 --> 00:07:12,100 El método abstracto es un método que tiene que existir, pero no lo puedo implementar ahora, lo dejo allí, y en un futuro, cuando tú crearás una clase que hereda de esta clase de aquí, pues allí estará forzado a implementar este método que he dejado abstracto. 75 00:07:13,019 --> 00:07:20,420 Si hay un método abstracto, la clase tiene que ser abstracta. 76 00:07:20,420 --> 00:07:45,660 Entonces, en una clase abstracta coexisten dos cosas. Coexisten, por un lado, métodos ya implementados, ya existentes, y variables que ya existen implementadas, que ya he podido hacer, y métodos que tienen que estar, yo estoy seguro que tiene que haber un calcular área, pero todavía no sé cómo hacerlo. 77 00:07:45,660 --> 00:07:54,199 Entonces, a veces hay clases que definen un concepto genérico con unas características y métodos 78 00:07:54,199 --> 00:07:56,819 Que no se pueden concretar directamente 79 00:07:56,819 --> 00:08:03,220 Por ejemplo, una figura geométrica tiene sentido que tenga un método para calcular su perímetro y su área 80 00:08:03,220 --> 00:08:07,139 Pero cómo se calculan estos depende de la figura geométrica concreta 81 00:08:07,139 --> 00:08:10,079 Entonces figura geométrica no me puede implementar estos datos 82 00:08:10,079 --> 00:08:14,079 Otro ejemplo, un vehículo tendrá la capacidad de moverse 83 00:08:14,079 --> 00:08:26,180 No tendría sentido un vehículo que no se mueve, ¿vale? Pero, como lo hace, dependerá del vehículo concreto, o sea, que barco tendrá una forma de moverse, avión tendrá una forma de moverse, tren tendrá una forma de moverse distinta. 84 00:08:26,180 --> 00:08:44,179 Entonces yo puedo decir en vehículo que sea una clase abstracta con el método abstracto moverse y cuando luego crearé un barco que hereda de vehículo, entonces este barco implementará este método moverse diciendo estoy deslizando por encima del agua. 85 00:08:45,879 --> 00:08:51,299 Si en vez es el avión, implementará este método de otra forma diciendo estoy volando por el aire. 86 00:08:52,059 --> 00:08:52,440 ¿Se entiende? 87 00:08:53,940 --> 00:08:54,139 ¿Sí? 88 00:08:54,139 --> 00:09:02,320 Una clase abstracta puede declarar, además de métodos normales, esto es importante, también métodos abstractos. 89 00:09:02,320 --> 00:09:11,799 O dicho de otra forma, si en una clase yo necesito poner y pongo un método abstracto, la clase tiene que ser abstracta también. 90 00:09:13,159 --> 00:09:14,320 La tengo que marcar como abstracta. 91 00:09:16,120 --> 00:09:22,320 Un método abstracto es aquel que no tiene más que la definición del mismo, sin su implementación. 92 00:09:24,139 --> 00:09:29,580 Es decir, que le falta el cuerpo, le faltan las llaves. 93 00:09:30,419 --> 00:09:33,320 Así es como se declara un método abstracto. 94 00:09:33,759 --> 00:09:37,759 Public, abstract, palabra, ¿cómo se dice? 95 00:09:37,879 --> 00:09:42,159 Palabra reservada que estará en rojo para decir que este es un método abstracto. 96 00:09:42,240 --> 00:09:48,580 Inter, método abstracto, los parámetros que pedirá y directamente un punto y coma. 97 00:09:49,860 --> 00:09:53,220 El cuerpo, la implementación no está. 98 00:09:53,220 --> 00:10:05,019 ¿Por qué? Porque es un método abstracto. Te estoy diciendo, esta clase debería tener este método, pero no lo tiene porque a este nivel de abstracción yo no te puedo definir cómo se hace este método. 99 00:10:05,019 --> 00:10:10,580 un método abstracto debe ser obligatoriamente 100 00:10:10,580 --> 00:10:14,360 redefinido en sus clases no abstractas 101 00:10:14,360 --> 00:10:19,860 entonces si yo tengo vehículo, por debajo tengo coche 102 00:10:19,860 --> 00:10:23,879 y coche no es abstracto, pues entonces esto tiene 103 00:10:23,879 --> 00:10:27,720 que implementar sí o sí moverse, pero 104 00:10:27,720 --> 00:10:32,139 si yo tengo vehículo, luego tengo por debajo vehículo terrestre 105 00:10:32,139 --> 00:10:36,120 y por debajo tengo coche, vehículo terrestre 106 00:10:36,120 --> 00:10:38,100 si es abstracto también 107 00:10:38,100 --> 00:10:39,960 es una clase 108 00:10:39,960 --> 00:10:41,200 que hereda de vehículo 109 00:10:41,200 --> 00:10:43,120 pero es una clase abstracta 110 00:10:43,120 --> 00:10:45,220 que hereda de vehículo 111 00:10:45,220 --> 00:10:47,419 podría mantener su método 112 00:10:47,419 --> 00:10:48,700 como abstracto 113 00:10:48,700 --> 00:10:51,720 la clave es que mientras que un método 114 00:10:51,720 --> 00:10:53,019 sea abstracto 115 00:10:53,019 --> 00:10:54,940 mientras que haya al menos un método abstracto 116 00:10:54,940 --> 00:10:58,200 la clase sigue siendo abstracta 117 00:10:58,200 --> 00:10:58,539 ¿lo das? 118 00:10:59,960 --> 00:11:00,539 bueno, si 119 00:11:00,539 --> 00:11:12,360 en la clase figura geométrica si 120 00:11:12,360 --> 00:11:19,309 de hecho lo pone aquí 121 00:11:19,309 --> 00:11:21,789 lo pone aquí, una clase abstracta 122 00:11:21,789 --> 00:11:23,830 puede declarar además de métodos 123 00:11:23,830 --> 00:11:25,830 normales, también métodos 124 00:11:25,830 --> 00:11:31,190 abstractos, una clase 125 00:11:31,190 --> 00:11:32,529 que no es abstracta no puede 126 00:11:32,529 --> 00:11:34,789 poner un método abstracto, ¿por qué? 127 00:11:34,870 --> 00:11:36,970 porque si hay al menos un método abstracto 128 00:11:36,970 --> 00:11:38,909 la clase tiene que ser abstracta, eso lo hemos dicho 129 00:11:38,909 --> 00:11:42,809 si tú tienes un método que no 130 00:11:42,809 --> 00:11:44,669 puedes implementar y dices lo implementará 131 00:11:44,669 --> 00:11:46,669 alguien más, esta clase 132 00:11:46,669 --> 00:11:47,950 no puede ser una clase normal 133 00:11:47,950 --> 00:11:50,649 tiene que ser una clase abstracta, porque 134 00:11:50,649 --> 00:11:52,710 es un método que tú sabes que 135 00:11:52,710 --> 00:11:58,029 tiene que tener calcular área pero no sabes cómo calcularla por lo tanto es como si lo dejaras 136 00:11:58,029 --> 00:12:08,009 allí diciendo hoy mira existe sí pero tú puedes hacer una cadena de clases abstractas o sea 137 00:12:08,009 --> 00:12:14,789 vehículo que era vehículo terrestre que hereda de vehículo y las dos sean abstractas y luego 138 00:12:14,789 --> 00:12:21,289 este coche que hereda de vehículo terrestre que en vez es una clase concreta clase normal de la 139 00:12:21,289 --> 00:12:29,529 que hemos visto hasta ahora. La clave importantísima de las clases abstractas es que justo combinan 140 00:12:29,529 --> 00:12:36,350 estas dos cosas. Las clases abstractas tienen métodos que sí se han podido implementar 141 00:12:36,350 --> 00:12:44,230 y métodos que no se han podido implementar. Porque si en mi clase todos los métodos son 142 00:12:44,230 --> 00:12:49,769 abstractos, entonces es una interfaz. Pero lo veremos más adelante porque todavía no 143 00:12:49,769 --> 00:12:51,490 sabemos que es una interfaz, lo veremos 144 00:12:51,490 --> 00:12:53,250 aquí 145 00:12:53,250 --> 00:12:54,809 pero no hemos llegado 146 00:12:54,809 --> 00:12:56,960 ¿sí? 147 00:12:59,259 --> 00:12:59,899 entonces 148 00:12:59,899 --> 00:13:03,440 un método abstracto debe ser obligatoriamente 149 00:13:03,440 --> 00:13:04,879 redefinido en sus subclases 150 00:13:04,879 --> 00:13:07,279 no abstractas, importante ese no 151 00:13:07,279 --> 00:13:07,919 ¿vale? 152 00:13:08,679 --> 00:13:11,100 si la subclase sigue siendo 153 00:13:11,100 --> 00:13:12,740 abstracta, no es obligatorio 154 00:13:12,740 --> 00:13:14,419 redefinirlo, sigue allí 155 00:13:14,419 --> 00:13:17,100 no lo ha implementado, luego haremos ejemplos 156 00:13:17,100 --> 00:13:19,179 pero si yo el mover se lo tengo 157 00:13:19,179 --> 00:13:21,179 en vehículo, luego tengo vehículo terrestre 158 00:13:21,179 --> 00:13:22,840 y luego tengo coche 159 00:13:22,840 --> 00:13:25,419 vehículo terrestre no ha implementado 160 00:13:25,419 --> 00:13:27,080 el método moverse, pero 161 00:13:27,080 --> 00:13:28,980 coche tendrá que hacerlo porque es el primero 162 00:13:28,980 --> 00:13:31,179 en esta cadena que no es abstracto 163 00:13:31,799 --> 00:13:35,360 permiten declarar en la superclase 164 00:13:35,360 --> 00:13:37,039 un comportamiento que deberán 165 00:13:37,039 --> 00:13:39,299 cumplimentar todas las subclases 166 00:13:39,299 --> 00:13:41,080 ¿vale? pero sin decir 167 00:13:41,080 --> 00:13:43,120 nada sobre su implementación 168 00:13:43,120 --> 00:13:45,159 te está diciendo, oye 169 00:13:45,159 --> 00:13:47,179 mira, todos los hijos míos 170 00:13:47,179 --> 00:13:48,759 todos los hijos de figura 171 00:13:48,759 --> 00:13:50,580 Todos los hijos de vehículo 172 00:13:50,580 --> 00:13:52,259 Tendrán que poder moverse 173 00:13:52,259 --> 00:13:53,940 Tendrán que poder calcular su área 174 00:13:53,940 --> 00:13:56,120 Pero no te estoy diciendo cómo se hace 175 00:13:56,120 --> 00:13:57,779 Porque cómo se hace dependerá 176 00:13:57,779 --> 00:14:00,059 De la implementación de la clase hija 177 00:14:00,059 --> 00:14:01,559 ¿Sí? 178 00:14:07,279 --> 00:14:09,360 Entonces, las clases de geometría de astratos 179 00:14:09,360 --> 00:14:10,740 Se escriben en cursiva, ¿vale? 180 00:14:10,759 --> 00:14:14,700 Cuando vosotros veis un dibujo así 181 00:14:14,700 --> 00:14:16,000 Sobre todo en UML 182 00:14:16,000 --> 00:14:17,740 ¿Habéis visto algo de UML? 183 00:14:20,740 --> 00:14:23,220 Muy poco, pues veréis más, ¿vale? 184 00:14:23,460 --> 00:14:28,740 En torno a los desarrollos, pues posiblemente empezaréis a ver algo de OML. 185 00:14:28,840 --> 00:14:34,759 En particular está una cosa que se llama el diagrama de clase, donde las clases se especifican con cuadritos así. 186 00:14:35,179 --> 00:14:38,960 Donde está el nombre, aquí están los atributos y aquí están los métodos. 187 00:14:39,840 --> 00:14:46,960 En este tipo de cosas, si hay algunos métodos que se escriben en cursiva, es porque son abstractos. 188 00:14:46,960 --> 00:14:59,279 ¿Sí? Repito que en una clase abstracta, por eso en cursiva, pues puede haber algunos métodos que no son abstractos y algunos métodos que no son abstractos. 189 00:14:59,379 --> 00:15:03,960 Una clase que no tiene métodos abstractos no debería ser abstracta. 190 00:15:05,179 --> 00:15:08,960 Una clase que tiene al menos un método abstracto, pues tiene que ser abstracta. 191 00:15:10,860 --> 00:15:11,100 ¿Sigo? 192 00:15:13,639 --> 00:15:17,639 Clases abstractas. Importante, en negrita, por eso es importante, ¿vale? 193 00:15:17,639 --> 00:15:22,059 No se pueden instanciar clases abstractas 194 00:15:22,059 --> 00:15:27,980 Si yo tengo vehículo que es abstracto 195 00:15:27,980 --> 00:15:31,299 ¿Puedo hacer vehículo X es igual a algo? 196 00:15:39,840 --> 00:15:41,000 Si yo tengo 197 00:15:41,000 --> 00:15:43,980 Esto se hace más grande 198 00:15:43,980 --> 00:15:51,440 Si yo tengo la clase abstracta vehículo 199 00:15:51,440 --> 00:15:56,559 ¿Puedo hacer por algún lado vehículo X es igual a algo? 200 00:15:56,559 --> 00:16:05,580 Sí. ¿Eh? Pero no me acabas de decir que no se puede hacer una instancia de una clase abstracta. 201 00:16:06,519 --> 00:16:09,940 Sí, te lo he dicho. Entonces, ¿qué me estás contando? 202 00:16:12,889 --> 00:16:21,299 Porque sí puedo hacer esto. Porque yo aquí no he creado ninguna instancia. 203 00:16:25,379 --> 00:16:32,320 Esto no crea una instancia. ¿Cómo se crean las instancias? 204 00:16:32,320 --> 00:16:37,460 con new, es la parte a la derecha 205 00:16:37,460 --> 00:16:40,519 que crea la instancia, no esta de aquí, esta es una referencia 206 00:16:40,519 --> 00:16:45,039 y yo no os he dicho no se puede crear referencias o variables de tipo 207 00:16:45,039 --> 00:16:49,480 clase abstracta, eso si se puede hacer, lo que no se puede 208 00:16:49,480 --> 00:16:53,440 hacer es crear una instancia, es decir 209 00:16:53,440 --> 00:16:57,100 que esto es un error 210 00:16:57,100 --> 00:17:01,440 pero no es un error esta parte, es un error esta 211 00:17:01,440 --> 00:17:18,559 parte se entiende y si yo luego tengo la clase no abstracta que existo el coche 212 00:17:18,559 --> 00:17:36,019 que hereda hereda hereda de vehículo si puedo hacer coche 213 00:17:36,019 --> 00:17:51,039 c es igual año coche pero también puede hacer vehículo y es igual año coche 214 00:17:51,039 --> 00:18:08,380 porque el coche es un vehículo porque hereda además estás creando una instancia 215 00:18:08,380 --> 00:18:15,079 nuestra abstracta no yo estoy creando una instancia de coche no una instancia 216 00:18:15,079 --> 00:18:36,079 vehículo y coche es una clase no abstracta y por lo tanto sí puedo crear un coche. A ver, cuando tú 217 00:18:36,079 --> 00:18:46,980 crearás coche estás forzada a sobreescribir los métodos abstractos que tenías definidos en la 218 00:18:46,980 --> 00:18:52,920 clase de arriba, por lo tanto cuando usarás en coche esos métodos que eran definidos arriba en 219 00:18:52,920 --> 00:18:57,200 en realidad estarás utilizándolos de la instancia, o sea, estarás utilizándolos de coche. 220 00:18:58,000 --> 00:19:01,759 Que es lo que quieres, porque en vehículo no están definidos, y en coche sí. 221 00:19:09,319 --> 00:19:10,599 Simplemente sobreescribiéndolo. 222 00:19:11,099 --> 00:19:12,519 ¿Sabes cómo hemos hecho el overreading? 223 00:19:12,900 --> 00:19:13,519 Misma cosa. 224 00:19:14,420 --> 00:19:16,920 De hecho, el IDE te ayudará. 225 00:19:17,319 --> 00:19:21,900 Si tú no has sobreescrito un método declarado abstracto en una clase que heredas, 226 00:19:21,900 --> 00:19:27,839 te dirá, oye, mira, esta clase no está bien porque tienes que sobreescribir este método para hacerla concreta. 227 00:19:28,140 --> 00:19:29,619 O dejarla abstracta. 228 00:19:29,740 --> 00:19:40,660 Elige tú. Pero si quieres que no sea abstracta, estás obligatoriamente forzado a redefinir esos métodos. 229 00:19:41,759 --> 00:19:51,849 Y entonces, en automático, lo que intentará hacer él, cuando haga una cosa así, hasta si yo estoy utilizando vehículo, 230 00:19:51,849 --> 00:20:01,710 el vehículo tendrá moverse, pero cuando uso y.moverse, él en automático me va a usar la implementación de coche. 231 00:20:02,009 --> 00:20:05,170 ¿Y esto por qué? Por polimorfismo. 232 00:20:06,750 --> 00:20:14,549 Nosotros todavía no lo sabemos que se llama así, pero es lo que hemos estado utilizando hasta ahora, cuando hemos hecho pruebas y cosas por el estilo. 233 00:20:14,910 --> 00:20:24,329 Siempre se usa el método relacionado con la instancia, no con la referencia. 234 00:20:24,329 --> 00:20:45,920 ¿Os acordáis cuando hemos visto el overriding? Pues allí he hecho hincapié en cuando se usa este de aquí, se está utilizando el hijo. Si os acordáis, esta transparencia aquí está. 235 00:20:45,920 --> 00:20:52,859 que yo tenía en el padre un imprimir y en el hijo un imprimir 236 00:20:52,859 --> 00:21:01,339 y aquí usaba con una instancia de alumno, una referencia alumno, una referencia persona 237 00:21:01,339 --> 00:21:09,400 y llamaba a.imprimir o p.imprimir, en los dos casos usaba el de la instancia, o sea, el de alumno. 238 00:21:09,400 --> 00:21:29,299 ¿Sí? Entonces, si esto fuera, si persona fuera abstracto, y yo imprimir aquí no lo defino, hasta cuando uso persona, ¿vale? En realidad haría p.imprimir, pero lo que hace Java es usarme este, no este. 239 00:21:29,299 --> 00:21:32,759 ¿Se entiende? 240 00:21:50,240 --> 00:21:52,420 ¿Por qué estoy utilizando? 241 00:22:02,089 --> 00:22:03,910 ¿Por qué? 242 00:22:05,309 --> 00:22:07,789 Esto es también un... ¿Cómo se llama? 243 00:22:07,930 --> 00:22:10,009 Un shadowing. 244 00:22:11,009 --> 00:22:17,289 Y yo en la impresión de este de aquí estoy utilizando dis.nombre de la clase alumno. 245 00:22:17,289 --> 00:22:24,690 Entonces cuando yo estoy haciendo este imprimir no estoy utilizando este que utilizaría dis.nombre de esta clase. 246 00:22:24,690 --> 00:22:26,529 Además estoy utilizando este que usaría 247 00:22:26,529 --> 00:22:27,910 Dis.nombre de esta clase 248 00:22:27,910 --> 00:22:30,430 Porque la instancia 249 00:22:30,430 --> 00:22:33,630 Es un alumno 250 00:22:33,630 --> 00:22:45,140 De todas formas luego haremos ejemplos para que esto quede más claro 251 00:22:45,140 --> 00:22:49,380 ¿Dónde hemos llegado? 252 00:22:49,500 --> 00:22:50,539 Hemos llegado aquí 253 00:22:50,539 --> 00:22:51,740 Entonces es importante 254 00:22:51,740 --> 00:22:54,539 No se pueden hacer instancias de clases abstractas 255 00:22:55,220 --> 00:22:56,240 No puede hacer new 256 00:22:56,240 --> 00:22:58,960 De una clase que sea declarada abstracta 257 00:22:58,960 --> 00:23:00,000 ¿Por qué no puede hacerlo? 258 00:23:00,200 --> 00:23:01,779 Porque a esta clase le falta algo 259 00:23:01,779 --> 00:23:09,099 Si creo una instancia de esa clase y tengo unos métodos que son abstractos, esos métodos no los podría usar porque no están definidos. 260 00:23:09,680 --> 00:23:10,799 Y por lo tanto no puedo. 261 00:23:11,160 --> 00:23:18,900 Pero sí puedo declarar una referencia de ese tipo, de clase abstracta. 262 00:23:19,400 --> 00:23:26,500 Si entonces tengo publicAstractClassFigura con el concepto de dibuja, yo puedo dibujar esta figura, 263 00:23:26,500 --> 00:23:31,299 pero no sé cómo se dibuja porque un triángulo se dibujará de una forma y el cuadrado se dibujará de otra. 264 00:23:31,779 --> 00:23:39,339 Por lo tanto, no sé qué hacer, pero luego crearé el public class rectángulo que está en de figura y no es abstracto, 265 00:23:39,339 --> 00:23:44,480 donde dentro aquí definiré el método que hace dibuja cuando dibuja un rectángulo 266 00:23:44,480 --> 00:23:48,099 y la clase círculo que hace dibuja cuando se dibuja un círculo. 267 00:23:49,180 --> 00:23:51,440 Entonces yo sé que todas figuras tendrán dibuja. 268 00:23:52,000 --> 00:23:57,859 Sobre una referencia de tipo figura puedo llamar dibuja, porque sé que tiene que existir, 269 00:23:57,859 --> 00:24:02,720 Pero dependiendo de la instancia que está dentro de esta referencia 270 00:24:02,720 --> 00:24:06,019 Si es una instancia de rectángulo, usaré este dibujo 271 00:24:06,019 --> 00:24:10,619 Si es una instancia de círculo, usaré este dibujo 272 00:24:10,619 --> 00:24:11,140 ¿Se entiende? 273 00:24:11,839 --> 00:24:16,720 Se pueden instanciar clases heredadas siempre que no sean abstractas a su vez 274 00:24:16,720 --> 00:24:20,720 Y se puede instanciar subclases utilizando la referencia a la clase padre 275 00:24:20,720 --> 00:24:23,420 Por ejemplo, figura F es igual a año rectángulo 276 00:24:23,420 --> 00:24:28,109 ¿Dudas? 277 00:24:32,869 --> 00:24:35,690 Entonces, ¿qué es esto del polimorfismo? 278 00:24:35,690 --> 00:24:47,569 ¿Vale? Se habla de polimorfismo cuando dos métodos tienen el mismo nombre, pero hacen funciones un poquito distintas, aunque similares, en objetos distintos. 279 00:24:48,069 --> 00:25:00,390 Es decir, que este dibuja y este dibuja son polimórficos, porque se llaman iguales, hacen cosas parecidas, los dos dibujan una figura, 280 00:25:00,390 --> 00:25:04,470 Pero esto hace cosas completamente distintas de esto 281 00:25:04,470 --> 00:25:06,849 Esto dibuja un cuadro, un rectángulo 282 00:25:06,849 --> 00:25:08,329 Y esto dibuja un círculo 283 00:25:08,329 --> 00:25:11,809 Entonces tengo polimorfismo 284 00:25:11,809 --> 00:25:15,029 Morfo es aspecto 285 00:25:15,029 --> 00:25:17,069 Poli es mucho 286 00:25:17,069 --> 00:25:18,670 Tiene muchos aspectos 287 00:25:18,670 --> 00:25:21,910 Es la misma cosa, pero puede asumir aspectos distintos 288 00:25:21,910 --> 00:25:24,529 Dependiendo del objeto sobre el que lo llamo 289 00:25:24,529 --> 00:25:25,730 Siempre dibuja 290 00:25:25,730 --> 00:25:28,210 Pero hará cosas un poquito distintas 291 00:25:28,210 --> 00:25:29,849 Si lo llamo rectángulo, en círculo 292 00:25:29,849 --> 00:25:36,589 Siempre se hará moverse, pero se moverá distinto si lo llevamos sobre un barco o sobre un coche 293 00:25:36,589 --> 00:25:39,670 ¿Se entiende? 294 00:25:42,150 --> 00:25:45,630 No tendría sentido que dibuja un rectángulo, dibuja un rectángulo 295 00:25:45,630 --> 00:25:49,230 Y dibuja en círculo, calcula el área del círculo 296 00:25:49,230 --> 00:25:51,230 Eso no tendría sentido 297 00:25:51,230 --> 00:25:57,869 Tienen que hacer cosas parecidas, tienen que hacer lo que el método te pide que haga 298 00:25:57,869 --> 00:26:06,769 Normalmente en una clase de abstracto a quien dibuja se pone en algún lado una especificación de qué se entiende con dibuja 299 00:26:06,769 --> 00:26:17,309 Dibujará gráficamente la figura, calculará el área de la figura, calculará el perímetro de la figura 300 00:26:17,309 --> 00:26:23,309 Y luego cuando lo hago en rectángulo y me hago calcular el perímetro, pues me voy a leer esta especificación 301 00:26:23,309 --> 00:26:32,150 me dice que este método tendrá que calcular el perímetro, entonces aquí será lado 1 por 2 más lado 2 por 2, 302 00:26:32,730 --> 00:26:41,529 mientras que aquí será otra cosa, 2 pi greco y radio, ¿se entiende? ¿Dudas? 303 00:26:43,809 --> 00:26:48,049 Entonces, un ejemplo de polimorfismo es el método calcular el rectángulo de círculo, 304 00:26:48,809 --> 00:26:56,269 mismo método, mismo nombre, mismos parámetros, pero hacen cosas un poquito distintas, ¿vale? 305 00:26:56,269 --> 00:27:00,769 Hacen funciones distintas, aunque similares en objetos distintos. 306 00:27:01,490 --> 00:27:03,230 Esos son polimórficos. 307 00:27:04,490 --> 00:27:04,829 ¿Dudas? 308 00:27:05,289 --> 00:27:13,400 Si hablamos de clases, el polimorfismo es lo que nos permite crear una clase con la referencia padre, 309 00:27:13,980 --> 00:27:16,339 pero que apunte a una clase hija, ¿vale? 310 00:27:16,339 --> 00:27:22,559 Como hemos visto anteriormente, o sea, esta cosa de aquí, estoy usando un poco de polimorfismo, 311 00:27:22,660 --> 00:27:26,940 porque esta figura puede ser un rectángulo, pero puede ser también un círculo. 312 00:27:26,940 --> 00:27:34,839 Los dos son figuras, son cosas parecidas, ¿vale? Pero hacen cosas distintas, ¿entiende? 313 00:27:35,980 --> 00:27:45,420 Cuando se usa un método sobre un objeto, se usará el de la clase de la que ese objeto es instancia, la clase que se ha usado a hacer el new, ¿vale? 314 00:27:45,759 --> 00:27:53,799 F.calcularA llamará el método calcularA de rectángulo, porque es una instancia de rectángulo. 315 00:27:53,799 --> 00:27:59,839 De esta forma, figura podría hasta ser abstracta 316 00:27:59,839 --> 00:28:03,660 Porque no voy a usar el calcularia de figura 317 00:28:03,660 --> 00:28:06,180 Voy a usar el calcularia de la instancia 318 00:28:06,180 --> 00:28:10,400 Y como he hecho una instancia, esto tiene que ser no abstracto 319 00:28:10,400 --> 00:28:14,059 Entonces tiene que tener el método calcularia implementado 320 00:28:14,059 --> 00:28:15,119 Entonces lo puedo usar 321 00:28:15,119 --> 00:28:17,400 ¿Se entiende esta cadena? 322 00:28:17,400 --> 00:28:24,220 Podemos usar una superclase como parámetro formal 323 00:28:24,220 --> 00:28:30,579 Y luego usar el método apropiado basándose sobre el objeto pasado como parámetro actual 324 00:28:30,579 --> 00:28:34,819 O sea, yo en un método que me dice imprimearea 325 00:28:34,819 --> 00:28:39,660 Podría usar como parámetro un figura x 326 00:28:39,660 --> 00:28:45,980 Pero cuando luego paso un figura, este figura podría pasarle un rectángulo 327 00:28:45,980 --> 00:28:47,859 Porque el rectángulo es un rectángulo 328 00:28:47,859 --> 00:28:53,920 Entonces yo podría hacer 329 00:28:53,920 --> 00:28:55,740 Un método 330 00:28:55,740 --> 00:28:58,079 En nuestro ejemplo 331 00:28:58,079 --> 00:29:01,000 Que sea un método 332 00:29:01,000 --> 00:29:05,059 En algún lado 333 00:29:05,059 --> 00:29:06,000 Hasta en otra clase 334 00:29:06,000 --> 00:29:07,359 Que sea un 335 00:29:07,359 --> 00:29:10,000 El método public 336 00:29:10,000 --> 00:29:11,880 Void 337 00:29:11,880 --> 00:29:13,039 Mueve 338 00:29:13,039 --> 00:29:16,220 De vehículo 339 00:29:16,220 --> 00:29:18,720 V 340 00:29:18,720 --> 00:29:21,519 Y este método 341 00:29:21,519 --> 00:29:22,680 Hacerle hacer 342 00:29:22,680 --> 00:29:24,119 V.mover 343 00:29:24,119 --> 00:29:27,319 V.mover 344 00:29:27,319 --> 00:29:29,220 ¿Sí? 345 00:29:30,119 --> 00:29:32,819 Ahora, cuando lo llamo este método 346 00:29:32,819 --> 00:29:34,240 Que sale en una clase, no lo sé 347 00:29:34,240 --> 00:29:34,880 Me da igual 348 00:29:34,880 --> 00:29:38,339 Yo estoy en otra clase y quiero usar mueve 349 00:29:38,339 --> 00:29:40,759 Esta clase, la clase, no sé 350 00:29:40,759 --> 00:29:42,519 Puedo usar mueve 351 00:29:42,519 --> 00:29:43,660 De 352 00:29:43,660 --> 00:29:45,799 New coche 353 00:29:45,799 --> 00:29:58,470 O poder hacer coche, coche C es igual a año coche, y luego aquí pasarle C. 354 00:30:01,440 --> 00:30:06,420 Oye, pero ¿qué me dices? Si este mueve, no recibe un coche, recibe un vehículo. 355 00:30:07,400 --> 00:30:08,940 Y además vehículo es abstracto. 356 00:30:09,259 --> 00:30:14,059 Si mayor no le pasaré un vehículo, le pasaré algo que puede ser un vehículo. 357 00:30:16,730 --> 00:30:19,049 Oye, pero mover es abstracto. 358 00:30:19,049 --> 00:30:22,930 Porque vehículo es abstracto, no puedo llamar v.mover 359 00:30:22,930 --> 00:30:29,589 Sí, porque v será, apuntará a este señor de aquí 360 00:30:29,589 --> 00:30:32,029 Porque esto es el parámetro, os acordáis, lo vimos 361 00:30:32,029 --> 00:30:35,410 Este es el parámetro formal, esto es el parámetro actual 362 00:30:35,410 --> 00:30:38,250 Este es un parámetro abstracto genérico 363 00:30:38,250 --> 00:30:42,789 Pero actualmente este de aquí será asociado con este 364 00:30:42,789 --> 00:30:47,069 Y este como instancia, como objeto, no es un objeto vehículo 365 00:30:47,069 --> 00:30:50,869 Porque no pueden existir objetos vehículos, porque es abstracto. 366 00:30:51,109 --> 00:30:54,509 Este es un objeto de tipo coche, es una instancia de coche. 367 00:30:55,609 --> 00:31:01,089 Por lo tanto, cuando llamaré uva.mover, no voy a usar el mover de vehículo. 368 00:31:01,869 --> 00:31:05,430 Voy a usar el mover de coche. 369 00:31:20,130 --> 00:31:24,910 Creo C, que apunta a un coche. 370 00:31:25,549 --> 00:31:26,349 Este es un coche. 371 00:31:28,490 --> 00:31:29,549 También es un vehículo. 372 00:31:29,549 --> 00:31:37,609 Cuando yo uso este método de aquí y le paso C 373 00:31:37,609 --> 00:31:42,930 Dentro de este método se crea una variable V de tipo vehículo 374 00:31:42,930 --> 00:31:45,869 Que apunta a esta cosa de aquí 375 00:31:45,869 --> 00:31:48,289 Porque apunta a lo mismo que apuntaría C 376 00:31:48,289 --> 00:31:51,029 Se hace una asociación entre C y V 377 00:31:51,029 --> 00:31:56,109 Entonces cuando yo ahora hago V.mover 378 00:31:56,109 --> 00:31:59,269 V me direcciona a este señor de aquí 379 00:31:59,269 --> 00:32:04,250 Y esta es una instancia de coche 380 00:32:04,250 --> 00:32:08,450 por lo tanto me usará el mover de coche 381 00:32:08,450 --> 00:32:15,480 porque ahora yo mueve 382 00:32:15,480 --> 00:32:17,740 lo puedo llamar sobre coche 383 00:32:17,740 --> 00:32:19,420 lo puedo llamar sobre barco 384 00:32:19,420 --> 00:32:20,779 lo puedo llamar sobre tren 385 00:32:20,779 --> 00:32:22,380 lo puedo llamar sobre cocodrilo 386 00:32:22,380 --> 00:32:24,519 con cualquier cosa que sea un vehículo 387 00:32:24,519 --> 00:32:31,859 realmente es para que tú puedas crear un método 388 00:32:31,859 --> 00:32:34,279 que te pille cualquier tipo de vehículo 389 00:32:34,279 --> 00:32:36,680 sin que tú sepas cómo se mueve el vehículo 390 00:32:36,680 --> 00:32:37,779 porque el vehículo no lo sabes 391 00:32:37,779 --> 00:32:40,859 pero las implementaciones de vehículos 392 00:32:40,859 --> 00:32:43,319 sí que sabrán cómo moverse. 393 00:32:44,319 --> 00:32:49,099 Entonces aquí noté, si tú no usaras esto, deberías hacer mueve de coche, 394 00:32:49,319 --> 00:32:54,299 mueve de tren, mueve de avión, y cuando mañana crean una astronave, 395 00:32:55,099 --> 00:33:00,200 tú no lo puedes hacer, porque tu astronave no tiene el método mueve-astronave. 396 00:33:04,660 --> 00:33:05,259 Shadowing no. 397 00:33:07,460 --> 00:33:12,799 Si tú haces herencia y creas una nueva clase astronave que hereda de vehículo, 398 00:33:12,799 --> 00:33:16,640 ya puedes usar tu astronave en cualquier método 399 00:33:16,640 --> 00:33:19,819 que use un vehículo, entonces es muy potente 400 00:33:19,819 --> 00:33:24,420 de cara también al modificar tu proyecto sin tener que 401 00:33:24,420 --> 00:33:35,240 modificar el resto del proyecto, entonces 402 00:33:35,240 --> 00:33:42,009 esto del polimorfismo es lo que hemos usado por ejemplo cuando hemos hecho 403 00:33:42,009 --> 00:33:46,730 una array de que eran empleados y luego dentro ponía 404 00:33:46,730 --> 00:33:50,910 empleados y gerentes, al principio lo hemos 405 00:33:50,910 --> 00:33:54,809 hecho sin polimorfismo, entre comillas, en el sentido que estábamos utilizando 406 00:33:54,809 --> 00:33:58,609 de preguntándome, maestro, ¿es un gerente? Si es un gerente, haz una cosa distinta. 407 00:33:58,950 --> 00:34:02,990 Y luego después hemos visto una forma de hacerlo, oye, no, mira, si hago el método 408 00:34:02,990 --> 00:34:06,869 coste o algo 409 00:34:06,869 --> 00:34:10,769 por el estilo, mi coste, pues él en automático, tú 410 00:34:10,769 --> 00:34:14,989 pones un empleado o un gerente y él sabrá cuál utilizar porque él sabrá 411 00:34:14,989 --> 00:34:18,389 cuál es la instancia real. Entonces 412 00:34:18,389 --> 00:34:39,030 te permite hacer arrays de empleados y calcular todo, cada uno utilizará su propia implementación, la implementación específica para eso, y si mañana tú necesitas una nueva figura, además de empleado y gerente que es administrador, no tienes que volver a tocar todos los métodos para añadir que existe este método también para administrador, 413 00:34:39,030 --> 00:34:56,570 El administrador es un empleado, simplemente cuando llegará allí y tendrá que calcular el coste del administrador, pues tú habrás definido en administrador, especificado en administrador, cómo se hace, cuál es el cálculo para el administrador y cuál es el cálculo para el gerente y cuál es el cálculo para el empleado. 414 00:34:56,570 --> 00:34:58,650 y como hemos visto en ese ejemplo concreto 415 00:34:58,650 --> 00:35:00,730 pues todos son empleados, por lo tanto 416 00:35:00,730 --> 00:35:02,670 empiezan de una base común 417 00:35:02,670 --> 00:35:04,570 que es hacer lo que hace el empleado 418 00:35:04,570 --> 00:35:06,130 calcular el coste de un empleado 419 00:35:06,130 --> 00:35:08,389 pero el gerente le añade un bonus 420 00:35:08,389 --> 00:35:10,550 y el administrador le añade la... no lo sé 421 00:35:10,550 --> 00:35:14,920 ¿no? porque 422 00:35:14,920 --> 00:35:17,000 empleado podría ser 423 00:35:17,000 --> 00:35:19,480 una clase abstracta 424 00:35:19,480 --> 00:35:21,480 y podría hacer que todos míos son empleados 425 00:35:21,480 --> 00:35:22,920 pero haya empleado simple 426 00:35:22,920 --> 00:35:25,820 empleado gerente 427 00:35:25,820 --> 00:35:26,739 empleado no sé qué 428 00:35:26,739 --> 00:35:35,659 Y todos mis métodos lo hago con empleados, pero luego cuando va a hacer algo, pues lo hará con sus métodos. 429 00:35:35,659 --> 00:35:50,340 Y si luego hay un método no definido en empleado que solo puede utilizar los gerentes, pues allí tendré que hacer la cosa de list and soft, downcastearlo, o sea, hacer el casting a gerente y a ese punto lo podré utilizar. 430 00:35:50,340 --> 00:35:53,300 las dos cosas no se excluyen 431 00:35:53,300 --> 00:35:55,579 pero 432 00:35:55,579 --> 00:35:57,539 si yo hago un diseño bien hecho 433 00:35:57,539 --> 00:35:59,739 pues me resuelvo muchos problemas 434 00:35:59,739 --> 00:36:01,239 sobre todo de cara al futuro 435 00:36:01,239 --> 00:36:02,880 porque mi sistema 436 00:36:02,880 --> 00:36:05,739 no debería funcionar ahora, debería funcionar 437 00:36:05,739 --> 00:36:07,719 siempre, y cuando mañana 438 00:36:07,719 --> 00:36:09,940 me doy cuenta que además hay un empleado 439 00:36:09,940 --> 00:36:11,760 temporal que no había metido 440 00:36:11,760 --> 00:36:13,780 no quiero volver a cambiar 441 00:36:13,780 --> 00:36:15,380 el entero sistema 442 00:36:15,380 --> 00:36:18,199 que he hecho antes, quiero añadirlo 443 00:36:18,199 --> 00:36:19,780 le pongo que es un empleado también 444 00:36:19,780 --> 00:36:21,159 y ya está, ya eso funciona. 445 00:36:22,059 --> 00:36:22,679 Si lo he hecho bien. 446 00:36:26,260 --> 00:36:27,780 Cuando tenemos que crear un objeto 447 00:36:27,780 --> 00:36:30,000 de una clase heredada, podemos utilizar como clase 448 00:36:30,000 --> 00:36:31,940 referencia a la del padre o del hijo. 449 00:36:32,659 --> 00:36:33,900 Tenemos una clase padre 450 00:36:33,900 --> 00:36:35,719 y una clase hijo, que hereda de padre. 451 00:36:36,079 --> 00:36:37,900 Puedo hacer padre objeto es igual a 452 00:36:37,900 --> 00:36:39,900 new hijo, padre objeto es igual 453 00:36:39,900 --> 00:36:41,920 a new padre. Lo puedo hacer 454 00:36:41,920 --> 00:36:43,880 solo si padre es no abstract. 455 00:36:44,519 --> 00:36:45,880 Si padre no es abstracto, 456 00:36:45,920 --> 00:36:47,960 puedo crear tranquilamente como hacía con empleado. 457 00:36:48,780 --> 00:36:51,659 Pero si padre es abstracto, esto no lo puede hacer. 458 00:36:53,059 --> 00:36:55,860 E hijo es igual a new hijo, también lo puede hacer. 459 00:36:56,860 --> 00:37:02,000 Entonces las referencias, en un cierto sentido, son más libres con respecto a la instancia. 460 00:37:02,059 --> 00:37:02,860 La instancia es única. 461 00:37:03,280 --> 00:37:04,960 Cuando yo creo un new hijo, ese es un hijo. 462 00:37:05,320 --> 00:37:07,019 Cuando yo creo un new padre, ese es un padre. 463 00:37:07,440 --> 00:37:08,460 Y eso no va a cambiar. 464 00:37:09,480 --> 00:37:14,139 Pero como lo referencio, sí que puede hacer que lo referencie como un padre o lo referencie como un hijo. 465 00:37:14,139 --> 00:37:20,739 si yo lo referencio como un padre tendré acceso a todos los métodos del padre 466 00:37:20,739 --> 00:37:25,300 si yo lo referencio como un hijo tendré acceso a todos los métodos del hijo 467 00:37:25,300 --> 00:37:30,000 si yo lo referencio como un padre luego lo puedo transformar en un hijo 468 00:37:30,000 --> 00:37:34,139 si es de la clase correcta, en este caso no podría hacerlo, en este caso sí 469 00:37:34,139 --> 00:37:42,119 y si comparten métodos, es decir que hijo sobrescribe métodos de padre 470 00:37:42,119 --> 00:37:48,260 Al usar ese método siempre se usará el de la clase específica, el del que estancia 471 00:37:48,260 --> 00:37:52,019 Este usará hijo y este usará padre 472 00:37:52,019 --> 00:37:54,239 Ahora hacemos ejemplo 473 00:37:54,239 --> 00:37:58,559 Hay tres formas posibles de estanciarlas 474 00:37:58,559 --> 00:38:03,500 Este de aquí, hijo barra es igual a año hijo 475 00:38:03,500 --> 00:38:07,539 Creo una referencia hijo con una instancia hijo 476 00:38:07,539 --> 00:38:10,320 Padre es igual a año padre 477 00:38:10,320 --> 00:38:12,699 Creo una referencia tipo padre 478 00:38:12,699 --> 00:38:13,599 Con dentro un padre 479 00:38:13,599 --> 00:38:16,320 Y luego esta cosa de aquí que en términos técnicos se llama 480 00:38:16,320 --> 00:38:17,039 Upcasting 481 00:38:17,039 --> 00:38:20,500 Que es, hago un padre, una referencia padre 482 00:38:20,500 --> 00:38:22,239 Pero dentro tiene un hijo 483 00:38:22,239 --> 00:38:24,159 Y eso es posible porque el hijo es un padre 484 00:38:24,159 --> 00:38:25,460 Entonces no hay problema 485 00:38:25,460 --> 00:38:29,139 En realidad esto es mucho lo que se hace 486 00:38:29,139 --> 00:38:32,150 Aquí 487 00:38:32,150 --> 00:38:37,460 No, en cierto sentido 488 00:38:37,460 --> 00:38:38,860 Aquí estoy haciendo un upcasting 489 00:38:38,860 --> 00:38:42,139 Porque es como si aquí dentro yo estuviera 490 00:38:42,139 --> 00:38:43,599 Haciendo que v es igual a c 491 00:38:43,599 --> 00:38:46,530 ¿Sí? 492 00:38:46,530 --> 00:38:50,190 Entonces, en realidad estoy haciendo que un vehículo 493 00:38:50,190 --> 00:38:53,530 Una referencia vehículo 494 00:38:53,530 --> 00:38:55,769 Es un coche 495 00:38:55,769 --> 00:38:57,329 ¿Sí? 496 00:39:00,199 --> 00:39:02,260 Solo podemos acceder a los del hijos 497 00:39:02,260 --> 00:39:04,000 Y hacemos un downcasting explícito 498 00:39:04,000 --> 00:39:05,340 O sea, que cuando hago esto 499 00:39:05,340 --> 00:39:08,179 Luego barache me dará solo los métodos del padre 500 00:39:08,179 --> 00:39:10,239 Lo hemos visto ayer con alguna de estas 501 00:39:10,239 --> 00:39:11,579 Ahora tanto lo volvemos a ver 502 00:39:11,579 --> 00:39:14,619 Si quiero los métodos propios del hijo 503 00:39:14,619 --> 00:39:16,219 Tendré que hacer un downcasting 504 00:39:16,219 --> 00:39:18,159 Esto es un downcasting 505 00:39:18,159 --> 00:39:19,059 Lo hemos hecho. 506 00:39:22,800 --> 00:39:28,119 Pero cuidado que si yo hago un downcasting o hago un casting a algo que no es verdad, 507 00:39:28,519 --> 00:39:30,760 pues me va a lanzar un class cast exception. 508 00:39:31,199 --> 00:39:32,800 Va a decir, esto no lo puedes hacer. 509 00:39:33,119 --> 00:39:34,260 Y hemos visto también eso. 510 00:39:36,400 --> 00:39:40,400 Si una clase abstracta tiene solo métodos abstractos, 511 00:39:40,679 --> 00:39:43,440 pues en realidad probablemente es una interfaz. 512 00:39:44,000 --> 00:39:45,199 Pero esto la próxima semana. 513 00:39:47,639 --> 00:39:48,360 ¿Dudas hasta aquí? 514 00:39:49,360 --> 00:39:49,880 Ejemplito. 515 00:39:50,739 --> 00:39:51,579 O ejemplitos. 516 00:39:51,579 --> 00:39:56,440 Ah, recreo. 517 00:39:56,480 --> 00:39:59,739 Vale, sí, entonces después de recreo, ejemplos.