Voir exercice-apprivoiser-operateurs.html pour l'énoncé des exercices.
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;
}
}
Je vais passer sur celle-ci car je m'en sers souvent dans mes travaux pratiques.
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();
}