Menu
Coddy logo textTech

Méthodes d’extension

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 83 sur 110.

Parfois, vous souhaitez ajouter des fonctionnalités à une classe que vous ne possédez pas - comme les types intégrés String ou int de Dart. Vous ne pouvez pas modifier leur code source, et l'héritage n'est d'aucune aide avec les classes finales. C'est là qu'interviennent les méthodes d'extension.

Les extensions vous permettent d’ajouter de nouvelles méthodes aux types existants sans les modifier ni créer de sous-classes :

extension StringExtras on String {
  String reverse() {
    return split('').reversed.join('');
  }
  
  bool get isPalindrome {
    var cleaned = toLowerCase().replaceAll(' ', '');
    return cleaned == cleaned.split('').reversed.join('');
  }
}

void main() {
  print('hello'.reverse());        // olleh
  print('radar'.isPalindrome);     // true
}

La syntaxe est extension ExtensionName on Type. À l'intérieur, vous définissez des méthodes et des getters tout comme dans une classe ordinaire. Une fois définies, ces méthodes apparaissent sur toutes les instances de ce type comme si elles étaient intégrées.

Les extensions fonctionnent sur n’importe quel type, y compris vos propres classes et les types génériques :

extension IntExtras on int {
  int squared() => this * this;
}

extension ListExtras<T> on List<T> {
  T? get secondOrNull => length >= 2 ? this[1] : null;
}

void main() {
  print(5.squared());                    // 25
  print([1, 2, 3].secondOrNull);         // 2
}

Notez qu’au sein d’une extension, this fait référence à l’instance sur laquelle la méthode est appelée. Les extensions sont un moyen propre d’améliorer les types existants tout en gardant votre code organisé et lisible.

challenge icon

Défi

Facile

Améliorons les types intégrés de Dart avec des fonctionnalités utiles grâce aux méthodes d’extension ! Vous allez créer des extensions qui ajoutent des méthodes pratiques aux types String et List, puis les utiliser dans votre fichier principal.

Vous allez organiser votre code en deux fichiers :

  • extensions.dart : créez deux extensions qui ajoutent de nouvelles fonctionnalités aux types existants :
    • Une extension appelée StringUtils sur String avec :
      • Une méthode countVowels() qui renvoie le nombre de voyelles (a, e, i, o, u - sans tenir compte de la casse) dans la chaîne
      • Un getter initials qui renvoie la première lettre de chaque mot (séparé par des espaces), réunies et converties en majuscules. Par exemple, "hello world" devient "HW"
    • Une extension appelée ListUtils<T> sur List<T> avec :
      • Une méthode safeGet(int index) qui renvoie l’élément à l’index indiqué s’il existe, ou null si l’index est hors limites
      • Un getter hasMultiple qui renvoie true si la liste contient plus d’un élément
  • main.dart : importez vos extensions et montrez-les en action :
    • Créez une chaîne "Object Oriented Programming" et affichez son nombre de voyelles au format : Vowels: [count]
    • Affichez les initiales de la même chaîne au format : Initials: [initials]
    • Créez une liste d’entiers [10, 20, 30]
    • Affichez le résultat de safeGet(1) au format : Element at 1: [value]
    • Affichez le résultat de safeGet(5) au format : Element at 5: [value]
    • Affichez si la liste contient plusieurs éléments au format : Has multiple: [true/false]

Souvenez-vous qu’à l’intérieur d’une extension, this fait référence à l’instance sur laquelle la méthode est appelée. Vos extensions donneront à ces types l’impression que ces méthodes sont intégrées !

Résultat attendu :

Vowels: 9
Initials: OOP
Element at 1: 20
Element at 5: null
Has multiple: true

Essayez vous-même

import 'extensions.dart';

void main() {
  // Créer la chaîne de caractères
  String text = "Object Oriented Programming";

  // TODO: Afficher le nombre de voyelles en utilisant countVowels()
  // Format : Vowels: [count]

  // TODO: Afficher les initiales en utilisant le getter initials
  // Format : Initials: [initials]

  // Créer la liste d'entiers
  List<int> numbers = [10, 20, 30];

  // TODO: Afficher le résultat de safeGet(1)
  // Format : Element at 1: [value]

  // TODO: Afficher le résultat de safeGet(5)
  // Format : Element at 5: [value]

  // TODO: Afficher si la liste contient plusieurs éléments
  // Format : Has multiple: [true/false]
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Dart en ligne