Surcharge d'opérateurs : tutorial

Description

Voici une petite source montrant comment surcharger un opérateur du type +, *, ... pour par exemple additioner deux objets d'une classe, ...

Pour cela j'ai pris l'exemple des nombres complexes ( partie réel, partie imaginaire )

Source / Exemple :


Below or in the zip

// project created on 27/11/2002 at 16:55
using System;

class MainClass
{
	public static void Main(string[] args)
	{
		ClpComplexe C1 = new ClpComplexe();
		ClpComplexe C2 = new ClpComplexe(5,3);
				
		C1.Reel = 2;
		C1.Imaginaire = -4;		
		Console.Out.WriteLine("C1: " + C1.Reel + "+" + C1.Imaginaire + "j");
		Console.Out.WriteLine("C2: " + C2.Reel + "+" + C2.Imaginaire + "j\n");
				
		//Opération possible grâce à la surcharge de l'opérateur +
		//ClpComplexe + ClpComplexe
		ClpComplexe C3 = C1 + C2;
		
		Console.Out.WriteLine("Old C1: " + C1.Reel + "+" + C1.Imaginaire + "j");
		
		//ClpComplexe + ClpComplexe
		C1 = C2 + C3;
		//ClpComplexe * ClpComplexe
		ClpComplexe C4 = C2 * C3;
		//ClpComplexe - Complexe où Complexe est un ClpComplexe déterminé par (int * ClpComplexe)
		C4 = C4 - (2 * C1);
		//Idem mais avec inversion des arguments
		//ClpComplexe - Complexe où Complexe est un ClpComplexe déterminé par (ClpComplexe * int)
		C4 = C4 - (C1 * 2);
		
		Console.Out.WriteLine("C1: " + C1.Reel + "+" + C1.Imaginaire + "j");
		Console.Out.WriteLine("C2: " + C2.Reel + "+" + C2.Imaginaire + "j");
		Console.Out.WriteLine("C3: " + C3.Reel + "+" + C3.Imaginaire + "j");
		Console.Out.WriteLine("C4: " + C4.Reel + "+" + C4.Imaginaire + "j");
	}
}

class ClpComplexe
{
	private int iReel;
	private int iImaginaire;	
	
	//Constructeur par défaut
	public ClpComplexe()
	{
		this.iReel = 0;
		this.iImaginaire = 0;		
	}
	
	//Constructeur avec deux arguments
	public ClpComplexe(int iReel, int iImaginaire)
	{
		this.iReel = iReel;
		this.iImaginaire = iImaginaire;
	}
	
	//Propriété Reel
	public int Reel
	{
		get
		{
			return this.iReel;
		}
		set
		{
			this.iReel = value;
		}		
	}
	
	//Propriété Imaginaire
	public int Imaginaire
	{
		get
		{
			return this.iImaginaire;
		}
		set
		{
			this.iImaginaire = value;
		}		
	}
	
	//Surcharge de l'opérateur + pour pouvoir additionner deux nombres complexes
	public static ClpComplexe operator +(ClpComplexe C1, ClpComplexe C2)
	{
		return new ClpComplexe(C1.Reel + C2.Reel, C1.Imaginaire + C2.Imaginaire);
	}
	
	//Surcharge de l'opérateur - pour pouvoir soustriare deux nombres complexes
	public static ClpComplexe operator -(ClpComplexe C1, ClpComplexe C2)
	{
		return new ClpComplexe(C1.Reel - C2.Reel, C1.Imaginaire - C2.Imaginaire);
	}
	
	//Surcharge de l'opérateur * pour pouvoir multiplier deux nombres complexes
	public static ClpComplexe operator *(ClpComplexe C1, ClpComplexe C2)
	{
		return new ClpComplexe((C1.Reel * C2.Reel - C1.Imaginaire * C2.Imaginaire),
		                       (C1.Reel * C2.Imaginaire - C2.Reel * C1.Imaginaire));
	}
	
	//Surcharge de l'opérateur * pour pouvoir multiplier par iMultiple un nombre complexe
	public static ClpComplexe operator *(int iMultiple, ClpComplexe C1)
	{
		return new ClpComplexe((iMultiple * C1.Reel), (iMultiple * C1.Imaginaire));
	}
	
	//Surcharge de l'opérateur * pour pouvoir multiplier par iMultiple un nombre complexe
	public static ClpComplexe operator *(ClpComplexe C1, int iMultiple)
	{
		return new ClpComplexe((iMultiple * C1.Reel), (iMultiple * C1.Imaginaire));
	}
}

Conclusion :


Avec :

class ClpComplexe
{
public int iReel;
public int iImaginaire;
}

si je fais C3 = C1 + C2; //où C1, C2 & C3 sont des objets ClpComplexe
alors cela ne marche pas car le programme ne sait pas comment additionner deux nombres complexes alors avec la surcharge de l'opérateur +, cela est possible.

//Surcharge de l'opérateur + pour pouvoir additionner deux nombres complexes
public static ClpComplexe operator +(ClpComplexe C1, ClpComplexe C2)
{
return new ClpComplexe(C1.Reel + C2.Reel, C1.Imaginaire + C2.Imaginaire);
}

De sorte qu'il sache comment additionner deux nombres complexes.

Codes Sources

A voir également