Jenner Acosta Diaz
Dart Website

Name constructors

Los constructores con nombre, también conocidos como constructores nombrados o constructores de fábrica, son constructores especiales en Dart que tienen un nombre y proporcionan una forma alternativa de crear objetos de una clase. A diferencia del constructor predeterminado que tiene el mismo nombre que la clase, los constructores con nombre permiten definir múltiples formas de construir objetos con diferentes parámetros o configuraciones.

class Rectangulo {
  double ancho;
  double altura;

  Rectangulo(this.ancho, this.altura); // Constructor predeterminado

  Rectangulo.conLongitud(this.ancho) {
    altura = ancho * 2;
  } // Constructor con nombre "conLongitud"

  Rectangulo.conMedidas(this.ancho, this.altura); // Constructor con nombre "conMedidas"
}

void main() {
  Rectangulo rectangulo1 = Rectangulo(5, 10);
  print('Rectángulo 1: ancho ${rectangulo1.ancho}, altura ${rectangulo1.altura}');

  Rectangulo rectangulo2 = Rectangulo.conLongitud(8);
  print('Rectángulo 2: ancho ${rectangulo2.ancho}, altura ${rectangulo2.altura}');

  Rectangulo rectangulo3 = Rectangulo.conMedidas(3, 6);
  print('Rectángulo 3: ancho ${rectangulo3.ancho}, altura ${rectangulo3.altura}');
}

En este ejemplo, la clase Rectangulo tiene tres constructores. El constructor predeterminado utiliza los parámetros ancho y altura para inicializar las propiedades correspondientes.

Los constructores con nombre son Rectangulo.conLongitud y Rectangulo.conMedidas. El constructor Rectangulo.conLongitud toma solo el parámetro ancho y automáticamente calcula la altura multiplicando el ancho por 2. El constructor Rectangulo.conMedidas toma tanto ancho como altura y los asigna directamente a las propiedades correspondientes.

En la función main(), se crean objetos rectangulo1, rectangulo2 y rectangulo3 utilizando diferentes constructores. Cada uno muestra por consola el ancho y la altura correspondientes.

Los constructores con nombre son útiles cuando deseas proporcionar distintas formas de inicializar objetos o cuando deseas dar mayor claridad y flexibilidad a la creación de objetos en tu código.

Ejercicio de la Sesión:

void main() {
  
  final Map<String, dynamic> rawJson = {
    'name': 'TonyStark',
    'power': 'Money',
    'isAlive': false,
  };
  
  final iroman = Hero.fromJson( rawJson );
  
  print( iroman );
  
}

class Hero {
  String name;
  String power;
  bool isAlive;
  
  Hero({
    required this.name,
    required this.power,
    required this.isAlive
  });
  
  Hero.fromJson( Map<String,dynamic> json)
    : name = json['name'] ?? 'No name found',
      power = json['power'] ?? 'No power found',
      isAlive = json['isAlive'] ?? 'No isAlive found';
  
  @override
  String toString() {
    return '$name, $power, isAlive: ${ isAlive ? 'YES!' : 'Nope'}';
  }
}