Menu
Coddy logo textTech

Méthodes génériques

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 66 sur 110.

Tout comme les classes peuvent être génériques, les méthodes individuelles peuvent également avoir leurs propres paramètres de type. Ceci est utile lorsque vous avez besoin d'une méthode flexible sans rendre la classe entière générique.

Une méthode générique déclare son paramètre de type avant le type de retour :

T findFirst<T>(List<T> items) {
  return items.first;
}

void main() {
  var firstNumber = findFirst<int>([1, 2, 3]);
  var firstWord = findFirst<String>(['hello', 'world']);
  
  print(firstNumber);  // 1
  print(firstWord);    // hello
}

Dart peut souvent inférer le type à partir des arguments, vous n'avez donc pas toujours besoin de le spécifier explicitement :

var result = findFirst([10, 20, 30]);  // Dart infère int

Les méthodes génériques sont particulièrement utiles à l'intérieur des classes lorsque seules certaines opérations nécessitent une flexibilité de type :

class Printer {
  void printItem<T>(T item) {
    print('Printing: $item');
  }
  
  List<T> duplicate<T>(T item, int count) {
    return List.filled(count, item);
  }
}

void main() {
  var printer = Printer();
  printer.printItem<String>('Hello');
  printer.printItem(42);  // Type inféré comme int
  
  var copies = printer.duplicate('Hi', 3);
  print(copies);  // [Hi, Hi, Hi]
}

Les méthodes génériques vous offrent un contrôle précis sur la sécurité des types au niveau de la méthode, ce qui permet de garder vos classes plus simples tout en bénéficiant du contrôle de type à la compilation.

challenge icon

Défi

Facile

Construisons un utilitaire de transformation de données qui illustre la puissance des méthodes génériques. Vous allez créer une classe Transformer avec des méthodes capables de fonctionner avec n'importe quel type, ce qui vous offre de la flexibilité sans rendre toute la classe générique.

Vous organiserez votre code en deux fichiers :

  • transformer.dart : Créez une classe Transformer avec ces méthodes génériques :
    • T getFirst<T>(List<T> items) - retourne le premier élément d'une liste
    • T getLast<T>(List<T> items) - retourne le dernier élément d'une liste
    • List<T> repeat<T>(T item, int times) - crée une liste contenant l'élément répété le nombre de fois spécifié
    • void printPair<A, B>(A first, B second) - affiche deux valeurs au format Pair: [first] and [second]
  • main.dart : Importez votre fichier transformer et faites une démonstration de chaque méthode générique avec différents types :
    • Créez une instance de Transformer
    • Utilisez getFirst sur [10, 20, 30] et affichez le résultat
    • Utilisez getFirst sur ['apple', 'banana', 'cherry'] et affichez le résultat
    • Utilisez getLast sur [1.5, 2.5, 3.5] et affichez le résultat
    • Utilisez repeat pour créer une liste de 'Hi' répétée 4 fois et affichez le résultat
    • Utilisez repeat pour créer une liste de 7 répétée 3 fois et affichez le résultat
    • Utilisez printPair avec 'Name' et 42
    • Utilisez printPair avec 100 et true

Remarquez comment chaque méthode déclare son ou ses propres paramètres de type, permettant au même objet Transformer de fonctionner avec des entiers, des chaînes de caractères, des doubles et des booléens - le tout avec une sécurité de type complète. La méthode printPair démontre l'utilisation de deux paramètres de type dans une seule méthode.

Sortie attendue :

10
apple
3.5
[Hi, Hi, Hi, Hi]
[7, 7, 7]
Pair: Name and 42
Pair: 100 and true

Aide-mémoire

Les méthodes génériques déclarent des paramètres de type avant le type de retour, ce qui permet à des méthodes individuelles d'être flexibles sans rendre la classe entière générique :

T findFirst<T>(List<T> items) {
  return items.first;
}

Dart peut inférer le type à partir des arguments, la spécification explicite du type est donc facultative :

var result = findFirst([10, 20, 30]);  // Dart infers int

Les méthodes génériques peuvent être utilisées à l'intérieur de classes non génériques :

class Printer {
  void printItem<T>(T item) {
    print('Printing: $item');
  }
  
  List<T> duplicate<T>(T item, int count) {
    return List.filled(count, item);
  }
}

Les méthodes peuvent déclarer plusieurs paramètres de type :

void printPair<A, B>(A first, B second) {
  print('Pair: $first and $second');
}

Essayez vous-même

import 'transformer.dart';

void main() {
  // Créer une instance de Transformer
  var transformer = Transformer();

  // TODO: Utiliser getFirst sur [10, 20, 30] et afficher le résultat

  // TODO: Utiliser getFirst sur ['apple', 'banana', 'cherry'] et afficher le résultat

  // TODO: Utiliser getLast sur [1.5, 2.5, 3.5] et afficher le résultat

  // TODO: Utiliser repeat pour créer une liste de 'Hi' répété 4 fois et l'afficher

  // TODO: Utiliser repeat pour créer une liste de 7 répété 3 fois et l'afficher

  // TODO: Utiliser printPair avec 'Name' et 42

  // TODO: Utiliser printPair avec 100 et true
}
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