C# est un langage de programmation orienté objet. Il est donc possible de définir des nouveaux types de données par le biais de classes. Pour de plus amples informations sur la programmation orientée objet en C#, je vous renvoie vers le support de cours C#.
L'exemple ci-dessous défini un nouveau type de données de manipulation de nombres rationnels (de fractions). On peut par exemple imaginer le rationnel 3/5 qui est constitué d'un numérateur, fixé à la valeur 3, et d'un dénominateur, qui lui est fixé à la valeur 5. Pour rappel, mathématiquement parlant, il est interdit de mettre un dénominateur à 0. L'objectif principal de la classe est de vérifier les changements d'états sur vos nombres rationnels afin de garantir qu'un objet ne soit jamais mis dans un état incohérent. Au pire, on déclenche une exception (une erreur).
Pour réaliser ces contrôles, la classe utilise le concept de propriétés. Il y en a deux dans notre classe : Numerator
(en ligne 29) et
Denominator
(en ligne 31). Différentes syntaxes de définition de propriétés sont proposées.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
using System; namespace Rational { public class RationalException : Exception { public RationalException(string message = "rational exception") : base(message) { } public RationalException(string message, Exception cause) : base(message, cause) { } } public class Rational { private int m_numerator; private int m_denominator; public Rational(int num = 0, int den=1) { this.Numerator = num; this.Denominator = den; } ~Rational() { Console.WriteLine("Objet détruit"); } //public int Numerator { get; set; } // Propriété auto-générée public int Numerator { get => m_numerator; set => m_numerator = value; } public int Denominator { get { return this.m_denominator; } set { if (value == 0) throw new RationalException("Denominator cannot be 0"); this.m_denominator = value; } } public void Simplify() { int a; int b; if (this.Numerator > this.Denominator) { a = this.Numerator; b = this.Denominator; } else { a = this.Denominator; b = this.Numerator; } int rest; while ((rest = a % b) != 0) { a = b; b = rest; } this.Numerator /= b; this.Denominator /= b; } public static Rational operator+(Rational r1, Rational r2) { return new Rational( r1.Numerator * r2.Denominator + r1.Denominator * r2.Numerator, r1.Denominator * r2.Denominator ); } public static bool operator <(Rational r1, Rational r2) { return r1.Numerator * r2.Denominator < r1.Denominator * r2.Numerator; } public static bool operator >(Rational r1, Rational r2) { return r1.Numerator * r2.Denominator > r1.Denominator * r2.Numerator; } public override string ToString() { return "[" + this.Numerator + "/" + this.Denominator + "]"; } } } |
Et voici maintenant un exemple d'utilisation de notre nouvelle classe de manipulation de nombres rationnels.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; namespace Rational { class Program { static void Main(string[] args) { try { Rational r1 = new Rational(1, 3); Rational r2 = new Rational(2, 1); Rational result = r1 + r2; Console.WriteLine(result); // Affiche 7/3 } catch (RationalException e) { Console.Error.WriteLine("Problème de manipulation de rationnel intercepté"); } } } } |
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :