Method Overriding in C#: Explained with Real Example

Method overriding in C# is a fundamental concept in object-oriented programming that allows a subclass to provide a specific implementation of a method that is already defined in its superclass. This mechanism is crucial when a class inherits from another class yet needs to change the behavior of the inherited method. It allows for dynamic polymorphism, where the call to an overridden method will be determined at runtime, ensuring that the correct method for the object in question is executed.

In C#, method overriding is accomplished with the use of the ‘override’ keyword. A subclass can override a method in its base class by specifying the same signature and return type as the method to be overridden, along with the ‘override’ keyword. The base class method must be marked with the ‘virtual’ or ‘abstract’ keyword to be eligible for overriding. By employing method overriding, developers can craft robust and flexible applications that can handle evolving functionalities with minimal changes to the codebase.

To illustrate method overriding in a real-time example, imagine a software system that models payment processing. Different payment methods such as credit cards, PayPal, or cryptocurrencies might share some common operations, but each requires distinct procedures to process a payment.

Through method overriding, each payment method class can inherit from a common base class and override the payment process method to accommodate their specific payment processing algorithms, enabling developers to write clean and maintainable code.

Method Overriding in C#

Method overriding is a fundamental concept in C# that allows subclasses to provide specific implementations for methods defined in their base classes.

Understanding Polymorphism

In object-oriented programming, polymorphism is the ability of a method to do different things based on the object it is acting upon. In C#, polymorphism enables methods to have the same name but behave differently depending on the object’s type to which they belong.

Defining Method Overriding

Method overriding occurs when a subclass offers a distinct implementation of a method that is already defined in its base class. The method signature in the subclass must match the signature in the base class. The override keyword is used to indicate that a method is overriding the base class method, and the virtual keyword is required in the base class method declaration to allow it to be overridden.

Method Overriding in C#

Method overriding is a feature in C# that allows a subclass to provide a specific implementation of a method that is already defined in its superclass.

Syntax and Structure

To effectively use method overriding, one must adhere to the correct syntax. In the superclass, the method to be overridden is defined with the virtual keyword. Subclasses override this method by defining a method with the same signature and the override keyword.

public class BaseClass
{
    public virtual void Display()
    {
        Console.WriteLine("Base Display");
    }
}

public class DerivedClass : BaseClass
{
    public override void Display()
    {
        Console.WriteLine("Derived Display");
    }
}

Access Modifiers and Overriding

When overriding methods, the access modifier of the method in the derived class must match the modifier in the base class. For instance, if the base class method is public, then the overridden method must also be declared as public.

// Incorrect: This will cause a compile-time error
public class DerivedClass : BaseClass
{
    protected override void Display()
    {
        // Implementation
    }
}

The ‘virtual’ Keyword

The virtual keyword is used in the base class to indicate that a method can be overridden in any derived class. The use of virtual implies the method is complete but can be extended if needed.

public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("The animal makes a sound.");
    }
}

The ‘override’ Keyword

Subclasses use the override keyword to provide a new implementation of a virtual method. This indicates that the method is intended to be a replacement for the base class version.

public class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("The dog barks.");
    }
}

Real-Time Example of C# Method Overriding

In this section, the reader will explore how method overriding is utilized in C# through a practical example, demonstrating its applicability in object-oriented programming.

Designing a Class Hierarchy

To illustrate method overriding, consider a basic class hierarchy within a graphics application. The base class, Shape, defines a virtual method Draw(). Two derived classes, Circle and Rectangle, will override this method to handle shape-specific drawing logic.

public class Shape
{
    public virtual void Draw()
    {
        Console.WriteLine("Drawing a shape.");
    }
}

public class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a circle.");
    }
}

public class Rectangle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a rectangle.");
    }
}

Implementing Method Overriding in C#

The Draw() method in the Shape class is marked with the virtual keyword, enabling it to be overridden. The Circle and Rectangle classes use the override keyword on their respective Draw() methods, altering the base implementation.

Testing Overridden Methods

Calling the Draw() method through a Shape reference to an instance of Circle or Rectangle triggers the overridden implementations.

Shape myCircle = new Circle();
Shape myRectangle = new Rectangle();
myCircle.Draw();   // Output: Drawing a circle.
myRectangle.Draw(); // Output: Drawing a rectangle.

This demonstrates polymorphism where the call to Draw() results in the correct method execution according to the actual object type, not the type of the reference.

Special Considerations

When dealing with method overriding in C#, developers must navigate a few critical areas to properly implement and utilize this feature in their codebase.

Overriding vs. Hiding Methods

In C#, overriding a method involves providing a new implementation in a derived class, whereas hiding a method, done with the new keyword, merely obscures the base class version. Overriding is a polymorphic behavior that allows a derived class to offer a different implementation for a method that is marked as virtual or abstract in the base class.

The ‘base’ Keyword Usage

The base keyword in C# grants access to the methods, properties, and other members of the base class. When overriding methods, base can be used to call the original method’s implementation in the context of the new overriding method, allowing base functionality to be extended rather than completely replaced.

Overriding and Constructors

Constructors cannot be overridden in C#, as they are not inherited by derived classes. However, a base class constructor can be called from the derived class constructor to ensure that the base class is properly initialized when an instance of the derived class is created.

Abstract Methods and Overriding

A class that contains one or more abstract methods must itself be declared as abstract. Derived classes are required to override these abstract methods unless the derived class is also declared abstract. Abstract methods serve as a blueprint for derived classes, dictating a contract that must be fulfilled with an implementation.

Best Practices for Method Overriding in C#

Method overriding is a critical feature in C# that allows a subclass to provide a specific implementation of a method already defined in its base class. This section lays out important practices to enhance code quality and maintainability.

Ensuring Liskov Substitution Principle

The Liskov Substitution Principle (LSP) dictates that objects of a superclass should be replaceable with objects of a subclass without affecting the correctness of the program. When overriding methods in C#:

  • Consistency in Signature: Ensure the overridden method’s signature strictly matches the base method’s signature.
  • Behavioral Subtyping: The overriding method should not alter the expected behavior, meaning it should fulfill the contract defined by the base method.

Use of ‘sealed’ Methods

sealed methods prevent further overriding and can be used to:

  • Finalize Behavior: Apply sealed to methods in derived classes to stop further modifications, ensuring a stable and predictable behavior.
  • Prevent Further Derivations: It clarifies the intention that the method’s behavior is complete and additional overrides are not desired.

Conclusion

Method overriding in C# allows developers to define a behavior in a base class and then provide a different implementation in a derived class. This feature delivers flexibility and a means to harness polymorphism, a core concept in object-oriented programming.

Key points about method overriding include:

  • It requires a base class method marked with the virtual keyword.
  • The overriding method in the derived class must use the override keyword.
  • Signature consistency between the base and derived methods is mandatory.
  • The base keyword allows calling the overridden method in the base class.

Method overriding provides several benefits:

  • Enhanced Code Reusability: Avoids code duplication by using existing base class methods.
  • Simplified Maintenance: Changes in the base method can propagate to derived classes.
  • Dynamic Binding: At runtime, the most relevant method is invoked depending on the object’s actual type.

A real-time example, such as a graphic system where Shape is a base class with a Draw method, and Circle and Rectangle are derived classes that override Draw, demonstrates how method overriding can influence the outcome based on the object’s type.

In this C# tutorial, I have explained everything about method overriding in C# with a real example that will help you to understand the concept properly.

You may also like: