Repaso - Calculadora de figuras
Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 49 de 110.
Desafío
FácilVamos a construir un sistema de calculadora de formas que combine clases abstractas e interfaces para crear un kit de herramientas de geometría flexible. Diseñarás una jerarquía de clases donde diferentes formas comparten un comportamiento común a través de la abstracción, mientras que cada forma proporciona sus propios cálculos únicos.
Organizarás tu código en tres archivos:
shape.dart: Define tu clase base abstracta e interfaz aquí:- Una clase abstracta
Shapecon una propiedadString namey un constructor. Incluye los métodos abstractosdouble calculateArea()ydouble calculatePerimeter(). Añade un método regulardescribe()que imprima'$name - Area: ${calculateArea()}, Perimeter: ${calculatePerimeter()}' - Una clase
Drawablecon un métododraw()que imprima'Drawing shape...'
- Una clase abstracta
shapes.dart: Importashape.darty crea tus clases de formas concretas:- Una clase
Rectangleque extiendaShapee implementeDrawable. Añade las propiedadesdouble widthydouble height. Calcula el área comowidth * heighty el perímetro como2 * (width + height). El métododraw()debe imprimir'Drawing rectangle ${width}x$height' - Una clase
Circleque extiendaShapee implementeDrawable. Añade una propiedaddouble radius. Usa3.14159para pi. Calcula el área comopi * radius * radiusy el perímetro (circunferencia) como2 * pi * radius. El métododraw()debe imprimir'Drawing circle with radius $radius'
- Una clase
main.dart: Importashapes.darty demuestra tu calculadora de formas:- Crea un
Rectanglellamado'Rectangle'con un ancho de5.0y una altura de3.0 - Crea un
Circlellamado'Circle'con un radio de4.0 - Para cada forma, llama a
draw()y luego adescribe() - Imprime una línea vacía entre las dos formas
- Crea un
Este desafío demuestra cómo las clases abstractas definen una estructura compartida (cada forma tiene cálculos de área y perímetro), mientras que las interfaces añaden capacidades adicionales (formas que se pueden dibujar). Cada clase concreta extiende la clase abstracta para su identidad principal e implementa la interfaz para funcionalidad extra.
Salida esperada:
Drawing rectangle 5.0x3.0
Rectangle - Area: 15.0, Perimeter: 16.0
Drawing circle with radius 4.0
Circle - Area: 50.26544, Perimeter: 25.13272Pruébalo tú mismo
import 'shapes.dart';
void main() {
// TODO: Crea un Rectangle llamado 'Rectangle' con un ancho de 5.0 y una altura de 3.0
// TODO: Crea un Circle llamado 'Circle' con un radio de 4.0
// TODO: Para el rectángulo, llama a draw() y luego a describe()
// TODO: Imprime una línea vacía
// TODO: Para el círculo, llama a draw() y luego a describe()
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de POO
Archivos externosLibrerías e importacionesIntroducción a la POOClases vs. ObjetosLa palabra clave thisMétodosVariables de instanciaConceptos básicos de constructoresResumen - Calculadora sencilla4Seguridad de nulos
Introducción a la seguridad de nulosNulables vs No nulablesLos operadores ? y !Palabra clave Late y Null SafetyOperadores Null-awareNull Safety en clasesResumen - Sistema de perfil de usuario7Clases abstractas e interfaces
Clases abstractasMétodos abstractosInterfaces en DartInterfaces implícitasImplementar vs. ExtenderInterfaces múltiplesRepaso - Calculadora de figuras10Colecciones y Genéricos
Visión general de List, Set y MapColecciones con seguridad de tiposClases genéricasMétodos genéricosRestricciones genéricasIterable e IteratorResumen - Almacenamiento genérico2Constructores en Dart
Constructor por defectoConstructores nombradosListas de inicializaciónConstructores constantesConstructores de fábricaConstructores de redireccionamientoResumen - Constructor de formas5Encapsulamiento
Miembros públicos vs. privadosLa convención del prefijo _Privacidad a nivel de libreríaProfundidad en Getters y SettersOcultamiento de informaciónResumen - Registros de estudiantes8Mixins
Introducción a los MixinsCreación de MixinsUso de múltiples MixinsPalabra clave on en MixinsMixin vs HerenciaMixin vs InterfazResumen - Sistema Animal11Métodos especiales
Sobrescritura de toString()Sobrescritura de hashCode y ==Interfaz ComparableMétodo call()Sobrescritura de noSuchMethodResumen - Colección personalizada14Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy3Propiedades de clase
Miembros de instancia vs. estáticosCampos Final y ConstVariables LateMétodos y campos estáticosGetters y SettersResumen - Gestor de cuentas bancarias6Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosLa anotación @overrideLa palabra clave final en clasesConstructores y herenciaResumen - Jerarquía de empleados9Polimorfismo
Fundamentos del polimorfismoPolimorfismo mediante interfacesComprobación de tipos en tiempo de ejecuciónLos operadores is y asPalabra clave covariantResumen - Procesador de pagos12POO Asíncrona
Futures y async/awaitFundamentos de StreamsStream ControllersConstructores asíncronosAsincronía en métodos de claseRepaso - Data Fetcher15Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository