Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Semana 6: Dart Avanzado (ii) Facultad de Ingeniería de Sistema e Informática LENGUAJE DE PROGRAMACIÓN V Ing. Angel Marthans Ruiz, Mg. Objetivos: Al finalizar, el alumno logrará: Conocer los conceptos fundamentales de la Herencia en Dart. Conocer los conceptos de Clases Abstractas en Dart. Conocer los conceptos de Interfaces en Dart. Conocer los conceptos de Mixins en Dart. 2 Temas: Herencia Clases Abstractas Interfaces Mixins 3 Herencia 4 En muchas situaciones, necesitarás crear una jerarquía de clases que compartan alguna funcionalidad base. Puedes crear tus propias jerarquías extendiendo clases. Esto también se llama herencia porque las clases forman un árbol en el que las clases hijas heredan de las clases padres. Las clases padre e hija también se llaman superclases y subclases respectivamente. La clase Object es la superclase superior para todos los tipos no nulables en Dart. Todas las demás clases, excepto Null , son subclases de Object. Herencia 5 Herencia 6 Crear una SubClase Para ver cómo funciona la herencia, crearás tu propia jerarquía de clases. Crearás una clase Student que necesita calificaciones (Grade), así que primero crea un enum Grade. Luego crearas una clase Person y otra clase Student. Herencia 7 Naturalmente, las clases Person y Student son muy similares, ya que los alumnos son en realidad personas. La única diferencia por el momento es que un Student tendrá una lista de calificaciones (grades). Herencia 8 Se puede eliminar la duplicación entre Student y Person haciendo que Student extienda a Person. Esto se hace añadiendo extends Person después del nombre de la clase y eliminando todo excepto el constructor Student y la lista de calificaciones. Herencia 9 Los nombres de los parámetros del constructor ya no hacen referencia a this. Siempre que veas la palabra clave this, debes recordar que this se refiere al objeto actual, que en este caso sería una instancia de la clase Student. Dado que Student ya no contiene los nombres de campo givenName y surname , usar this.givenName o this.surname no tendría nada a lo que hacer referencia. A diferencia de this , la palabra clave super se utiliza para referirse un nivel por encima de la jerarquía, utilizando super(givenName, surname) pasa los parámetros del constructor a otro constructor. Sin embargo, como estás usando super en lugar de this , estás reenviando los parámetros al constructor de la clase padre, es decir, al constructor de Person. Herencia 1 0 En lugar de reenviar manualmente los parámetros del constructor a la superclase, puede utilizar super más el nombre del parámetro directamente. Así, la clase Student quedaría modificada por la siguiente forma simplificada: Herencia 1 1 Jerarquía Multi-Nivel Herencia 1 2 Clases Abstractas 1 3 Las clases y subclases que creaste anteriormente eran clases concretas. Esto significa que puedes crear objetos a partir de ellas. Esto contrasta con las clases abstractas, a partir de las cuales no se pueden crear objetos. Después de hacer muchas clases concretas, empiezas a notar patrones y características más generalizadas de las clases que estás escribiendo. Así que cuando llegas al punto de querer describir las características generales y el comportamiento de una clase sin especificar la forma exacta en que se implementa, estás listo para escribir clases abstractas. Clases Abstractas 1 4 • La forma de definir una clase abstracta en Dart es anteponer la palabra clave abstract a class. • Además de que la clase en sí es abstracta, Animal también tiene dos métodos abstractos: eat y move . Se sabe que son abstractos porque no tienen llaves; simplemente terminan con un punto y coma. • Estos métodos abstractos describen el comportamiento que una subclase debe implementar. Sin embargo, no dicen cómo implementar ese comportamiento. Eso depende de la subclase, lo cual es bueno. • El hecho de que una clase sea abstracta no significa que no pueda tener métodos o datos concretos. Puedes ver que Animal tiene un campo isAlive concreto, con un valor por defecto de true . Animal también tiene una implementación concreta del método toString, que pertenece a la superclase Object. La propiedad runtimeType también proviene de Object y proporciona el tipo de objeto en tiempo de ejecución. Interfaces 1 5 Las interfaces son similares a las clases abstractas en el sentido de que permiten definir el comportamiento que se espera de todas las clases que implementan la interfaz. Son un medio de ocultar los detalles de implementación de las clases concretas del resto de tu código. ¿Por qué es importante? Para responder a esta pregunta es útil entender un poco de arquitectura de software. Arquitectura de Software A la hora de crear una aplicación, el objetivo debe ser mantener la lógica empresarial principal separada de la infraestructura, como la interfaz de usuario, la base de datos, la red y los paquetes de terceros. ¿Por qué? La lógica empresarial central no cambia con frecuencia, mientras que la infraestructura sí lo hace a menudo. Interfaces 1 6 Nota: La lógica de negocio, que a veces se denomina reglas de negocio o lógica de dominio, se refiere a la esencia de lo que hace tu aplicación. La lógica de negocio de una aplicación de calculadora serían los propios cálculos matemáticos. Esos cálculos no dependen del aspecto de tu interfaz de usuario ni de cómo almacenes las respuestas. La siguiente imagen muestra una aplicación idealizada con la lógica empresarial estable en el centro y las partes más volátiles de la infraestructura a su alrededor: Interfaces 1 7 La interfaz de usuario no debería comunicarse directamente con la web. Tampoco deberías dispersar las llamadas directas a la base de datos a través de su aplicación. Todo pasa a través de la lógica de negocio central. En Además de eso, la lógica de negocio no debería conocer ningún detalle de implementación sobre la infraestructura. Esto le da una arquitectura de estilo plug-in, donde se puede cambiar un marco de base de datos por otro y el resto de la aplicación ni siquiera sabrá que algo cambió. Puedes sustituir su interfaz de usuario móvil con una interfaz de usuario de escritorio, y el resto de la aplicación no le importaría. Esto es útil para construir aplicaciones escalables, mantenibles y comprobables. Interfaces 1 8 Reglas de comunicación Aquí es donde entran en juego las interfaces. Una interfaz es una descripción de cómo se gestionará la comunicación entre dos partes. Un número de teléfono es un tipo de interfaz. Si quieres llamar a tu amigo, tienes que marcar su número de teléfono. Marcar un número diferente no funcionará. Otra palabra para interfaz es protocolo, como el Protocolo de Internet (IP) o el Protocolo de Transferencia de Hipertexto (HTTP). Estos protocolos son las reglas que rigen la comunicación entre los usuarios del protocolo. Interfaces 1 9 Cuando creas una interfaz en Dart, defines las reglas de cómo una parte de tu código base se comunicará con otra parte. Mientras ambas partes sigan las reglas de la interfaz, cada parte puede cambiar independientemente de la otra. Esto hace que tu aplicación sea mucho más manejable. En entornos de equipo, las interfaces también permiten a diferentes personas trabajar en diferentes partes del código base sin preocuparse de que van a estropear el código de otra persona. Interfaces 2 0 Separando la Lógica de Negocio de la Infraestructura En la imagen de abajo, se puede ver la interfaz es entre la lógica de negocio y el código para acceder a la base de datos. La lógica de negocio no sabe nada de la base de datos. Sólo habla con la interfaz. Eso significa que incluso podrías cambiar la base de datos por una forma completamente diferente de almacenamiento, como almacenamiento en la nube o almacenamiento de archivos. A la lógica de negocio no le importa. Interfaces 2 1 Implementar una Interface en Dart No haypalabra clave de interfaz en Dart. En su lugar, puedes usar cualquier clase como interfaz. Dado que sólo los nombres de campo y método son importantes, la mayoría de las interfaces están hechas de clases abstractas que no contienen lógica. Mixins 2 2 Los Mixins son una característica interesante de Dart con la que puede que no estés familiarizado, incluso si conoces otros lenguajes de programación. Son una forma de reutilizar métodos o variables entre clases que de otro modo no estarían relacionadas. Para hacer un mixin, tomas el código concreto que quieras compartir con diferentes clases, y lo empaquetas en su propia clase mixin especial. Mixins 2 3 Referencias: https://dart.dev/language/extend https://dart.dev/language/extension-methods https://dart.dev/language/mixins 2 4 https://dart.dev/language/extend https://dart.dev/language/extension-methods https://dart.dev/language/mixins La manera de empezar es dejar de hablar y comenzar a actuar. Walt Disney 2 5 �����Semana 6: Dart Avanzado (ii) Objetivos: �Al finalizar, el alumno logrará: Temas: Herencia Herencia Herencia Herencia Herencia Herencia Herencia Herencia Herencia Clases Abstractas Clases Abstractas Interfaces Interfaces Interfaces Interfaces Interfaces Interfaces Interfaces Mixins Mixins Referencias: La manera de empezar es dejar de hablar y comenzar a actuar.
Compartir