[MÚSICA] Bien, estoy en mi ejercicio donde veremos ahora en práctica las interfaces. Recuerdas este código, fue lo que vimos en la sesión anterior cuando estuvimos platicando sobre herencia, ahora, tengo este nuevo proyecto que le he nombrado interfaces, y he puesto todas las clases anteriores calcetín, jeans, playera, principal, ropa, etcétera. Ahora, según lo que platicamos hace un momento en la sesión es que podemos definir o podemos detectar más bien, cómo un producto o algunos productos se puede realizar alguna devolución. Por ejemplo, imagínate que tenemos una nueva clase, una nueva clase que podemos colocarle playera personalizada. En esta tienda lo que nosotros hacemos en esta tienda, lo que se hace es que a una playera personalizada tú escoges la talla, el color, etcétera, y le agregan tu cuenta de Twitter, en la parte de atrás le agregan tu cuenta de Twitter o le agregan un texto que tú quieres que lleve, pero en general le agregarán tu cuenta de Twitter. Entonces, esta playera personalizada podría heredar también de mi clase ropa, porque también tendrá el mismo comportamiento. Pero, adicional voy a colocar aquí el constructor que me está solicitando pero adicional esta playera personalizada tiene pues la cuenta de Twitter como atributo, el Twitter que se colocará en la parte trasera de la playera, le colocaré string Twitter y voy a generar también el getter y setter de esa variable. Vamos a darle okey, aquí y listo, you hemos generado el Twitter. Bien, puedo colocar aquí también que para que esta playera sea creada una playera personalizada necesitaremos que pasen una cuenta de Twitter, y esa cuenta de Twitter se estará pasando a nuestra variable general, nuestra variable global que está más arriba. Perfecto. Listo. you tenemos esta clase, you está lista, you está definida y podemos decir que si es una playera cualquier playera, sí aceptamos devolución. Si son unos jeans, sí aceptamos devolución, si es un calcetín sí aceptamos devolución, pero si es una playera personalizada no aceptamos devoluciones. Ahora, recuerdas que teníamos una familia pendiente, que es nuestra familia teléfono, nuestra clase teléfono que aquí tiene también como atributos un ID, tiene también un precio, ajá, tiene también como atributos una marca, y tiene como atributos un modelo. Bien, ahora vamos a generar getters y setters, clic derecho source generar getters y setters, seleccionamos todo, aquí you está y también colocaremos un constructor para este teléfono. Vamos a poner teléfono constructor y le diremos que nos solicite un ID, nos solicite un precio, y nos solicite una marca, una marca, el modelo no es obligatorio. Sin embargo, para este ejercicio lo colocaremos modelo, entonces ponemos nuestros this para ID, le pasamos el ID, this para precio, le pasamos el precio, this para marca, le pasamos la marca, this para modelo, le pasamos el modelo. you está. Listo. you tengo, ahora faltan mis clases hijas de teléfono. Que es smartphone, smartphone, smartphone y teléfono de hogar, una nueva clase, teléfono de hogar. Ahí está teléfono de hogar. Ahora en smartphone vamos a aplicar la herencia del teléfono y colocaremos una variable adicional donde pues un smartphone puede tener un tipo de SIM, un tipo de tarjeta SIM. Bien, vamos a ponerle su constructor que nos está pidiendo, vamos a generar getters y setters y también el constructor que nos está solicitando un constructor y además generamos un string SIM. you está. Ahora por aquí se lo ponemos al SIM. you está. Muy bien. Ahora, nos falta el teléfono de hogar. Teléfono de hogar tendrá una variable adicional, que esto será una variable booleana donde preguntaremos que si es alámbrico, si el teléfono es alámbrico la variable booleana será verdadera, si no es alámbrico la variable booleana será falsa. Voy a colocar aquí extends teléfono y ahora necesitamos el número constructor para esto y asignamos boolean alámbrico. Vamos aquí this alámbrico, tal como lo estamos manejando, sale. No hay nada adicional. Listo. you tenemos nuestras dos familias, tenemos la familia de teléfono y tenemos la familia de ropa. Recuerdas que hicimos nuestra playera personalizada, hemos detectado que en la familia de ropa, todas las prendas de ropa a excepción de playera personalizada, todas pueden ser devueltas. Por lo tanto, yo puedo crear un método a hacer devolución, pero no lo debe tener playera personalizada. Lo mismo para los teléfonos, todos los teléfonos pueden ser en algún momento dado también devueltos. Ahora para crear mi interfaz, y definir este método hacer devolución voy a dar clic derecho new y ahora, en vez de crear una clase, crearé una interface, una interface. Colocaré el nombre de la interface, comúnmente colocamos anteponiendo anteponemos la i donde indicamos que es una interfaz, y puede llamarse devolución. Listo, you tenemos nuestra inter y lo único que debe tener definida la interfaz son los métodos, la definición del método. Public void hacer devolución donde dependiendo de cada prenda o de cada producto, será la implementación que le demos a esa devolución. Por ejemplo a lo mejor la ropa, los calcetines o no se algún producto debe tener ciertas características para ser devuelto, no se, un teléfono también debe cumplir con ciertas características que son distintas a la de una prenda de ropa para ejecutar una devolución. Yo puedo implementar la interfaz devolución en cada clase, comenzando por playera. Puedo poner extends ropa implements, y devolución. ¿Y qué pasa? Me está solicitando que implemente los métodos. Cuando yo defino un método de una interfaz, no debe tener ni una sola línea de código. Por lo tanto cuando implemento esta interfaz en una clase es obligatorio sobreescribir el método. Es obligatorio traerlo para colocarle funcionalidad. Yo puedo poner devolución de una playera. Y así mismo puedo estar implementando esta interfaz en todas mis prendas, sin afectar a la prenda que no tiene que ser devuelta. Pueden implementarlo, implementamos el método y devolución de jeans. Me faltan los calcetines, puedo poner implements y devolución y también los implemento. Aquí ponemos devolución de calcetines. Ahora me paso a la otra familia, a los teléfonos. you viste cómo puedo implementar las interfaces en diferentes familias. Esta es la clave de las interfaces, vamos a implementar el método hacer devolución de un smart phone y por último el teléfono de hogar. Implements y devolución, el teléfono del hogar. Implementamos el método y le colocamos un comportamiento, teléfono del hogar. Listo, ahora en mi clase principal puedo probar todas estas implementaciones. Voy a crear ahora una playera, pero una playera personalizada. Playera personalizada y debe tener una ID y le vamos a poner 4. El costo de esta playera es más cara. Una talla, le podemos poner M. Un color, puede ser el color negro. Y la cuenta de Twitter que debe de llevar esa playera, vamos a poner arroba anncode punto y coma. De la misma forma que con la otra playera, puedo llamar a su método mostrar datos. Mostrar datos y le pondremos playera de, y también si en un momento yo quiero devolver cualquier producto puedo poner playera punto hacer devolución. Puedo ejecutar una devolución de playera, puedo ejecutar una devolución de jeans. Pero no puedo hacer una devolución de playera personalizada. De la misma forma si yo declaro un smart phone. [AUDIO EN BLANCO] Puedo colocarle su ID, su precio, su marca, su modelo, tiene i, y tiene una tarjeta SIM. Podemos poner que sea de alguna telefónica, así se llama la telefónica, por no decir alguna marca de telefónica, de compañía telefónica. Y en el smart phone puedo también aquí devolverlo, y lo mismo sucederá si quiero devolver un teléfono. Entonces para eso me funcionan las interfaces, cuando yo corro esto puedo ejecutar una devolución de una playera, una devolución de jeans y una devolución de smart phones, pero no me permite hacer una devolución de una playera personalizada. De esta forma puedo ocupar las interfaces para sobreescribir métodos en diferentes niveles de la jerarquía. [MÚSICA] [MÚSICA]