1 00:00:01,199 --> 00:00:20,160 Vale, estamos de nuevo aquí en el módulo de Python. Ya el último tema. El más interesante quizás. Porque, claro, es un tema que es transversal a cualquier tipo de lenguaje, solo para Python. 2 00:00:20,160 --> 00:00:26,000 Vamos a ver, pues eso, conceptos de programación orientado a objetos, encasulación, herencia, polimorfismo. 3 00:00:28,420 --> 00:00:43,500 Si habéis tocado patrones de diseño veréis que todos estos conceptos los tenéis que tener clarísimos y son cosas que se utilizan a día de hoy para cualquier software que se desarrolle. 4 00:00:43,500 --> 00:00:49,500 Tanto para consola como para internet o para dispositivos. 5 00:00:50,159 --> 00:00:55,840 O sea, la programación orientada a objetos es la base de todo realmente 6 00:00:55,840 --> 00:00:59,939 Luego tenemos frameworks que facilitan mucho las cosas 7 00:00:59,939 --> 00:01:05,840 Porque ya se sabe que si por ejemplo vas a crear una página web 8 00:01:05,840 --> 00:01:08,040 Pues los formularios más o menos siempre son los mismos 9 00:01:08,040 --> 00:01:11,200 Entonces se crean frameworks que facilitan mucho las tareas 10 00:01:11,200 --> 00:01:15,579 Y si vas a utilizar Python para creación de videojuegos, que es muy común 11 00:01:15,579 --> 00:01:31,939 o para incluso la guía, pues hay frameworks que te dan librerías que te permiten realizar las típicas cosas que se hacen para esto con un par de instrucciones y te dan muchas herramientas. 12 00:01:31,939 --> 00:01:36,819 Pero incluso esas herramientas también están basadas en programación orientada a objetos. 13 00:01:37,480 --> 00:01:49,200 Entonces, supongo que el concepto de programación orientada a objetos ya os será familiar, ¿no? 14 00:01:49,200 --> 00:02:00,680 O lo habréis visto, habréis visto encasulación, herencia, polimorfismo, pero bueno, vamos a intentar explicarlo de manera breve o por lo menos refrescarlo. 15 00:02:01,939 --> 00:02:07,840 ya que vamos a tratarlo en python y como siempre os he subido aquí un código de ejemplo 16 00:02:10,939 --> 00:02:19,139 que son tres clases personaje guerrero y mago vale y luego como que luchan entre ellos no 17 00:02:19,139 --> 00:02:26,259 está está curioso entonces qué es una clase vale que es un objeto que es una instancia 18 00:02:26,259 --> 00:02:40,599 Digamos que la programación orientada a objetos lo que intenta es organizar un poco más el código y que sea más natural a lo que más o menos es nuestro mundo, ¿vale? 19 00:02:40,599 --> 00:02:44,879 Para que entendamos mejor cómo interacciona el código entre sí y cómo utilizarlo. 20 00:02:44,879 --> 00:02:57,340 Entonces, si pensamos en programación estructurada, que es lo que hemos estado haciendo hasta ahora, lo que conseguimos es spaghetti code, que es lo que se suele decir. 21 00:02:57,680 --> 00:03:06,400 Esto quiere decir que las instrucciones se van ejecutando una tras otra en un código que puede ser infinito. 22 00:03:06,400 --> 00:03:23,979 ¿Vale? Los típicos programas antiguos que tienen un montón de hojas de código y son ilegibles, ¿no? Con la programación orientada a objetos, al final esto te da como una estructura y te permite entender las cosas mucho mejor. 23 00:03:23,979 --> 00:03:48,400 Porque el problema que nos encontramos en la informática muchas veces es que hay sistemas que se llevan desarrollando 20 años y la gente que empezó a programar esos sistemas o que tiene un conocimiento amplio de esos sistemas, pues algunos han fallecido, otros se han cambiado de empresa, otros están jubilados. 24 00:03:48,400 --> 00:04:14,400 Entonces está el problema de cómo mantenemos la información y el conocimiento dentro de la empresa. A veces es muy difícil y por eso es tan importante los comentarios de texto, o sea, de código, la documentación, que el código sea legible y que sea más o menos entendible. 25 00:04:14,400 --> 00:04:26,600 Porque se dan los casos como en el efecto 2000 que muchas fechas estaban programadas hasta 1999 y no estaban programadas para reiniciarse en el 2000 26 00:04:26,600 --> 00:04:33,259 Entonces tuvieron que llamar gente jubilada para que ayudara, porque no sabían meterle mano al código 27 00:04:33,259 --> 00:04:41,019 Entonces, a la hora de estructurar y de que el código sea más legible y entendible 28 00:04:41,019 --> 00:04:46,800 No es baladí el hecho de que usando programación orientada a objetos esto se facilita mucho 29 00:04:46,800 --> 00:04:50,920 Y sobre todo luego a la hora de utilizar patrones de diseño 30 00:04:50,920 --> 00:04:59,079 Que son buenas prácticas de problemas que han ido surgiendo con la experiencia que hemos ido acumulando 31 00:04:59,079 --> 00:05:08,920 el sector IT y que están ya resueltos en modos de filigranas que se hacen utilizando la programación orientada a objetos, 32 00:05:09,079 --> 00:05:16,079 con el polimorfismo, con clases abstractas, con todo esto. ¿De acuerdo? Con instancias como el Singleton. 33 00:05:17,459 --> 00:05:26,160 Entonces, vamos a ver primero lo que es una clase. Una clase es algo tan sencillo como un contenedor que tiene atributos, 34 00:05:26,160 --> 00:05:34,439 que son las variables y métodos que son las funcionalidades o capacidades que te permite esta clase. 35 00:05:36,620 --> 00:05:49,220 Por ejemplo, si pensamos en algo facilito como el típico coche, pues va a tener ruedas, que va a ser el número de ruedas, 36 00:05:49,220 --> 00:06:00,959 una potencia, un tipo de motor, un color, va a ser de un segmento, pequeño o grande, 4x4. 37 00:06:01,939 --> 00:06:17,139 Vamos a tener una serie de variables que definen a ese objeto porque una vez que tenemos la clase configurada con nuestras variables 38 00:06:17,139 --> 00:06:24,300 y con las funciones que son las funcionalidades, o sea, nuestros métodos que son las funcionalidades 39 00:06:24,300 --> 00:06:28,860 que puede hacer la clase, lo que vamos a hacer es crear objetos de esa clase. 40 00:06:29,720 --> 00:06:38,920 Crear objetos es, pues eso, tenemos una clase coche genérica y lo que vamos a hacer es crear un objeto 41 00:06:38,920 --> 00:06:52,939 que sea Opel Corsa. Y a ese objeto que es Opel Corsa ya le metemos unos valores a esas variables iniciales, porque ya hemos concretado lo que es el objeto. 42 00:06:53,420 --> 00:07:04,939 Ya sabemos el color del coche, el tipo, el número de ruedas, la potencia, el tipo de motor, si es diésel, gasolina, híbrido. Entonces eso lo llamamos 43 00:07:04,939 --> 00:07:11,699 instanciar el objeto vale tenemos una clase en este caso tenemos la clase personaje la 44 00:07:11,699 --> 00:07:16,180 particularidad de python en programación orienta objetos que es que tiene muchas 45 00:07:16,180 --> 00:07:23,899 particularidades quizás en java o en temas más sea más más evidente es que no hace falta declarar 46 00:07:23,899 --> 00:07:29,939 los atributos los teclas directamente en el constructor el constructor que se declara así 47 00:07:29,939 --> 00:07:36,480 como el guión bajo guión bajo son dos guiones bajos vale guión bajo guión bajo init guión bajo guión 48 00:07:36,480 --> 00:07:44,060 bajo vale y los atributos es decir las variables que contienen la clase y que la definen vale en 49 00:07:44,060 --> 00:07:49,920 este caso tenemos un personaje de rol entonces tenemos nombre nombre fuerza inteligencia defensa 50 00:07:49,920 --> 00:08:05,439 y vida vale entonces si queremos instancia el personaje 0 vale vamos a crear un personaje a 51 00:08:05,439 --> 00:08:11,879 través de la clase personaje y no sé si os habéis dado cuenta pero las clases siempre empiezan con 52 00:08:11,879 --> 00:08:19,959 en mayúscula vale es una normativa estándar que se utiliza en todas partes y que la tenéis que 53 00:08:19,959 --> 00:08:25,180 tener en cuenta vosotros también vale como veis mago la primera mayúscula guerrero la primera 54 00:08:25,180 --> 00:08:33,279 mayúscula personaje la primera mayúscula entonces si queremos crear un personaje basado en estas 55 00:08:33,279 --> 00:08:44,120 características vale lo que lo vamos a estanciar y lo vamos a estanciar utilizando el constructor 56 00:08:44,120 --> 00:09:06,879 Que hemos dicho que es esto de aquí, con init. El constructor es un método que es estándar, que se utiliza con palabras claves. En Java o en C++ os vais a encontrar que lo que tenéis que hacer es definir una función que tenga el mismo nombre que la clase y ya le metéis los atributos. 57 00:09:06,879 --> 00:09:13,519 Pero los atributos tienen que estar definidos antes, porque en C++ y en Java tenéis que definir los tipos de las variables. 58 00:09:13,700 --> 00:09:21,279 Aquí no. Entonces, como aquí no necesitáis definir los tipos de las variables, lo podemos hacer definiéndolas directamente aquí. 59 00:09:21,940 --> 00:09:24,580 Que las podríamos definir también aquí, ¿vale? 60 00:09:25,320 --> 00:09:30,740 Podríamos poner nombre y ponerle un nombre por defecto, ¿no, Pedro? 61 00:09:31,740 --> 00:09:33,759 Y así con todo, ¿vale? 62 00:09:33,759 --> 00:09:45,000 Y luego en el constructor, pues luego lo podremos cambiar. Pero lo normal es hacerlo así porque así es más legible y se ahorra código. 63 00:09:45,480 --> 00:09:51,820 Y si vosotros programáis en Python, pues ya sabéis que la declaración de los atributos se genera aquí. 64 00:09:53,179 --> 00:10:02,440 Entonces, hemos dicho que de una clase se crea un objeto, que es la concreción de esa clase. 65 00:10:02,440 --> 00:10:14,460 Lo habíamos dicho antes, si estamos creando un coche, la clase es coche, pero el objeto es Opel Corsa, que ya le damos valor a los atributos de la clase. 66 00:10:16,320 --> 00:10:21,340 Y el objeto se crea con el constructor, que es este de aquí. 67 00:10:23,000 --> 00:10:27,200 Todo este lenguaje es importante porque luego se va a hablar de estas cosillas. 68 00:10:27,200 --> 00:10:41,919 Y lo que hacemos es instanciarlo. Cuando creamos un objeto lo instanciamos. Hacemos una instancia de la clase. Personaje 1 es instancia de la clase guerrero. Personaje 2 es una instancia de la clase mago. 69 00:10:41,919 --> 00:10:44,759 entonces, aquí, para crear 70 00:10:44,759 --> 00:10:46,139 la personaje 0 71 00:10:46,139 --> 00:10:47,679 con un personaje 72 00:10:47,679 --> 00:10:50,639 utilizando la clase 73 00:10:50,639 --> 00:10:54,679 personaje, vale 74 00:10:54,679 --> 00:10:57,000 pues ya tenemos aquí que le tenemos que dar un 75 00:10:57,000 --> 00:10:57,419 nombre 76 00:10:57,419 --> 00:11:01,799 pues eso, pero 77 00:11:01,799 --> 00:11:07,929 luego le ponemos la defensa 78 00:11:07,929 --> 00:11:10,269 le ponemos la fuerza 79 00:11:10,269 --> 00:11:12,830 le ponemos la inteligencia 80 00:11:12,830 --> 00:11:14,190 y 81 00:11:14,190 --> 00:11:16,990 ¿qué más? el nombre 82 00:11:16,990 --> 00:11:20,870 La fuerza va primero 83 00:11:20,870 --> 00:11:23,379 Entonces 84 00:11:23,379 --> 00:11:26,399 Vale, la fuerza va primero 85 00:11:26,399 --> 00:11:28,539 Luego 86 00:11:28,539 --> 00:11:31,899 Uy, que me voy 87 00:11:31,899 --> 00:11:46,350 Luego era la defensa 88 00:11:46,350 --> 00:11:47,710 ¿Verdad? 89 00:11:48,610 --> 00:11:50,450 A ver, es el nombre, la fuerza 90 00:11:50,450 --> 00:11:52,029 Bueno, la inteligencia 10 91 00:11:52,029 --> 00:11:53,490 La defensa y la vida 92 00:11:53,490 --> 00:11:58,059 Vale, nombre, fuerza 93 00:11:58,059 --> 00:11:59,559 Inteligencia 94 00:11:59,559 --> 00:12:01,860 Defensa 95 00:12:01,860 --> 00:12:17,730 Le ponemos 5 y la vida 100. Por ejemplo, y así ya tendríamos un objeto de la clase personaje que lo estamos instanciando con el constructor. 96 00:12:19,330 --> 00:12:24,250 ¿De acuerdo? Con estos valores. Estos valores son los que les hemos puesto aquí. 97 00:12:24,250 --> 00:12:32,789 Entonces, vale, esto ya está 98 00:12:32,789 --> 00:12:39,850 Tenemos el constructor con el barra baja, barra baja, init, barra baja, barra baja 99 00:12:39,850 --> 00:12:48,350 Le ponemos los atributos de la clase que caracterizan a la clase y con los cuales vamos a crear los objetos de la clase 100 00:12:48,350 --> 00:12:56,250 Y luego tenemos el self, porque self es yo mismo, es la clase 101 00:12:56,250 --> 00:13:03,870 los atributos de la clase de cuando estás utilizando tú el objeto vale entonces si 102 00:13:03,870 --> 00:13:13,830 decimos self que es él yo mismo no el objeto del que estamos hablando vale para inicializarlo si 103 00:13:13,830 --> 00:13:20,769 tenemos un coche pensar que estamos haciendo como una una copia de ese coche un nuevo modelo de 104 00:13:20,769 --> 00:13:26,409 percorsa vale y el nuevo modelo tiene las características estas que estamos hablando 105 00:13:26,409 --> 00:13:33,250 del número de ruedas potencia tipo de motor y todo esto vale eso es el self punto potencia 106 00:13:33,250 --> 00:13:43,169 es el punto número de ruedas es el punto tipo de motor es el punto segmento vale eso es el 107 00:13:43,169 --> 00:13:56,129 Estamos definiendo al Opel Corsa. Entonces, para diferenciar las variables propias del Opel Corsa y las que le estamos pasando, utilizamos el self. 108 00:13:56,690 --> 00:14:07,809 Entonces, con self estamos inicializando los atributos del objeto y los estamos inicializando con los datos que le hemos pasado aquí. 109 00:14:07,809 --> 00:14:21,330 En este caso estamos creando un personaje que se llama Pedro, entonces le pasamos Pedro y vamos inicializando los atributos del objeto de esta clase. 110 00:14:25,649 --> 00:14:41,210 Luego tenemos los métodos, que son las funciones que ese objeto puede hacer. 111 00:14:41,210 --> 00:14:53,190 Vale, digamos que si tenemos un coche, la clase coche, ya tenemos un objeto instanciado que es un opercorsa, pues ¿qué puede hacer este opercorsa? 112 00:14:53,409 --> 00:15:07,370 Puede hacer lo que está implementado en los métodos de la clase. En el caso de la clase coche, pues podría arrancar, acelerar, frenar, repostar, encender la radio, el aire acondicionado... 113 00:15:07,370 --> 00:15:19,350 Pues todas estas acciones son métodos de la clase y cuando creamos un objeto, ese objeto va a tener esas facultades, las facultades que le implementemos en las funciones de la clase. 114 00:15:20,610 --> 00:15:35,509 Entonces, ¿cómo accedemos a estos métodos? Pues ya que tenemos aquí el personaje, accedemos con puntos. 115 00:15:35,509 --> 00:15:44,950 ponemos el punto vale tenemos el objeto que sería el opercorsa por ejemplo en este caso tenemos el 116 00:15:44,950 --> 00:15:51,169 personaje que es pedro y como veis aquí ya tenemos una serie de funcionalidades verdad 117 00:15:51,169 --> 00:15:59,629 tenemos atacar tenemos daño tenemos está vivo tenemos que fuerza se esfuerza subir nivel vale 118 00:15:59,629 --> 00:16:15,970 ¿Vale? Entonces, todas esas funcionalidades son las que están implementadas aquí. ¿Vale? Subir nivel, está vivo, atacar, daño. ¿Vale? Así es como accedemos a los métodos de la clase. 119 00:16:15,970 --> 00:16:27,440 Entonces esto es lo que es la programación orientada a objetos. ¿Qué más? Vamos con la herencia. ¿Qué es lo que pasa? 120 00:16:29,440 --> 00:16:39,940 Imaginad que en vez de tener coche tenemos una clase vehículo. Vehículo puede tener... pueden ser de varios tipos. 121 00:16:39,940 --> 00:16:47,080 vale puede ser una moto puede ser un coche puede ser un barco puede ser un avión vale entonces 122 00:16:49,379 --> 00:16:55,980 qué es lo que podemos hacer lo que podemos hacer es crear una clase vehículo vale 123 00:16:57,059 --> 00:17:03,000 y luego tener clases para cada tipo de vehículo porque cada tipo de vehículo tiene sus 124 00:17:03,000 --> 00:17:13,619 características propias pero no dejan de ser vehículos vale porque un coche y un avión son 125 00:17:13,619 --> 00:17:20,640 diferentes pero al final ambos tienen una autonomía ambos tienen un número permitido 126 00:17:20,640 --> 00:17:27,599 de pasajeros ambos tienen quizás un volante vale ambos se mueven con algún tipo de energía ya sea 127 00:17:27,599 --> 00:17:36,660 combustible o queroseno vale entonces todas estas características vale son atributos que 128 00:17:36,660 --> 00:17:43,259 pueden compartir por eso tenemos una clase vehículo y una y unos unos tipos de vehículos 129 00:17:43,259 --> 00:17:48,920 que heredan de esta clase vehículo vale podemos decir que coche avión barco heredan de la clase 130 00:17:48,920 --> 00:17:57,220 vehículo entonces qué es lo que pasa que la clase vehículo vamos a tener lo básico tanto 131 00:17:57,220 --> 00:18:03,599 por el lado de los atributos como por el lado de los métodos vale porque un barco un avión y un 132 00:18:03,599 --> 00:18:14,960 coche arrancan y un barco un avión y un coche tienen que llenar el depósito de combustible 133 00:18:14,960 --> 00:18:21,180 verdad o sea siguen teniendo acciones en común vale entonces decimos que el coche hereda de 134 00:18:21,180 --> 00:18:29,859 vehículo y decimos que que barco y avión heredan de vehículo vale entonces qué es lo que pasa que 135 00:18:29,859 --> 00:18:36,079 vehículo tiene los atributos y las y los métodos básicos que comparten todos los tipos de vehículos 136 00:18:36,079 --> 00:18:43,319 pero luego cada vehículo cada coche cada barco cada avión tendrá sus propias particularidades 137 00:18:43,319 --> 00:18:54,819 ¿Verdad? Y por eso, si os fijáis, aquí hemos creado un objeto personaje y tiene cinco atributos. 138 00:18:55,099 --> 00:18:59,180 Sin embargo, si nos vamos a guerrero, tiene seis atributos y mago igual. 139 00:19:00,359 --> 00:19:08,059 ¿Y esto por qué es? Porque tanto guerrero como mago son personajes, por lo tanto, heredan de personaje 140 00:19:08,059 --> 00:19:21,849 y se benefician de los atributos de personajes, como vemos aquí, pero resulta que mago tiene un libro y guerrero tiene una espada. 141 00:19:22,670 --> 00:19:34,210 O sea, tienen atributos propios y tienen métodos propios. Por ejemplo, el guerrero tiene un método que es propio, que es cambiar el arma. 142 00:19:34,210 --> 00:19:58,029 ¿Vale? Y entonces, como tenemos la espada, si elegimos la opción 1, tenemos el acero varirio, que hace que la espada valga 8, o si ponemos el 2, que tenemos el matadragones, que hace que el daño de la espada sea 10. 143 00:19:58,029 --> 00:20:10,329 Entonces, este método solo va a ser accesible si tienes un objeto instanciado con la clase Guerrero. 144 00:20:12,170 --> 00:20:18,509 ¿Vale? Es decir, si yo cojo personaje, no voy a tener ese método accesible. 145 00:20:22,339 --> 00:20:23,180 ¿Veis? No está. 146 00:20:24,079 --> 00:20:34,180 Sin embargo, si yo cojo el personaje 1, que sí que está instanciado a través de la clase guerrero, sí que la tiene. 147 00:20:34,180 --> 00:20:51,339 ¿Veis? Pero es que no solo personaje tiene cambiar de arma, ¿vale? También tiene daño. 148 00:20:51,339 --> 00:21:09,279 Y si le damos, vemos que tiene atacar, tiene está vivo, tiene morir, ¿vale? Que son métodos de personaje. Y estos métodos los tiene accesibles porque está heredando de él, ¿vale? 149 00:21:09,279 --> 00:21:15,779 O sea, tú cuando heredas de una clase superior, vas a compartir sus atributos y sus métodos. 150 00:21:16,279 --> 00:21:23,640 Y esto todo tiene que tener sentido, porque tanto un vehículo, un coche es un vehículo, como un guerrero es un personaje. 151 00:21:24,880 --> 00:21:25,059 ¿Vale? 152 00:21:26,720 --> 00:21:28,740 Hay que planteárselo así. 153 00:21:30,140 --> 00:21:32,839 Entonces, ¿qué tenemos? 154 00:21:32,839 --> 00:21:42,519 Aquí tenemos los personajes, que son características que van a ser comunes a todo tipo de personajes independientemente de si son guerreros, magos o micos. 155 00:21:44,420 --> 00:21:48,059 Y entonces luego tenemos guerrero y mago que heredan de personaje. 156 00:21:48,200 --> 00:21:50,559 ¿Y cómo le decimos en Python que hereda de otra clase? 157 00:21:51,299 --> 00:21:52,420 Se lo decimos de esta manera. 158 00:21:53,519 --> 00:21:59,299 Class, guerrero y entre paréntesis le metemos personaje, la clase de la cual hereda. 159 00:21:59,799 --> 00:22:00,559 ¿De acuerdo? 160 00:22:00,559 --> 00:22:17,240 Por supuesto, tenemos un constructor y con este constructor lo que hacemos es que llamamos al constructor de la clase superior, de la cual hereda, es decir, de personaje, y le metemos los atributos que acepta este constructor. 161 00:22:17,240 --> 00:22:25,460 Y luego con el self, que ya hemos hablado de que eres tú mismo, el objeto que estás creando 162 00:22:25,460 --> 00:22:34,789 Le añadimos la espada, que es el atributo nuevo que hemos creado para este tipo de personaje 163 00:22:34,789 --> 00:22:46,109 Y ya pues tenemos el método atributo que simplemente te saca la información de los atributos 164 00:22:46,109 --> 00:22:48,289 ¿Vale? Del estado de los atributos 165 00:22:48,289 --> 00:22:51,529 Y lo que hacemos es 166 00:22:51,529 --> 00:22:53,369 Llamar a la clase padre 167 00:22:53,369 --> 00:22:56,829 Al método atributos de la clase padre 168 00:22:56,829 --> 00:23:00,049 Y luego añadir las nuevas características que tiene este personaje 169 00:23:00,049 --> 00:23:02,009 Lo mismo hacemos con mago 170 00:23:02,009 --> 00:23:04,369 Y lo mismo hacemos con el constructor de mago 171 00:23:04,369 --> 00:23:06,569 ¿Vale? En este caso el libro 172 00:23:06,569 --> 00:23:10,490 Y luego lo que hacemos es 173 00:23:10,490 --> 00:23:11,829 Un concepto 174 00:23:13,450 --> 00:23:15,049 Que os explico nuevo 175 00:23:15,049 --> 00:23:16,470 Que se llama sobrecarga 176 00:23:16,470 --> 00:23:26,750 Sobrecarga de métodos. ¿Qué es lo que pasa? Aquí, cambiar arma es un método propio de la clase guerrero, que no está en personaje. 177 00:23:27,349 --> 00:23:35,809 En personaje no está cambiar arma. Entonces, es un método que es exclusivo de guerrero. ¿Qué es lo que pasa con la herencia? 178 00:23:35,809 --> 00:23:53,170 Que puede ser que, si volvemos al ejemplo de vehículos, con el coche, la moto, el barco o el avión, todos ellos arrancan, ¿vale? 179 00:23:53,170 --> 00:24:06,109 Pero imaginad que todos arrancan con una llave menos, yo que sé, el barco que es con una manivela. 180 00:24:07,450 --> 00:24:19,410 ¿Vale? Entonces, ¿qué es lo que pasa? Que para todos estos tipos de vehículos el arrancar con una llave va a ser válido y por lo tanto podrán utilizar el método de la clase de la cual heredan. 181 00:24:19,410 --> 00:24:33,109 Pero para el barco no, porque el barco tiene que arrancar a manivela. Entonces lo que hacemos es el método arranque que tendría la clase vehículo lo sobrecargamos. 182 00:24:33,109 --> 00:24:52,369 ¿Qué quiere decir esto? Que en la clase que hereda, que sería la clase barco, definimos otra vez el método arrancar y lo hacemos según la funcionalidad que tenemos que darle para que arranque a manivel el barco. 183 00:24:52,789 --> 00:25:02,789 Es decir, lo cambiamos. Cogemos el método del padre y le decimos, en este caso para esta clase no va a ser así, va a ser de la otra forma. 184 00:25:03,109 --> 00:25:05,609 Y así es como estamos haciendo esto. ¿Por qué? 185 00:25:07,190 --> 00:25:11,309 En la clase personaje tenemos un método que es daño. 186 00:25:12,789 --> 00:25:16,950 Que simplemente es la fuerza menos la defensa del enemigo. 187 00:25:17,329 --> 00:25:22,890 La fuerza tuya menos la defensa que expone el enemigo. 188 00:25:24,609 --> 00:25:30,269 Y esto podría ser así para personajes genéricos. 189 00:25:30,269 --> 00:25:41,970 Pero en este caso, nosotros tenemos una espada y el mago tiene... Perdón, nosotros no. El guerrero tiene una espada y el mago tiene un libro. Y estas cosas influyen. 190 00:25:42,670 --> 00:25:51,269 Entonces lo que tenemos que hacer es sobrecargar el método. Cogemos el mismo daño, porque claro, lo tenemos que llamar igual. 191 00:25:51,269 --> 00:25:55,509 Porque darás cuenta de que si, por ejemplo, este lo llamamos daño 2 192 00:25:55,509 --> 00:25:58,789 Guerrero tendrá acceso a daño 1 193 00:25:58,789 --> 00:26:01,289 Bueno, daño a secas, perdón 194 00:26:01,289 --> 00:26:04,970 Que es el daño de la clase personaje de la cual hereda 195 00:26:04,970 --> 00:26:07,529 Y tendrá acceso a daño 2 196 00:26:07,529 --> 00:26:09,950 O daño guerrero, o como lo quieras llamar 197 00:26:09,950 --> 00:26:12,549 Esto puede inducir errores, ¿vale? 198 00:26:12,549 --> 00:26:13,769 Y no hay necesidad 199 00:26:13,769 --> 00:26:16,369 Porque el guerrero al final va a hacer un tipo de daño 200 00:26:16,369 --> 00:26:18,490 Y es un tipo de daño especial 201 00:26:18,490 --> 00:26:23,470 Que va a ser diferente al daño de la clase de la cual hereda 202 00:26:23,470 --> 00:26:28,009 Entonces por eso lo llamamos que sobrecargamos el método 203 00:26:28,009 --> 00:26:32,309 Y lo llamamos igual, para que no haya ambigüedad 204 00:26:32,309 --> 00:26:36,369 Para que sepamos que el guerrero hace daño con el método daño 205 00:26:36,369 --> 00:26:42,690 Y no hace daño con el método daño suyo, ni daño con el método daño de la clase de la cual hereda 206 00:26:42,690 --> 00:26:50,509 y tal entonces hemos decidido que el daño para guerrero y mago lo vamos a sobrecargar vale 207 00:26:50,509 --> 00:26:55,849 entonces hacemos pues nuestra propia fórmula tanto para guerrero que incluimos la espada 208 00:26:55,849 --> 00:27:02,049 simplemente la fuerza por la espada menos la defensa y como para el mago que simplemente 209 00:27:02,049 --> 00:27:09,289 es la inteligencia por el libro menos la defensa y ya está de acuerdo entonces 210 00:27:09,289 --> 00:27:12,930 Bueno, os puedo explicar un poco 211 00:27:12,930 --> 00:27:14,769 Lo que son las clases abstractas 212 00:27:14,769 --> 00:27:17,069 Porque también puede ser interesante 213 00:27:17,069 --> 00:27:18,650 Realmente no entra en el temario 214 00:27:18,650 --> 00:27:20,430 Algunos ya sabréis lo que son 215 00:27:20,430 --> 00:27:23,190 Pero, ya que estamos 216 00:27:23,190 --> 00:27:24,269 Con todo el cinglao 217 00:27:24,269 --> 00:27:25,730 Igual lo escucháis por ahí 218 00:27:25,730 --> 00:27:28,289 Una clase abstracta, ¿qué es? 219 00:27:28,950 --> 00:27:30,730 Una clase abstracta es una clase 220 00:27:30,730 --> 00:27:32,529 De la cual no vamos a estar haciendo objetos 221 00:27:32,529 --> 00:27:34,990 Es decir, no vamos a crear un objeto 222 00:27:34,990 --> 00:27:36,009 De esa clase 223 00:27:36,009 --> 00:27:38,410 ¿Vale? Y con la clase vehículo 224 00:27:38,410 --> 00:27:39,210 Pues se ve muy claro 225 00:27:39,210 --> 00:27:51,569 Si tú realmente tienes una clase vehículo, de la cual hereda coche, moto, yo qué sé, barco y avión, tú no vas a tener necesidad de crear un objeto vehículo. 226 00:27:53,049 --> 00:28:00,789 No tiene sentido, porque tú lo que tienes es un coche, o un barco, o un avión. No tienes un vehículo a secas. 227 00:28:00,789 --> 00:28:09,950 Entonces, lo que tenemos con las clases abstractas es que tú creas una clase de la cual no se puede instanciar objetos 228 00:28:09,950 --> 00:28:15,289 ¿Qué quiere decir? Que no puedes crear objetos a partir de esa clase, porque no te va a dejar 229 00:28:15,289 --> 00:28:24,089 Porque no tiene sentido crear un vehículo, tú tienes que crear un coche, un barco, un tren o lo que sea 230 00:28:24,089 --> 00:28:29,069 Eso sí, pero un vehículo no lo vas a crear, entonces esas clases se llaman clases abstractas 231 00:28:29,069 --> 00:28:42,109 Que simplemente dan la base para que hereden y ahorrar código, pero luego no vas a poder instanciarlas, sino que vas a tener que instanciar una de las clases de las cuales se heredan. 232 00:28:42,650 --> 00:28:44,509 Ese es el concepto de clase abstracta. 233 00:28:46,680 --> 00:28:49,940 Vamos con la encasulación. ¿Qué es lo que pasa? 234 00:28:49,940 --> 00:28:57,759 que bueno en python es no se puede utilizar la encapsulación porque aunque crees métodos privados 235 00:28:57,759 --> 00:29:03,680 que ahora lo voy a explicar sí que puedes acceder a los atributos y a los métodos vale pero bueno 236 00:29:03,680 --> 00:29:11,339 si vais a java o hace más más o otros lenguajes que no son tan raros como python sí que vais a 237 00:29:11,339 --> 00:29:17,960 ver que las tanto las variables como los métodos tienen un ámbito un scope lo que se llama en 238 00:29:17,960 --> 00:29:23,279 inglés esto quiere decir que desde fuera 239 00:29:23,279 --> 00:29:27,180 cómo se van a poder leer esas variables o esos métodos 240 00:29:27,180 --> 00:29:36,690 vale pues porque como comprenderéis tenemos aquí los atributos y por 241 00:29:36,690 --> 00:29:43,359 ejemplo si queremos que la inteligencia la defensa de la vida sean siempre 242 00:29:43,359 --> 00:29:49,440 positivos no podemos dejar que la gente utilice la clase de personaje y tenga 243 00:29:49,440 --> 00:29:57,240 acceso directo a estas a estos atributos porque podrían coger y darles datos negativos vale eso 244 00:29:57,240 --> 00:30:04,140 tenemos que controlar cómo se dan valores a estas a estos atributos y para ello lo que hacemos es 245 00:30:04,140 --> 00:30:14,039 utilizar los los scopes de variables o los scopes de los métodos vale los scopes que los más los 246 00:30:14,039 --> 00:30:20,700 más comunes y populares es private public y protect it no si una variable o un método es 247 00:30:20,700 --> 00:30:29,680 público entonces si podría yo desde fuera y decir personaje pues esto personaje 1 punto 248 00:30:31,740 --> 00:30:39,420 fuerza igual a menos 20 entonces ya lo hemos liado vale porque igual si ponemos aquí menos 249 00:30:39,420 --> 00:30:46,619 20 la clase está pensada para que estos números sean positivos y para que lo utilicen métodos que 250 00:30:46,619 --> 00:30:52,940 están suponiendo que estos valores son positivos y si no no funcionan vale te va a dar fallos y 251 00:30:52,940 --> 00:31:02,920 movidas entonces para prevenir esto lo que hacemos es poner las variables privadas una variable 252 00:31:02,920 --> 00:31:08,000 privada es una variable que sólo es accesible dentro de la clase vale dentro de los métodos 253 00:31:08,000 --> 00:31:30,650 Si, por ejemplo, para poner la variable privada en Python, poniéndolo barra baja o barra baja, si lo pongo así, en teoría, solo podría acceder dentro de la clase. 254 00:31:33,019 --> 00:31:41,339 De esta forma. Pero no desde fuera. Esto no me dejaría acceder desde fuera. 255 00:31:41,339 --> 00:31:50,960 O sea, yo sé que accedo aquí 256 00:31:50,960 --> 00:31:53,740 Pero cuando ejecute 257 00:31:53,740 --> 00:31:54,900 Me va a dar un problema 258 00:31:54,900 --> 00:31:57,339 Me va a decir que no lo puede 259 00:31:57,339 --> 00:31:59,380 Me va a dar un fallo de código 260 00:31:59,380 --> 00:32:02,180 Vale, si ejecutamos esto 261 00:32:02,180 --> 00:32:23,420 Es que no estoy en mi ordenador 262 00:32:23,420 --> 00:32:26,059 Y ahora no tengo puestas las cosillas 263 00:32:26,059 --> 00:32:35,910 Vale, me da otros fallos 264 00:32:35,910 --> 00:32:37,329 Por eso no sale 265 00:32:37,329 --> 00:32:40,869 Aquí 266 00:32:40,869 --> 00:32:42,990 No, esto no es 267 00:32:42,990 --> 00:32:45,730 Bueno, me da otros fallos 268 00:32:45,730 --> 00:32:52,490 el código porque bueno lo miraré pero vamos el caso es que si el código estuviera bien 269 00:32:53,630 --> 00:33:00,670 me saltaría un error porque no puedo instanciar una variable privada vale o sea de eso se trata 270 00:33:00,670 --> 00:33:11,089 se trata de qué de que las variables cuando son privadas sólo se pueden ejecutar o sea sólo se 271 00:33:11,089 --> 00:33:15,230 pueden utilizar dentro de la clase no fuera porque si las utilizamos fuera 272 00:33:15,230 --> 00:33:21,890 igual las podríamos utilizar de manera que incorrecta vale entonces por eso lo 273 00:33:21,890 --> 00:33:27,170 que hacemos es que declaramos las variables privadas dentro de la clase y 274 00:33:27,170 --> 00:33:31,009 luego utilizamos métodos 275 00:33:31,009 --> 00:33:38,000 que se suelen llamar get y set para hacer acceder a las variables y para 276 00:33:38,000 --> 00:34:01,609 setear las es decir antes he puesto la vida por ejemplo vamos a quitarlo vale vale pues 277 00:34:01,609 --> 00:34:08,130 imaginaros que está así y en python no pudiéramos acceder desde fuera efectivamente porque sí que 278 00:34:08,130 --> 00:34:14,429 hay un truquillo para poder acceder que no hace falta que lo sepáis pero por eso realmente la 279 00:34:14,429 --> 00:34:18,570 encapsulación no tiene mucho sentido en python en otros lenguajes de programación como os he 280 00:34:18,570 --> 00:34:25,070 comentado en java y en c++ sí porque si ponéis una variable privada nos aparece a la hora de 281 00:34:25,070 --> 00:34:31,929 utilizarlo vale ponéis el punto y aquí veis que sí que os aparece con con la vida pero en 282 00:34:33,510 --> 00:34:40,369 en java y en c++ nos aparecería lo que sí os aparecería sería el get y el set que los tengo 283 00:34:40,369 --> 00:34:52,349 aquí programados vale entonces ya si creo un personaje aparecería el get y aparecería el set 284 00:34:52,349 --> 00:34:59,050 vale pero si por ejemplo es lo que os digo en java y hace más más nos aparecería fuerza aquí 285 00:34:59,050 --> 00:35:07,010 si por eso en el país en lo de las cancelaciones un poco ambiguo vale y por eso no tengo nada en 286 00:35:07,010 --> 00:35:08,090 a su lado, pero 287 00:35:08,090 --> 00:35:10,969 lo que quiero es que os quede el concepto 288 00:35:10,969 --> 00:35:13,110 porque en un futuro, por ejemplo 289 00:35:13,110 --> 00:35:14,929 en Java es muy común, hay mucho 290 00:35:14,929 --> 00:35:17,070 trabajo para programar, entonces en Java 291 00:35:17,070 --> 00:35:18,650 sí que lo vais a ver, que hay 292 00:35:18,650 --> 00:35:20,909 variables, atributos y métodos 293 00:35:20,909 --> 00:35:22,849 que son públicos, privados y protected 294 00:35:22,849 --> 00:35:24,530 que son los más parecidos 295 00:35:24,530 --> 00:35:26,630 protected es 296 00:35:26,630 --> 00:35:29,070 que, por ejemplo, permite 297 00:35:29,070 --> 00:35:31,070 que las variables de las cuales 298 00:35:31,070 --> 00:35:32,969 heredas sean 299 00:35:32,969 --> 00:35:33,809 accesibles, o sea 300 00:35:33,809 --> 00:35:36,829 estas variables, pensad que están protected 301 00:35:36,829 --> 00:35:39,630 Podría accederlas a través de Guerrero 302 00:35:39,630 --> 00:35:40,230 Pero si están 303 00:35:40,230 --> 00:35:43,230 Private, privadas 304 00:35:43,230 --> 00:35:45,090 Si fueran privadas, no podría 305 00:35:45,090 --> 00:35:46,949 Por eso se utiliza el protected 306 00:35:46,949 --> 00:35:49,130 Entonces, si son públicas 307 00:35:49,130 --> 00:35:52,010 Se pueden acceder a pelo desde fuera de la clase 308 00:35:52,010 --> 00:35:55,449 Cosa que no es recomendable 309 00:35:55,449 --> 00:35:56,929 Por lo que os he dicho 310 00:35:56,929 --> 00:35:58,610 Que se podrían manipular los datos 311 00:35:58,610 --> 00:36:01,030 Los atributos y los métodos 312 00:36:01,030 --> 00:36:02,809 Si son private 313 00:36:02,809 --> 00:36:05,110 Si son privadas, solo se pueden 314 00:36:05,110 --> 00:36:10,449 acceder dentro de la clase y si son protected también las pueden acceder las que heredan vale 315 00:36:10,449 --> 00:36:23,989 es así de sencillo entonces ahí va qué es lo que pasa a ver aquí también muy bien qué es lo que 316 00:36:23,989 --> 00:36:31,389 pasa que hemos dicho que lo queremos poner private las variables para que desde fuera nos pueden 317 00:36:31,389 --> 00:36:37,690 cambiar el valor vale entonces aún no puedo decir jolín y cómo accedo si no verdad 318 00:36:39,329 --> 00:36:47,650 lo que vamos a tener con el que se va a ser un acceso controlado es decir cuando yo llamo 319 00:36:47,650 --> 00:36:58,489 a personaje 0.2 fuerza o punto que punto set fuerza lo que vamos a hacer es acceder y poder 320 00:36:58,489 --> 00:37:07,789 manipular ese atributo o llamar a ese método o función pero de manera controlada y como lo 321 00:37:07,789 --> 00:37:12,289 controlas no porque hemos dicho que si está público lo puedes cambiar el dato directamente 322 00:37:12,289 --> 00:37:19,170 que no es lo suyo no y si está privado no puedes acceder a la variable entonces lo que hacemos es 323 00:37:19,170 --> 00:37:25,829 acceder a los métodos que programamos nosotros del get y el set para controlar los valores que 324 00:37:25,829 --> 00:37:33,349 van a tomar esas variables o cuándo puedes y cuándo no llamar a cierto método vale entonces 325 00:37:34,389 --> 00:37:41,210 el que está es muy sencillo porque al final es como un rizón lee vale tampoco puedes hacer gran 326 00:37:41,210 --> 00:37:46,909 daño simplemente obtienes el valor de la variable pero qué sé yo si por ejemplo el valor de la 327 00:37:46,909 --> 00:37:52,590 variable sólo pudiera sostener dependiendo de cierto estado pues tendríamos que verificar si 328 00:37:52,590 --> 00:37:58,590 ese estado se cumple para que yo te pueda devolver esa variable o decirte que nada vale eso se tendría 329 00:37:58,590 --> 00:38:06,769 que programar aquí en el get y luego tenemos el set que es para inicializar la variable bueno 330 00:38:06,769 --> 00:38:14,230 cambiar el valor de la variable del atributo verdad porque eso cuando hablamos de clases 331 00:38:14,230 --> 00:38:18,289 no hablamos de variables hablamos de atributos no hablamos de funciones hablamos de métodos 332 00:38:18,289 --> 00:38:26,050 entonces en este caso si queremos cambiar el atributo y que ese cambio sea coherente con la lógica de negocio que estamos siguiendo 333 00:38:26,050 --> 00:38:31,929 tendremos que hacerlo a través de un método que este sí que es público para que se pueda hacer desde fuera de la clase 334 00:38:31,929 --> 00:38:43,530 y que es el setFuerza y en este caso pues fijaros si yo pusiera menos 4 no me inicializaría el atributo fuerza 335 00:38:43,530 --> 00:38:51,889 Lo que haría sería devolverme un mensaje de error, diciéndome que esa variable no puede ser negativa. 336 00:38:52,429 --> 00:38:54,110 Pues esto es lo que se llama encasulación. 337 00:38:56,849 --> 00:39:02,650 Entonces, seguimos con el último concepto que va a ser el de polimorfismo. 338 00:39:04,150 --> 00:39:06,210 ¿Qué pasa con el polimorfismo? 339 00:39:06,210 --> 00:39:25,420 Que, por ponerse un ejemplo, yo aquí quizás no sea tan evidente porque como no tenemos tipado en las variables puede ser un poco más difícil de entender. 340 00:39:26,320 --> 00:39:38,039 Pero imaginad que en vez de ser Python estamos utilizando Java y tenemos que inicializar los objetos con su variable. 341 00:39:38,039 --> 00:39:40,820 No vamos a pensar que estamos utilizando Java. 342 00:39:41,699 --> 00:39:50,050 Entonces, por ejemplo, creamos un vehículo que lo vamos a llamar tipo A. 343 00:39:53,409 --> 00:40:02,710 Hemos dicho que vehículo era una clase de la cual heredaba coche, moto, tren, avión o lo que sea. 344 00:40:02,710 --> 00:40:14,039 no entonces si estamos en java o en temas más lo que vamos a hacer es declarar el tipo de la 345 00:40:14,039 --> 00:40:19,940 variable vale porque son variables tipadas no como en python entonces estamos diciendo que 346 00:40:19,940 --> 00:40:26,539 tenemos un vehículo que es el tipo a y realmente hasta aquí no sabemos qué tipo de vehículo es 347 00:40:26,539 --> 00:40:32,960 verdad pero puede ser cualquiera de los que hereden de vehículo y ese es el polimorfismo 348 00:40:32,960 --> 00:40:41,000 que un objeto vehículo puede tener la forma de un coche de un tren de un avión o de un barco 349 00:40:41,000 --> 00:40:49,179 vale entonces pondríamos coche y ya le pondríamos las variables vale en este caso como estamos en 350 00:40:49,179 --> 00:40:58,280 el país son y no son tipadas pues aquí podríamos poner personaje vale bueno esto no tiene mucho 351 00:40:58,280 --> 00:41:02,639 sentido aquí porque ya es un personaje pero aquí ponemos personaje y lo declaramos como 352 00:41:02,639 --> 00:41:14,619 si fuera un guerrero. ¿Vale? Eso es el polimorfismo. Que dentro de la misma clase, como tiene clases 353 00:41:14,619 --> 00:41:21,719 que heredan de ella, se puede comportar de una forma o de otra. ¿Vale? Con formas polimórficas. 354 00:41:22,559 --> 00:41:31,639 ¿De acuerdo? Entonces, pues bueno, aquí definimos un combate que decimos que mientras que el 355 00:41:31,639 --> 00:41:33,800 jugador 1 y el jugador 2 estén vivos 356 00:41:33,800 --> 00:41:35,880 pues se van dando de leches 357 00:41:35,880 --> 00:41:36,460 atacando 358 00:41:36,460 --> 00:41:39,360 y una vez que uno de los dos muera 359 00:41:39,360 --> 00:41:41,260 pues vemos cual está vivo 360 00:41:41,260 --> 00:41:43,360 y lo ejecutamos 361 00:41:43,360 --> 00:41:45,679 y... ah mira 362 00:41:45,679 --> 00:41:46,300 ahora sí que va 363 00:41:46,300 --> 00:41:49,989 antes no iba 364 00:41:49,989 --> 00:41:54,070 ya 365 00:41:54,070 --> 00:41:57,809 bueno, claro, antes ejecuto 366 00:41:57,809 --> 00:41:58,389 el turno 0 367 00:41:58,389 --> 00:42:01,650 y luego miraría 368 00:42:01,650 --> 00:42:03,530 por detrás del código 369 00:42:03,530 --> 00:42:05,570 vería algún error, la verdad es que 370 00:42:05,730 --> 00:42:12,349 tampoco que te dé muchas claves pero bueno veis que vamos por por turnos no y 371 00:42:14,630 --> 00:42:20,849 estos buenos todos lo podemos obviar aquí creamos un personaje de tipo guerrero con 372 00:42:20,849 --> 00:42:27,230 el polimorfismo aquí tenemos un personaje de tipo mago y como son personajes que ya 373 00:42:27,230 --> 00:42:31,750 están instanciados con su clase correspondiente pues saben que tienen que usar el daño de 374 00:42:31,750 --> 00:42:34,630 correspondiente 375 00:42:34,630 --> 00:42:36,969 a la clase 376 00:42:36,969 --> 00:42:38,170 que le hemos estanciado 377 00:42:38,170 --> 00:42:40,969 y aparte tiene todas estas en común 378 00:42:40,969 --> 00:42:41,909 porque heredan de él 379 00:42:41,909 --> 00:42:43,289 ¿de acuerdo? 380 00:42:44,750 --> 00:42:46,829 así que nada, os dejo ahí 381 00:42:46,829 --> 00:42:49,070 el código como siempre para que juguéis con él 382 00:42:49,070 --> 00:42:50,010 y 383 00:42:50,010 --> 00:42:52,929 ya miraré 384 00:42:52,929 --> 00:42:54,969 la tarea 385 00:42:54,969 --> 00:42:57,090 para que sea interesante y podáis aprender 386 00:42:57,090 --> 00:42:59,150 y os la abriré la semana que viene 387 00:42:59,150 --> 00:43:01,429 y nada, espero que 388 00:43:01,429 --> 00:43:04,269 hayáis entendido un poco lo que es el mundo 389 00:43:04,269 --> 00:43:05,809 de la programación orientada a objetos 390 00:43:05,809 --> 00:43:07,630 que es bastante importante 391 00:43:07,630 --> 00:43:10,309 y me imagino que ya lo habréis visto 392 00:43:10,309 --> 00:43:12,170 en otras asignaturas también 393 00:43:12,170 --> 00:43:13,869 así que os será familiar 394 00:43:13,869 --> 00:43:16,269 lo único, saber aplicarlo aquí en Python 395 00:43:16,269 --> 00:43:16,849 realmente 396 00:43:16,849 --> 00:43:20,230 que veis que es bastante fácil 397 00:43:20,230 --> 00:43:21,489 el constructor con init 398 00:43:21,489 --> 00:43:24,670 luego declarar los métodos 399 00:43:24,670 --> 00:43:26,909 para la herencia 400 00:43:26,909 --> 00:43:28,269 es así, guerrero 401 00:43:28,269 --> 00:43:30,449 entre paréntesis de la clase 402 00:43:30,449 --> 00:43:32,610 padre y luego 403 00:43:32,610 --> 00:43:32,949 cuando 404 00:43:32,949 --> 00:43:36,250 podéis llamar a la clase padre para utilizar 405 00:43:36,250 --> 00:43:38,409 sus métodos y no tener que 406 00:43:38,409 --> 00:43:40,429 estar otra vez de nuevo inicializando 407 00:43:40,429 --> 00:43:42,369 todo esto, como hemos 408 00:43:42,369 --> 00:43:44,289 hecho aquí, como hemos hecho aquí también 409 00:43:44,289 --> 00:43:46,110 y luego pues eso 410 00:43:46,110 --> 00:43:48,349 los conceptos de sobrecarga de 411 00:43:48,349 --> 00:43:49,550 métodos para 412 00:43:49,550 --> 00:43:52,590 pues ir 413 00:43:52,590 --> 00:43:54,329 haciendo las particularidades 414 00:43:54,329 --> 00:43:55,309 que tiene cada clase 415 00:43:55,309 --> 00:43:58,449 ¿de acuerdo? así que nada 416 00:43:58,449 --> 00:44:01,449 Pues muchas gracias por ver el vídeo 417 00:44:01,449 --> 00:44:04,050 Cualquier cosilla ya me decís 418 00:44:04,050 --> 00:44:06,190 Y que paséis buen fin de semana 419 00:44:06,190 --> 00:44:07,070 Adiós