C# Polymorphism Function OverLoading Operator Overloading
C# Polymorphism Function OverLoading Operator Overloading
Polymorphism is a Greek word, meaning "one name many forms". In other words, one object
has many forms or has one name with multiple functionalities. "Poly" means many and "morph"
means forms. Polymorphism provides the ability to a class to have multiple implementations
with the same name. It is one of the core principles of Object Oriented Programming after
encapsulation and inheritance. In this article, you'll learn what polymorphism is, how it works,
and how to implement polymorphism in C#.
Types of Polymorphism
Here C# compiler checks the number of parameters passed and the type of parameter
and make the decision of which method to call and it throw an error if no matching
method is found.
In the following example, a class has two methods with the same name "Add" but with
different input parameters (the first method has three parameters and the second
method has two parameters).
Method Overloading
Method Overloading is a type of polymorphism. It has several names like “Compile Time
Polymorphism” or “Static Polymorphism” and sometimes it is called “Early Binding”.
Method Overloading means creating multiple methods in a class with same names but different
signatures (Parameters). It permits a class, struct, or interface to declare multiple methods with
the same name with unique signatures.
Compiler automatically calls required method to check number of parameters and their type
which are passed into that method.
using System;
namespace DemoCsharp
{
class Program
{
public int Add(int num1, int num2)
{
return (num1 + num2);
}
Dynamic / runtime polymorphism is also known as late binding. Here, the method name
and the method signature (number of parameters and parameter type must be the same
and may have a different implementation). Method overriding is an example of dynamic
polymorphism.
A method or function of the base class is available to the child (derived) class without the use of
the "overriding" keyword. The compiler hides the function or method of the base class.
C# - Operator Overloading
You can redefine or overload most of the built-in operators available in C#.
Thus a programmer can use operators with user-defined types as well.
Overloaded operators are functions with special names the
keyword operator followed by the symbol for the operator being defined.
similar to any other function, an overloaded operator has a return type and a
parameter list.
The above function implements the addition operator (+) for a user-defined
class Box. It adds the attributes of two Box objects and returns the resultant
Box object.
Live Demo
using System;
namespace OperatorOvlApplication {
class Box {
private double length; // Length of a box
private double breadth; // Breadth of a box
private double height; // Height of a box
// box 1 specification
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// box 2 specification
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// volume of box 1
volume = Box1.getVolume();
Console.WriteLine("Volume of Box1 : {0}", volume);
// volume of box 2
volume = Box2.getVolume();
Console.WriteLine("Volume of Box2 : {0}", volume);
// volume of box 3
volume = Box3.getVolume();
Console.WriteLine("Volume of Box3 : {0}", volume);
Console.ReadKey();
}
}
}
When the above code is compiled and executed, it produces the following
result −
+, -, !, ~, ++, --
1
These unary operators take one operand and can be overloaded.
+, -, *, /, %
2
These binary operators take one operand and can be overloaded.
&&, ||
4
The conditional logical operators cannot be overloaded directly.
Example
In the light of the above discussions, let us extend the preceding example,
and overload few more operators −
Live Demo
using System;
namespace OperatorOvlApplication {
class Box {
private double length; // Length of a box
private double breadth; // Breadth of a box
private double height; // Height of a box
status = true;
}
return status;
}
public static bool operator !=(Box lhs, Box rhs) {
bool status = false;
status = true;
}
return status;
}
public static bool operator <(Box lhs, Box rhs) {
bool status = false;
status = true;
}
return status;
}
public static bool operator >(Box lhs, Box rhs) {
bool status = false;
status = true;
}
return status;
}
public static bool operator <=(Box lhs, Box rhs) {
bool status = false;
status = true;
}
return status;
}
public static bool operator >=(Box lhs, Box rhs) {
bool status = false;
status = true;
}
return status;
}
public override string ToString() {
return String.Format("({0}, {1}, {2})", length, breadth,
height);
}
}
class Tester {
static void Main(string[] args) {
Box Box1 = new Box(); // Declare Box1 of type Box
Box Box2 = new Box(); // Declare Box2 of type Box
Box Box3 = new Box(); // Declare Box3 of type Box
Box Box4 = new Box();
double volume = 0.0; // Store the volume of a box
here
// box 1 specification
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// box 2 specification
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// volume of box 1
volume = Box1.getVolume();
Console.WriteLine("Volume of Box1 : {0}", volume);
// volume of box 2
volume = Box2.getVolume();
Console.WriteLine("Volume of Box2 : {0}", volume);
// volume of box 3
volume = Box3.getVolume();
Console.WriteLine("Volume of Box3 : {0}", volume);
if (Box1 != Box2)
Console.WriteLine("Box1 is not equal to Box2");
else
Console.WriteLine("Box1 is not greater or equal to
Box2");
Box4 = Box3;
if (Box3 == Box4)
Console.WriteLine("Box3 is equal to Box4");
else
Console.WriteLine("Box3 is not equal to Box4");
Console.ReadKey();
}
}
}
When the above code is compiled and executed, it produces the following
result −
Box 1: (6, 7, 5)
Box 2: (12, 13, 10)
Volume of Box1 : 210
Volume of Box2 : 1560
Box 3: (18, 20, 15)
Volume of Box3 : 5400
Box1 is not greater than Box2
Box1 is less than Box2
Box1 is not greater or equal to Box2
Box1 is less or equal to Box2
Box1 is not equal to Box2
Box3 is equal to Box4