Solutionnaire des exercices pour apprivoiser la surcharge d'opérateurs

Voir exercice-apprivoiser-operateurs.html pour l'énoncé des exercices.

Solutionnaire – Classe TiTableau

class TaillesIncompatiblesException : Exception { }
public class TiTableau
{
   int[] Substrat { get; init; }
   public TiTableau(int n)
   {
      Substrat = new int[n];
   }
   public int this[int n]
   {
      get => Substrat[n];
      set
      {
         Substrat[n] = value;
      }
   }
   public bool Contient(int val)
   {
      foreach (int n in Substrat)
         if (n == val) return true;
      return false;
   }
   public int Taille => Substrat.Length;
   public bool Vide => Taille == 0;
   public override bool Equals(object autre) =>
      autre is TiTableau tt && Equals(tt);
   public bool Equals(TiTableau autre)
   {
      if (Taille != autre.Taille) return false;
      for (int i = 0; i != Taille; ++i)
         if (this[i] != autre[i]) return false;
      return true;
   }
   public override int GetHashCode() => base.GetHashCode(); // bof
   public static bool operator ==(TiTableau t0, TiTableau t1) =>
      t0.Equals(t1);
   public static bool operator!=(TiTableau t0, TiTableau t1) => !(t0 == t1);
   public static bool operator <(TiTableau t0, TiTableau t1)
   {
      int i = 0;
      for (;  i != t0.Taille && i != t1.Taille; ++i)
         if (t0[i] != t1[i])
            return t0[i] < t1[i];
      return t0.Taille < t1.Taille;
   }
   public static bool operator >(TiTableau t0, TiTableau t1) => t1 < t0;
   public static bool operator <=(TiTableau t0, TiTableau t1) => !(t1 < t0);
   public static bool operator >=(TiTableau t0, TiTableau t1) => !(t0 < t1);

   public static TiTableau operator+(TiTableau t0, TiTableau t1)
   {
      if (t0.Taille != t1.Taille) throw new TaillesIncompatiblesException();
      TiTableau résultat = new TiTableau(t0.Taille);
      for (int i = 0; i != résultat.Taille; ++i)
         résultat[i] = t0[i] + t1[i];
      return résultat;
   }
   public static TiTableau operator -(TiTableau tt)
   {
      TiTableau résultat = new TiTableau(tt.Taille);
      for (int i = 0; i != résultat.Taille; ++i)
         résultat[i] = -tt[i];
      return résultat;
   }
   public override string ToString() // serait plus rapide avec un StringBuilder
   {
      if (Vide) // cas dégénéré
         return "";
      string résultat = $"{this[0]}";
      for(int i = 1; i != Taille; ++i)
         résultat += $" {this[i]}";
      return résultat;
   }
}

Solutionnaire – Classe Point

Je vais passer sur celle-ci car je m'en sers souvent dans mes travaux pratiques.

Solutionnaire – Classe Naturel

class ErreurDomaineException : Exception {}
class Naturel : IEquatable<Naturel>
{
   int valeur;
   int Valeur
   {
      get => valeur;
      init
      {
         valeur = value >= 0 ? value : throw new ErreurDomaineException();
      }
   }
   public Naturel()
   {
      Valeur = 0;
   }
   public Naturel(int valeur)
   {
      Valeur = valeur;
   }
   // opérateurs arithmétiques unaires
   public static Naturel operator+(Naturel n) => new Naturel(n.Valeur);
   public static Naturel operator-(Naturel n) => new Naturel(-n.Valeur); // lèvera une exception (aurait-on dû l'implémenter?)
   // opérateurs arithmétiques binaires
   public static Naturel operator+(Naturel n0, Naturel n1) => new Naturel(n0.Valeur + n1.Valeur);
   public static Naturel operator-(Naturel n0, Naturel n1) => new Naturel(n0.Valeur - n1.Valeur); // lèvera peut-être une exception
   public static Naturel operator*(Naturel n0, Naturel n1) => new Naturel(n0.Valeur * n1.Valeur);
   public static Naturel operator/(Naturel n0, Naturel n1) => new Naturel(n0.Valeur / n1.Valeur); // peut lever DivideByZeroException
   public static Naturel operator%(Naturel n0, Naturel n1) => new Naturel(n0.Valeur % n1.Valeur); // peut lever DivideByZeroException
   // opérateurs relationnels
   public static bool operator<(Naturel n0, Naturel n1) => n0.Valeur < n1.Valeur;
   public static bool operator<=(Naturel n0, Naturel n1) => !(n1 < n0);
   public static bool operator>(Naturel n0, Naturel n1) => n1 < n0;
   public static bool operator>=(Naturel n0, Naturel n1) => !(n0 < n1);
   public bool Equals(Naturel n) => Valeur == n.Valeur;
   public static bool operator==(Naturel n0, Naturel n1) => (object) n0 != null && n0.Equals(n1);
   public static bool operator!=(Naturel n0, Naturel n1) => !(n0 == n1);
   public override bool Equals(object obj) => obj is Naturel n && Equals(n);
   public override int GetHashCode() => Valeur.GetHashCode();
}

Valid XHTML 1.0 Transitional

CSS Valide !