Sobes.tech
Junior

Quelle est la différence entre les mots-clés Abstract et late en Dart?

sobes.tech IA

Réponse de l'IA

Abstract est utilisé pour créer des classes abstraites, qui ne peuvent pas être instanciées directement. Une classe abstraite peut contenir des méthodes implémentées et des méthodes abstraites (sans implémentation). Les méthodes abstraites doivent être implémentées dans les sous-classes non abstraites.

late est utilisé pour l'initialisation différée des variables. Une variable marquée comme late sera garantie d'être initialisée avant sa première utilisation. Si une variable déclarée comme late n'est pas initialisée avant son premier accès, une erreur d'exécution se produira. Cela est utile pour initialiser des variables dont la valeur dépend d'autres variables ou de la logique qui s'exécute après la déclaration.

Propriété Abstract late
Application à Classes Variables
Objectif Définit un contrat, un modèle Initialisation différée
Instanciation Impossible directement Possible
Obligation Implémentations dans les sous-classes (pour méthodes abstraites) Initialisation avant la première utilisation

Exemple d'abstract:

// Définition d'une classe abstraite
abstract class Shape {
  // Méthode abstraite
  double getArea();

  // Méthode implémentée
  void printName() {
    print("Ceci est une figure");
  }
}

// Implémentation de la classe abstraite
class Circle extends Shape {
  double radius;

  Circle(this.radius);

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

// Impossible de créer une instance de Shape:
// var shape = Shape(); // Erreur

Exemple de late:

// Déclaration d'une variable avec initialisation différée
late String name;

void setupName() {
  // Initialisation de la variable avant la première utilisation
  name = "Flutter Developer";
}

void greet() {
  // Première utilisation de la variable name après l'initialisation
  print("Hello, $name!");
}

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

  // Si greet() était appelé avant setupName(), une erreur d'exécution se produirait
  // greet(); // Erreur si name n'a pas été initialisé
}