Getsuyodev, Programming is mainly used when constructing an application. Programming requires knowledge of application domains, algorithms, and programming language expertise. Programming can be developed in different logic based on developer knowledge.

C Sharp – Surcharge d’opérateur

Programmation en C# (C Sharp)



Certains opérateurs internes au C# sont surchargeables, uniquement à travers des méthodes static qui utilisent l’opérateur lui-même.

Operateurs surchargeables :

+, -, !, ~, ++, --, true, false, +, -, *, /, %, &, |, ^, <<, >>, 
==, !=, <, >, <=, >=

Operateurs non surchargeables :

&&, || , [ ], ( ) ,+=, -=, *=, /=, %=, &=, |=, ^=, 
<<=, >>=, =, ., ?:, ->, new, is, sizeof, typeof

L’exemple ci-dessous montre comment surcharger les opérateurs +, *, / , – dans le TAD des nombres rationnels représenté par la classe Rationnel :

Dans la classe Rationnel l’opérateur “+” est surchargé ainsi  :

public static Rationnel operator + (Rationnel a, Rationnel b) {… }

Dès lors il est possible d’utiliser l’opérateur “+” directement sur des objets de type Rationnel :

Rationnel r1, r2, r3;
r3 = r1 + r2;


using System;

interface IRatio
{
void Reduire();
}

class Rationnel : IRatio
{
private int FNum, FDenom;//numérateur et dénominateur du rationnel

//-- méthodes privées ppcm et pgcd
private static int ppcm(int a, int b)
{
int max = Math.Max(a, b);
int min = Math.Min(a, b);
int p = min;
for (int k = 1; (k <= max) & (p % max != 0); k++, p = min * k) ;
return p;
}
private static int pgcd(int a, int b)
{
int r;
int n = Math.Max(a, b);
int p = Math.Min(a, b);
do
{
r = n % p;
n = p;
p = r;
}
while (r != 0);
return n;
}
private void Normalise( ) // met le signe au numérateur et rend le numérateur positif
{
if (FDenom < 0)
{
FDenom *= -1;
FNum *= -1;
}
Reduire();
}

//-- constructeur
public Rationnel(int a, int b)
{
setNum(a);
setDenom(b);
this.Normalise( );
}
//-- méthodes publiques
public void Reduire( ) // rend le rationnel irréductible
{
if (FDenom != 0)
{
int pgc = pgcd(Math.Abs(FNum), Math.Abs(FDenom));
FNum /= pgc;
FDenom /= pgc;
}
}
public int getNum( )
{
return FNum;
}
public int getDenom( )
{
return FDenom;
}
public void setNum(int x)
{
FNum = x;
}
public void setDenom(int x)
{
if (x != 0)
FDenom = x;
else
FDenom = 1;
}
public override string ToString()
{
return this.FNum.ToString( ) + '/' + this.FDenom.ToString( );
}

// surcharges des opérateurs  + , - , * , / :
public static Rationnel operator + (Rationnel a, Rationnel b)
{
int divcom, coeff_a, coeff_b, num, denom;
a.Reduire( );
b.Reduire( );
divcom = ppcm(a.getDenom( ), b.getDenom( ));
coeff_a = divcom / a.getDenom( );
coeff_b = divcom / b.getDenom( );
num = a.getNum( ) * coeff_a + b.getNum( ) * coeff_b;
denom = divcom;
return new Rationnel(num, denom);
}
public static Rationnel operator - (Rationnel a, Rationnel b)
{
int divcom, coeff_a, coeff_b, num, denom;
a.Reduire( );
b.Reduire( );
divcom = ppcm(a.getDenom( ), b.getDenom( ));
coeff_a = divcom / a.getDenom( );
coeff_b = divcom / b.getDenom( );
num = a.getNum( ) * coeff_a - b.getNum( ) * coeff_b;
denom = divcom;
return new Rationnel(num, denom);
}
public static Rationnel operator * (Rationnel a, Rationnel b)
{
int num, denom;
a.Reduire( );
b.Reduire( );
num = a.getNum( ) * b.getNum( );
denom = a.getDenom( ) * b.getDenom( );
return new Rationnel(num, denom);
}
public static Rationnel operator / (Rationnel a, Rationnel b)
{
int num = a.getNum( ), denom = b.getDenom( );
if (b.getNum( ) != 0)
{
a.Reduire( );
b.Reduire( );
num = a.getNum( ) * b.getDenom( );
denom = a.getDenom( ) * b.getNum( );
}
return new Rationnel(num, denom);
}
}


class Exercice
{
public static void Main(string[ ] args) // Méthode principale de lancement de l'exécution
{
Rationnel r1, r2, r3;
r1 = new Rationnel(60, 54);
Console.WriteLine("r1=" + r1.ToString( ));
r2 = new Rationnel(2, 15);
Console.WriteLine("r2=" + r2.ToString( ));
r3 = r1 + r2;
Console.WriteLine("r3=r1+r2 : " + r3.ToString( ));
r3 = r1 - r2;
Console.WriteLine("r3=r1-r2 : " + r3.ToString( ));
r3 = r2 - r1;
Console.WriteLine("r3=r2-r1 : " + r3.ToString( ));
r3 = r2 * r1;
Console.WriteLine("r3=r2*r1 : " + r3.ToString( ));
r3 = r1 / r2;
Console.WriteLine("r3=r1/r2 : " + r3.ToString( ));
r3 = r2 / r1;
Console.WriteLine("r3=r2/r1 : " + r3.ToString( ));
Console.ReadLine();
}
}



Comments are closed, but trackbacks and pingbacks are open.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More