C# > Object-Oriented Programming (OOP) > Polymorphism > Compile-time Polymorphism (Method Overloading)
Method Overloading: Calculating Area
This code demonstrates method overloading in C# by providing multiple `CalculateArea` methods within the `ShapeCalculator` class. Each `CalculateArea` method takes different parameters, allowing you to calculate the area of various shapes using the same method name. This is an example of compile-time polymorphism, as the correct method to call is determined at compile time based on the arguments provided.
Core Concept: Method Overloading
Method overloading allows you to define multiple methods with the same name within a class, as long as each method has a unique signature. The signature consists of the method's name and the number, type, and order of its parameters. The compiler uses the signature to determine which overloaded method to call. This avoids the need for creating distinct method names for similar operations performed on different data types or with varying numbers of inputs. In essence, it provides a more user-friendly and intuitive API.
C# Code Snippet
The code defines a `ShapeCalculator` class with three overloaded `CalculateArea` methods: one for calculating the area of a circle (takes radius as input), one for calculating the area of a rectangle (takes length and width), and one for calculating the area of a triangle (takes three sides). In the `Main` method, we create an instance of `ShapeCalculator` and call each `CalculateArea` method with different arguments. The compiler correctly determines which `CalculateArea` method to execute based on the number and types of the arguments passed.
using System;
public class ShapeCalculator
{
public double CalculateArea(double radius)
{
return Math.PI * radius * radius; // Circle
}
public double CalculateArea(double length, double width)
{
return length * width; // Rectangle
}
public double CalculateArea(double side1, double side2, double side3)
{
double s = (side1 + side2 + side3) / 2; // Semi-perimeter
return Math.Sqrt(s * (s - side1) * (s - side2) * (s - side3)); // Heron's formula (Triangle)
}
public static void Main(string[] args)
{
ShapeCalculator calculator = new ShapeCalculator();
double circleArea = calculator.CalculateArea(5); // Radius = 5
Console.WriteLine("Area of circle: " + circleArea);
double rectangleArea = calculator.CalculateArea(4, 6); // Length = 4, Width = 6
Console.WriteLine("Area of rectangle: " + rectangleArea);
double triangleArea = calculator.CalculateArea(3, 4, 5); // Sides: 3, 4, 5
Console.WriteLine("Area of triangle: " + triangleArea);
}
}
Real-Life Use Case
Method overloading is useful in scenarios where you want to perform the same operation (e.g., calculating area, adding numbers, displaying data) but with different input parameters. For example, a `Database` class might have overloaded `Connect` methods that accept different connection strings or credentials. GUI libraries often use overloading for methods like `Draw` to handle drawing different types of shapes (rectangles, circles, lines) with appropriate parameters.
Best Practices
Interview Tip
Be prepared to explain the difference between method overloading (compile-time polymorphism) and method overriding (runtime polymorphism). Method overloading is resolved at compile time based on the method signature, while method overriding is resolved at runtime based on the object type. Emphasize the importance of distinct method signatures in overloading.
When to use them
Use method overloading when you need to provide variations of the same operation for different data types or different numbers of parameters, and the core functionality remains conceptually the same. Avoid it when the methods perform significantly different operations despite sharing a name, as this can lead to confusion.
Memory footprint
Method overloading generally has a minimal impact on memory footprint. The compiler simply creates separate entries in the metadata for each overloaded method. The size of the compiled code might be slightly larger due to the presence of multiple method definitions, but the difference is usually negligible.
Alternatives
Pros
Cons
FAQ
-
What is the difference between method overloading and method overriding?
Method overloading (compile-time polymorphism) involves defining multiple methods with the same name but different signatures within the same class. The compiler chooses the correct method at compile time based on the arguments passed. Method overriding (runtime polymorphism) involves a derived class providing a specific implementation of a method that is already defined in its base class. The correct method is chosen at runtime based on the object's actual type. -
Can I overload methods based only on the return type?
No, you cannot overload methods based solely on the return type. The method signature consists of the method name and the parameter list (number, type, and order of parameters). The return type is not part of the signature.