Menu
CoddyTech

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 aussi avoir leurs propres paramètres de type. C’est utile lorsque tu as besoin d’une méthode flexible sans rendre toute la classe 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);    // bonjour
}

Dart peut souvent déduire le type à partir des arguments, donc tu n'as pas toujours besoin de le préciser explicitement :

var result = findFirst([10, 20, 30]);  // Dart déduit le type int

Les méthodes génériques sont particulièrement utiles dans les classes lorsque seules certaines opérations doivent offrir 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 de la sécurité des types au niveau des méthodes, tout en simplifiant vos classes et en bénéficiant de la vérification des types à la compilation.

challenge icon

Défi

Facile

Construisons un utilitaire de transformation de données qui met en évidence la puissance des méthodes génériques. Tu vas créer une classe Transformer avec des méthodes capables de fonctionner avec n’importe quel type, pour plus de flexibilité sans rendre toute la classe générique.

Tu vas organiser ton code en deux fichiers :

  • transformer.dart : crée une classe Transformer avec les méthodes génériques suivantes :
    • T getFirst<T>(List<T> items) - renvoie le premier élément d’une liste
    • T getLast<T>(List<T> items) - renvoie 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 indiqué
    • void printPair<A, B>(A first, B second) - affiche deux valeurs au format Pair: [first] and [second]
  • main.dart : importe ton fichier transformer et présente chaque méthode générique avec différents types :
    • Crée une instance de Transformer
    • Utilise getFirst sur [10, 20, 30] et affiche le résultat
    • Utilise getFirst sur ['apple', 'banana', 'cherry'] et affiche le résultat
    • Utilise getLast sur [1.5, 2.5, 3.5] et affiche le résultat
    • Utilise repeat pour créer une liste de 'Hi' répété 4 fois et affiche le résultat
    • Utilise repeat pour créer une liste de 7 répété 3 fois et affiche le résultat
    • Utilise printPair avec 'Name' et 42
    • Utilise printPair avec 100 et true

Remarque que chaque méthode déclare son ou ses propres paramètres de type, ce qui permet au même objet Transformer de fonctionner avec des entiers, des chaînes de caractères, des nombres à virgule flottante et des booléens, tout en assurant la sécurité des types. La méthode printPair montre comment utiliser deux paramètres de type dans une même méthode.

Résultat attendu :

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

Essayez vous-même

import 'transformer.dart';

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

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

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

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

  // TODO: Utilisez repeat pour créer une liste contenant 'Hi' répété 4 fois et affichez-la

  // TODO: Utilisez repeat pour créer une liste contenant 7 répété 3 fois et affichez-la

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

  // TODO: Utilisez 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

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