Aller au contenu

Contraintes multiples

Contexte : On peut appliquer plusieurs contraintes à un même paramètre de type. L’ordre doit respecter : classe de base (ou class/struct), interfaces, new(). Les contraintes multiples augmentent les capacités du type générique.

using System;
using System.Collections.Generic;
public interface IComparableWithDisplay<T> : IComparable<T>
{
void Display();
}
public class Personne : IComparableWithDisplay<Personne>
{
public string Nom { get; set; }
public int Age { get; set; }
public int CompareTo(Personne other)
{
return Age.CompareTo(other.Age);
}
public void Display() => Console.WriteLine($"{Nom} ({Age} ans)");
}
public class Utilitaire<T> where T : class, IComparableWithDisplay<T>, new()
{
public T CreerEtAfficher()
{
T obj = new T();
obj.Display();
return obj;
}
public T Max(T a, T b)
{
return a.CompareTo(b) > 0 ? a : b;
}
}
class Program
{
static void Main()
{
var util = new Utilitaire<Personne>();
var p1 = new Personne { Nom = "Alice", Age = 30 };
var p2 = new Personne { Nom = "Bob", Age = 25 };
Personne plusAge = util.Max(p1, p2);
Console.WriteLine($"Le plus âgé : {plusAge.Nom}");
}
}
Fenêtre de terminal
dotnet run
Le plus âgé : Alice
  • L’ordre : classe de base (ou class/struct) en premier, puis interfaces, puis new().
  • On ne peut pas combiner class et struct.
  • Les contraintes augmentent la lisibilité mais aussi la rigidité.

Dictionary<TKey, TValue>TKey doit implémenter IEquatable<TKey> ou object.Equals (contrainte implicite).
Voir documentation .NET sur les contraintes multiples.