/* Mastering Visual C# .NET by Jason Price, Mike Gunderloy Publisher: Sybex; ISBN: 0782129110 */ /* Example7_12.cs illustrates operator overloading */ using System; // declare the Rectangle class class Rectangle { // declare the fields public int width; public int height; // define constructor public Rectangle(int width, int height) { this.width = width; this.height = height; } // override the ToString() method public override string ToString() { return "width = " + width + ", height = " + height; } // overload the == operator public static bool operator ==(Rectangle lhs, Rectangle rhs) { Console.WriteLine("In operator =="); if (lhs.width == rhs.width && lhs.height == rhs.height) { return true; } else { return false; } } // overload the != operator public static bool operator !=(Rectangle lhs, Rectangle rhs) { Console.WriteLine("In operator !="); return !(lhs==rhs); } // override the Equals() method public override bool Equals(object obj) { Console.WriteLine("In Equals()"); if (!(obj is Rectangle)) { return false; } else { return this == (Rectangle) obj; } } // overload the + operator public static Rectangle operator +(Rectangle lhs, Rectangle rhs) { Console.WriteLine("In operator +"); return new Rectangle(lhs.width + rhs.width, lhs.height + rhs.height); } } public class Example7_12 { public static void Main() { // create Rectangle objects Rectangle myRectangle = new Rectangle(1, 4); Console.WriteLine("myRectangle: " + myRectangle); Rectangle myRectangle2 = new Rectangle(1, 4); Console.WriteLine("myRectangle2: " + myRectangle2); if (myRectangle == myRectangle2) { Console.WriteLine("myRectangle is equal to myRectangle2"); } else { Console.WriteLine("myRectangle is not equal to myRectangle2"); } Rectangle myRectangle3 = myRectangle + myRectangle2; Console.WriteLine("myRectangle3: " + myRectangle3); } }
Class Interface
A better way to overload !, | and & for ThreeD. This version automatically enables the && and || operators
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ /* A better way to overload !, |, and & for ThreeD. This version automatically enables the && and || operators. */ using System; // A three-dimensional coordinate class. class ThreeD { int x, y, z; // 3-D coordinates public ThreeD() { x = y = z = 0; } public ThreeD(int i, int j, int k) { x = i; y = j; z = k; } // Overload | for short-circuit evaluation. public static ThreeD operator |(ThreeD op1, ThreeD op2) { if( ((op1.x != 0) || (op1.y != 0) || (op1.z != 0)) | ((op2.x != 0) || (op2.y != 0) || (op2.z != 0)) ) return new ThreeD(1, 1, 1); else return new ThreeD(0, 0, 0); } // Overload & for short-circuit evaluation. public static ThreeD operator &(ThreeD op1, ThreeD op2) { if( ((op1.x != 0) && (op1.y != 0) && (op1.z != 0)) & ((op2.x != 0) && (op2.y != 0) && (op2.z != 0)) ) return new ThreeD(1, 1, 1); else return new ThreeD(0, 0, 0); } // Overload !. public static bool operator !(ThreeD op) { if(op) return false; else return true; } // Overload true. public static bool operator true(ThreeD op) { if((op.x != 0) || (op.y != 0) || (op.z != 0)) return true; // at least one coordinate is non-zero else return false; } // Overload false. public static bool operator false(ThreeD op) { if((op.x == 0) && (op.y == 0) && (op.z == 0)) return true; // all coordinates are zero else return false; } // Show X, Y, Z coordinates. public void show() { Console.WriteLine(x + ", " + y + ", " + z); } } public class TrueFalseDemo1 { public static void Main() { ThreeD a = new ThreeD(5, 6, 7); ThreeD b = new ThreeD(10, 10, 10); ThreeD c = new ThreeD(0, 0, 0); Console.Write("Here is a: "); a.show(); Console.Write("Here is b: "); b.show(); Console.Write("Here is c: "); c.show(); Console.WriteLine(); if(a) Console.WriteLine("a is true."); if(b) Console.WriteLine("b is true."); if(c) Console.WriteLine("c is true."); if(!a) Console.WriteLine("a is false."); if(!b) Console.WriteLine("b is false."); if(!c) Console.WriteLine("c is false."); Console.WriteLine(); Console.WriteLine("Use & and |"); if(a & b) Console.WriteLine("a & b is true."); else Console.WriteLine("a & b is false."); if(a & c) Console.WriteLine("a & c is true."); else Console.WriteLine("a & c is false."); if(a | b) Console.WriteLine("a | b is true."); else Console.WriteLine("a | b is false."); if(a | c) Console.WriteLine("a | c is true."); else Console.WriteLine("a | c is false."); Console.WriteLine(); // now use short-circuit ops Console.WriteLine("Use short-circuit && and ||"); if(a && b) Console.WriteLine("a && b is true."); else Console.WriteLine("a && b is false."); if(a && c) Console.WriteLine("a && c is true."); else Console.WriteLine("a && c is false."); if(a || b) Console.WriteLine("a || b is true."); else Console.WriteLine("a || b is false."); if(a || c) Console.WriteLine("a || c is true."); else Console.WriteLine("a || c is false."); } }
Overload true and fase for ThreeD
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ // Overload true and fase for ThreeD. using System; // A three-dimensional coordinate class. class ThreeD { int x, y, z; // 3-D coordinates public ThreeD() { x = y = z = 0; } public ThreeD(int i, int j, int k) { x = i; y = j; z = k; } // Overload true. public static bool operator true(ThreeD op) { if((op.x != 0) || (op.y != 0) || (op.z != 0)) return true; // at least one coordinate is non-zero else return false; } // Overload false. public static bool operator false(ThreeD op) { if((op.x == 0) && (op.y == 0) && (op.z == 0)) return true; // all coordinates are zero else return false; } // Overload unary --. public static ThreeD operator --(ThreeD op) { // for ++, modify argument op.x--; op.y--; op.z--; return op; } // Show X, Y, Z coordinates. public void show() { Console.WriteLine(x + ", " + y + ", " + z); } } public class TrueFalseDemo { public static void Main() { ThreeD a = new ThreeD(5, 6, 7); ThreeD b = new ThreeD(10, 10, 10); ThreeD c = new ThreeD(0, 0, 0); Console.Write("Here is a: "); a.show(); Console.Write("Here is b: "); b.show(); Console.Write("Here is c: "); c.show(); Console.WriteLine(); if(a) Console.WriteLine("a is true."); else Console.WriteLine("a is false."); if(b) Console.WriteLine("b is true."); else Console.WriteLine("b is false."); if(c) Console.WriteLine("c is true."); else Console.WriteLine("c is false."); Console.WriteLine(); Console.WriteLine("Control a loop using a ThreeD object."); do { b.show(); b--; } while(b); } }
Overload shift operator
/*
C#: The Complete Reference
by Herbert Schildt
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// Overload < and >.
using System;
// A three-dimensional coordinate class.
class ThreeD {
int x, y, z; // 3-D coordinates
public ThreeD() { x = y = z = 0; }
public ThreeD(int i, int j, int k) { x = i; y = j; z = k; }
// Overload <.
public static bool operator <(ThreeD op1, ThreeD op2)
{
if((op1.x < op2.x) && (op1.y < op2.y) && (op1.z < op2.z))
return true;
else
return false;
}
// Overload >.
public static bool operator >(ThreeD op1, ThreeD op2)
{
if((op1.x > op2.x) && (op1.y > op2.y) && (op1.z > op2.z))
return true;
else
return false;
}
// Show X, Y, Z coordinates.
public void show()
{
Console.WriteLine(x + “, ” + y + “, ” + z);
}
}
public class ThreeDDemo4 {
public static void Main() {
ThreeD a = new ThreeD(5, 6, 7);
ThreeD b = new ThreeD(10, 10, 10);
ThreeD c = new ThreeD(1, 2, 3);
Console.Write(“Here is a: “);
a.show();
Console.Write(“Here is b: “);
b.show();
Console.Write(“Here is c: “);
c.show();
Console.WriteLine();
if(a > c) Console.WriteLine(“a > c is true”);
if(a < c) Console.WriteLine("a < c is true");
if(a > b) Console.WriteLine(“a > b is true”);
if(a < b) Console.WriteLine("a < b is true");
}
}
[/csharp]
Overload the + for object + object, object + int, and int + object
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ /* Overload the + for object + object, object + int, and int + object. */ using System; // A three-dimensional coordinate class. class ThreeD { int x, y, z; // 3-D coordinates public ThreeD() { x = y = z = 0; } public ThreeD(int i, int j, int k) { x = i; y = j; z = k; } // Overload binary + for object + object. public static ThreeD operator +(ThreeD op1, ThreeD op2) { ThreeD result = new ThreeD(); /* This adds together the coordinates of the two points and returns the result. */ result.x = op1.x + op2.x; result.y = op1.y + op2.y; result.z = op1.z + op2.z; return result; } // Overload binary + for object + int. public static ThreeD operator +(ThreeD op1, int op2) { ThreeD result = new ThreeD(); result.x = op1.x + op2; result.y = op1.y + op2; result.z = op1.z + op2; return result; } // Overload binary + for int + object. public static ThreeD operator +(int op1, ThreeD op2) { ThreeD result = new ThreeD(); result.x = op2.x + op1; result.y = op2.y + op1; result.z = op2.z + op1; return result; } // Show X, Y, Z coordinates. public void show() { Console.WriteLine(x + ", " + y + ", " + z); } } public class ThreeDDemo3 { public static void Main() { ThreeD a = new ThreeD(1, 2, 3); ThreeD b = new ThreeD(10, 10, 10); ThreeD c = new ThreeD(); Console.Write("Here is a: "); a.show(); Console.WriteLine(); Console.Write("Here is b: "); b.show(); Console.WriteLine(); c = a + b; // object + object Console.Write("Result of a + b: "); c.show(); Console.WriteLine(); c = b + 10; // object + int Console.Write("Result of b + 10: "); c.show(); Console.WriteLine(); c = 15 + b; // int + object Console.Write("Result of 15 + b: "); c.show(); } }
Overload addition for object + object, and for object + int
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ /* Overload addition for object + object, and for object + int. */ using System; // A three-dimensional coordinate class. class ThreeD { int x, y, z; // 3-D coordinates public ThreeD() { x = y = z = 0; } public ThreeD(int i, int j, int k) { x = i; y = j; z = k; } // Overload binary + for object + object. public static ThreeD operator +(ThreeD op1, ThreeD op2) { ThreeD result = new ThreeD(); /* This adds together the coordinates of the two points and returns the result. */ result.x = op1.x + op2.x; result.y = op1.y + op2.y; result.z = op1.z + op2.z; return result; } // Overload binary + for object + int. public static ThreeD operator +(ThreeD op1, int op2) { ThreeD result = new ThreeD(); result.x = op1.x + op2; result.y = op1.y + op2; result.z = op1.z + op2; return result; } // Show X, Y, Z coordinates. public void show() { Console.WriteLine(x + ", " + y + ", " + z); } } public class ThreeDDemo2 { public static void Main() { ThreeD a = new ThreeD(1, 2, 3); ThreeD b = new ThreeD(10, 10, 10); ThreeD c = new ThreeD(); Console.Write("Here is a: "); a.show(); Console.WriteLine(); Console.Write("Here is b: "); b.show(); Console.WriteLine(); c = a + b; // object + object Console.Write("Result of a + b: "); c.show(); Console.WriteLine(); c = b + 10; // object + int Console.Write("Result of b + 10: "); c.show(); } }
More operator overloading
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ // More operator overloading. using System; // A three-dimensional coordinate class. class ThreeD { int x, y, z; // 3-D coordinates public ThreeD() { x = y = z = 0; } public ThreeD(int i, int j, int k) { x = i; y = j; z = k; } // Overload binary +. public static ThreeD operator +(ThreeD op1, ThreeD op2) { ThreeD result = new ThreeD(); /* This adds together the coordinates of the two points and returns the result. */ result.x = op1.x + op2.x; result.y = op1.y + op2.y; result.z = op1.z + op2.z; return result; } // Overload binary -. public static ThreeD operator -(ThreeD op1, ThreeD op2) { ThreeD result = new ThreeD(); /* Notice the order of the operands. op1 is the left operand and op2 is the right. */ result.x = op1.x - op2.x; result.y = op1.y - op2.y; result.z = op1.z - op2.z; return result; } // Overload unary -. public static ThreeD operator -(ThreeD op) { ThreeD result = new ThreeD(); result.x = -op.x; result.y = -op.y; result.z = -op.z; return result; } // Overload unary ++. public static ThreeD operator ++(ThreeD op) { // for ++, modify argument op.x++; op.y++; op.z++; return op; } // Show X, Y, Z coordinates. public void show() { Console.WriteLine(x + ", " + y + ", " + z); } } public class ThreeDDemo1 { public static void Main() { ThreeD a = new ThreeD(1, 2, 3); ThreeD b = new ThreeD(10, 10, 10); ThreeD c = new ThreeD(); Console.Write("Here is a: "); a.show(); Console.WriteLine(); Console.Write("Here is b: "); b.show(); Console.WriteLine(); c = a + b; // add a and b together Console.Write("Result of a + b: "); c.show(); Console.WriteLine(); c = a + b + c; // add a, b and c together Console.Write("Result of a + b + c: "); c.show(); Console.WriteLine(); c = c - a; // subtract a Console.Write("Result of c - a: "); c.show(); Console.WriteLine(); c = c - b; // subtract b Console.Write("Result of c - b: "); c.show(); Console.WriteLine(); c = -a; // assign -a to c Console.Write("Result of -a: "); c.show(); Console.WriteLine(); a++; // increment a Console.Write("Result of a++: "); a.show(); } }