Chaînage de constructeurs en C#

Fil Zjazel Romaeus Villegas 12 octobre 2023
  1. Qu’est-ce qu’un constructeur ?
  2. Qu’est-ce que la surcharge du constructeur ?
  3. Qu’est-ce que le chaînage de constructeur ?
  4. Exemple de chaînage de constructeur
Chaînage de constructeurs en C#

Ce didacticiel vous montrera comment effectuer un chaînage de constructeurs en C#. Pour comprendre le chaînage de constructeurs, vous devez d’abord connaître les concepts suivants.

Qu’est-ce qu’un constructeur ?

Un constructeur est une méthode dans une classe qui est automatiquement exécutée lorsqu’un objet est créé. Le constructeur peut être laissé vide ou peut également contenir diverses instructions et étapes qui seront suivies lors de la création d’une nouvelle instance.

Considérez cet exemple de classe ci-dessous. Le constructeur de cette classe définira automatiquement les valeurs de ses variables comme détaillé ci-dessous lors de l’initialisation. Si vous laissez le constructeur vide, toutes les variables de classe seront à la place null par défaut.

class Tutorial_Class {
  public string name;
  public DateTime created_date;
  public List<string> topics;
  public string description;
  public bool draft;

  public Tutorial_Class() {
    // This is the constructor method
    this.name = "Tutorial Draft";
    this.created_date = DateTime.Now;
    this.topics = new List<string>();
    this.description = "Tutorial Description";
    this.draft = false;
  }
}

Qu’est-ce que la surcharge du constructeur ?

La surcharge de constructeur vous permet d’appeler un constructeur différent en fonction des paramètres d’entrée que vous avez fournis lors de la création d’une nouvelle instance de la classe. Pour chaque scénario de paramètre accepté, vous devez définir le constructeur à utiliser. Vous pouvez avoir autant de surcharges de constructeur que vous le souhaitez.

Nous avons ajouté une autre fonction constructeur qui accepte une entrée de chaîne unique dans l’exemple ci-dessous. Si une entrée est fournie, il définira la variable de nom sur celle de la valeur d’entrée.

class Tutorial_Class {
  public string name;
  public DateTime created_date;
  public List<string> topics;
  public string description;
  public bool draft;

  public Tutorial_Class() {
    // This is the initial constructor method and will be used if no parameter is passed
    this.name = "Tutorial Draft";
    this.created_date = DateTime.Now;
    this.topics = new List<string>();
    this.description = "Tutorial Description";
    this.draft = false;
  }

  public Tutorial_Class(string name) {
    // This is the second constructor method and will be used if you pass a single string parameter
    // Instead of the name variable being set to "Tutorial Draft", it will be set to the value of
    // the input parameter
    this.name = name;
    this.created_date = DateTime.Now;
    this.topics = new List<string>();
    this.description = "Tutorial Description";
    this.draft = false;
  }
}

Qu’est-ce que le chaînage de constructeur ?

Le chaînage de constructeurs vous permet d’appeler un autre constructeur à partir d’un autre. En utilisant le même exemple, disons que vous créez une nouvelle instance de Tutorial_Class sans passer aucun paramètre. Nous pouvons modifier le constructeur initial pour avoir un paramètre par défaut qui déclenchera l’appel du second constructeur. D’où le nom de Constructor Chaining. Vous pouvez également le considérer comme similaire aux arguments facultatifs, qui définissent une valeur par défaut, que vous ayez explicitement passé quoi que ce soit ou non.

Dans l’exemple ci-dessous, au lieu de définir les valeurs dans le constructeur initial, nous passons le nom par défaut Tutorial Draft au constructeur qui déclenche le deuxième constructeur.

class Tutorial_Class {
  public string name;
  public DateTime created_date;
  public List<string> topics;
  public string description;
  public bool draft;

  public Tutorial_Class() : this("Tutorial Draft") {
    // The intiial constructor is now blank but will trigger the second constructor due to the
    // "this("Tutorial Draft")" line.
    // If you remove the parameter, all of the class variables will again be null by default instead
  }

  public Tutorial_Class(string name) {
    // As the initial constructor passed a single string parameter, this constructor is then called
    // and all variable values are set
    this.name = name;
    this.created_date = DateTime.Now;
    this.topics = new List<string>();
    this.description = "Tutorial Description";
    this.draft = false;
  }
}

Exemple de chaînage de constructeur

En utilisant les concepts discutés ci-dessus, nous pouvons ensuite appliquer le chaînage des constructeurs et voir comment la classe se comporte en fonction des différentes entrées.

Exemple:

using System;
using System.Collections.Generic;

namespace ConstructorChaining_Example {
  class Program {
    static void Main(string[] args) {
      // Initialize a new instance of the class with no parameters
      Tutorial_Class no_params = new Tutorial_Class();
      // Print the results to the console
      Console.WriteLine("Tutorial_Class with No Parameters:\n");
      PrintVariables(no_params);

      // Initialize a new instance of the class with the tutorial name "Sample Tutorial 1"
      Tutorial_Class string_param = new Tutorial_Class("Sample Tutorial 1");
      // Print the results to the console
      Console.WriteLine("Tutorial_Class with a Tutorial Name Provided:\n");
      PrintVariables(string_param);

      // Initialize a new instance of the class with the tutorial name "Sample Tutorial 2" and a
      // created date of December 31, 2021.
      Tutorial_Class string_and_date_param =
          new Tutorial_Class("Sample Tutorial 2", new DateTime(2021, 12, 31));
      // Print the results to the console
      Console.WriteLine("Tutorial_Class with a Tutorial Name and Created Date Provided:\n");
      PrintVariables(string_and_date_param);

      Console.ReadLine();
    }

    public class Tutorial_Class {
      public string name;
      public DateTime created_date;
      public List<string> topics;
      public string description;
      public bool draft;

      public Tutorial_Class() : this("Tutorial Draft") {
        // This is the initial constructor class which is only executed when no parameters are
        // passed Once the class is created, the second constructor class will be triggered with the
        // name parameter "Tutorial Draft"
        this.description = "No Parameter Passed";
      }

      public Tutorial_Class(string name) : this(name, DateTime.Now) {
        // This is the second constructor class
        // This can be called by two ways, either by initializing the class with no parameters or by
        // passing a specific string parameter for the tutorial name Regardless of how this
        // constructor is triggered, it will by default also execute the third constructor class by
        // passing the current DateTime as the date param
        this.description = "A tutorial name has been passed";
      }

      public Tutorial_Class(string name, DateTime date) {
        // This is the third constructor class
        // Regardless of how the class is initialized, this will always be triggered due to how the
        // constructors are chained
        this.name = name;
        this.created_date = date;
        this.topics = new List<string>();
        this.description = "A tutorial name and created date have both been passed";
        this.draft = false;
      }
    }

    public static void PrintVariables(Tutorial_Class tutorial) {
      // This function accepts a Tutorial_Class and prints three of its variables to the console
      Console.WriteLine("Tutorial Name: " + tutorial.name + "\n");
      Console.WriteLine("Created Date: " + tutorial.created_date.ToString() + "\n");
      Console.WriteLine("Description: " + tutorial.description + "\n");

      Console.WriteLine("\n");
    }
  }
}

Dans l’exemple ci-dessus, nous avons créé trois instances de Tutorial_Class et fourni des paramètres différents à chacune. Vous pouvez observer que quel que soit le constructeur qui a été initialisé en premier, ils ont toujours déclenché le troisième constructeur, ce qui peut être vérifié en voyant comment les autres variables ont également des valeurs, pas seulement la description.

Une autre chose importante à noter est que les constructeurs chaînés sont appelés en premier avant d’exécuter les instructions dans son constructeur principal. Cela peut être vu à travers la variable de description, qui est différente selon les paramètres initialement fournis.

Production:

Tutorial_Class with No Parameters :

    Tutorial Name : Tutorial Draft

                        Created Date : 28 /
                    12 /
                    2021 8 : 25 : 35 pm

                        Description : No Parameter Passed

                                          Tutorial_Class with a Tutorial Name Provided :

    Tutorial Name : Sample Tutorial 1

                    Created Date : 28 /
                    12 /
                    2021 8 : 25 : 35 pm

                        Description
    : A tutorial name has been passed

          Tutorial_Class with a Tutorial Name and Created Date Provided :

    Tutorial Name : Sample Tutorial 2

                    Created Date : 31 /
                    12 /
                    2021 12 : 00 : 00 am

                        Description : A tutorial name and created date have both been passed