Sobes.tech
Junior

¿Cuál es la diferencia entre las palabras clave Abstract y late en Dart?

sobes.tech AI

Respuesta de la IA

Abstract se utiliza para crear clases abstractas, que no se pueden instanciar directamente. Una clase abstracta puede contener métodos implementados y métodos abstractos (sin implementación). Los métodos abstractos deben ser implementados en las subclases no abstractas.

late se usa para la inicialización diferida de variables. Una variable marcada como late estará garantizado que será inicializada antes de su primer uso. Si una variable declarada como late no se inicializa antes de su primer acceso, se producirá un error en tiempo de ejecución. Esto es útil para inicializar variables cuyo valor depende de otras variables o lógica que se ejecuta después de la declaración.

Propiedad Abstract late
Aplicación a Clases Variables
Propósito Define un contrato, plantilla Inicialización diferida
Instanciación No es posible directamente Es posible
Obligatorio Implementaciones en subclases (para métodos abstractos) Inicialización antes del primer uso

Ejemplo de abstract:

// Definición de clase abstracta
abstract class Shape {
  // Método abstracto
  double getArea();

  // Método implementado
  void printName() {
    print("Esta es una figura");
  }
}

// Implementación de la clase abstracta
class Circle extends Shape {
  double radius;

  Circle(this.radius);

  @override
  double getArea() {
    return 3.14 * radius * radius;
  }
}

// No se puede crear una instancia de Shape:
// var shape = Shape(); // Error

Ejemplo de late:

// Declaración de variable con inicialización diferida
late String name;

void setupName() {
  // Inicialización de la variable antes del primer uso
  name = "Flutter Developer";
}

void greet() {
  // Primer uso de la variable name después de la inicialización
  print("Hello, $name!");
}

void main() {
  setupName();
  greet(); // Mostrará "Hello, Flutter Developer!"

  // Si se llamara a greet() antes de setupName(), ocurriría un error en tiempo de ejecución
  // greet(); // Error si name no fue inicializado
}