DEV Community

Cover image for Learn Open Closed Principle in C# (+ Examples)
ByteHide
ByteHide

Posted on • Edited on • Originally published at bytehide.com

Learn Open Closed Principle in C# (+ Examples)

The Open/Closed Principle (OCP) is a core tenet of the SOLID principles in object-oriented programming. By understanding and applying the OCP in C#, developers can create maintainable, scalable, and flexible software systems.

This article will discuss the Open/Closed Principle in C#, provide examples, and share best practices to help developers craft clean and robust code.

Defining the Open/Closed Principle (OCP)

The Open/Closed Principle, introduced by Bertrand Meyer, states that software entities (such as classes, modules, and functions) should be open for extension but closed for modification.

In other words, developers should be able to add new functionality to a class without changing its existing implementation. This can be achieved through abstraction, inheritance, and polymorphism.

open closed principle example c#

Why is the Open/Closed Principle Important?

Adhering to the OCP promotes a more maintainable, flexible, and scalable codebase.

By ensuring that classes are open for extension and closed for modification, developers can add new functionality without altering existing code, minimizing the risk of introducing bugs or breaking existing features.

This principle encourages the use of abstractions and promotes a modular architecture that is easier to understand, test, and refactor.

Open/Closed Principle in C#: Key Concepts

To understand the OCP in C#, let’s explore some key concepts:

Abstraction

Abstraction is a technique that allows developers to hide the internal implementation details of a class and expose only its essential features. By using abstraction, developers can create flexible and extensible designs that are less susceptible to change.

Inheritance and Polymorphism

Inheritance is a mechanism in C# that allows one class to inherit the properties and methods of another class, while polymorphism enables a class to have multiple implementations based on the context.

These concepts play a crucial role in achieving the Open/Closed Principle, as they allow developers to extend classes without modifying their existing implementation.

Open/Closed Principle C# Example

Let’s consider an example to demonstrate the Open/Closed Principle in C#. Suppose we have a Shape class and a AreaCalculator class that calculates the area of different shapes:



public class Shape
{
    public double Width { get; set; }
    public double Height { get; set; }
}

public class AreaCalculator
{
    public double CalculateArea(Shape shape)
    {
        return shape.Width * shape.Height;
    }
}


Enter fullscreen mode Exit fullscreen mode

In this example, the AreaCalculator class can only calculate the area of rectangles. If we want to add support for other shapes, such as circles and triangles, we would need to modify the existing implementation of the AreaCalculator class, which violates the Open/Closed Principle.

To adhere to the OCP, we can use abstraction and inheritance to create separate classes for each shape type and provide a consistent method for calculating the area:



public abstract class Shape
{
    public abstract double CalculateArea();
}

public class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }

    public override double CalculateArea()
    {
        return Width * Height;
    }
}

public class Circle : Shape
{
    public double Radius { get; set; }

    public override double CalculateArea()
    {
        return Math.PI * Math.Pow(Radius, 2);
    }
}

public class AreaCalculator
{
    public double CalculateArea(Shape shape)
    {
        return shape.CalculateArea();
    }
}



Enter fullscreen mode Exit fullscreen mode

Now, the AreaCalculator class adheres to the Open/Closed Principle, as it can support new shapes without modifying its existing implementation.

Strategies for Implementing the Open/Closed Principle in C

Here are some strategies to help implement the Open/Closed Principle in C#:

Using Abstract Classes

Abstract classes can be used to define a base class with common functionality and provide a consistent interface for derived classes. By creating abstract methods, developers can enforce that each derived class implements its own version of the method, allowing for extensibility without modifying the base class.

Leveraging Interfaces

Interfaces in C# can be used to define a contract that classes must adhere to. By implementing interfaces, developers can create flexible designs that can be easily extended and modified without affecting existing implementations.

Applying the Strategy Pattern

The Strategy Pattern is a behavioral design pattern that enables selecting an algorithm at runtime. It can be used to implement the Open/Closed Principle by encapsulating different algorithms within separate classes and providing a common interface for them.

OCP: Best Practices

To ensure adherence to the Open/Closed Principle, follow these best practices:

  • Use abstraction and inheritance to create extensible designs.
  • Leverage interfaces to define flexible contracts.
  • Encapsulate varying behavior using design patterns, such as the Strategy Pattern.

Open/Closed Principle and Other SOLID Principles

The Open/Closed Principle is an integral part of the SOLID principles, ensuring that software entities are open for extension and closed for modification. Adhering to the OCP often goes hand-in-hand with following the other SOLID principles, resulting in a maintainable and flexible codebase.

Real-World Applications of the Open/Closed Principle

Applying the Open/Closed Principle in real-world scenarios can lead to cleaner, more maintainable software systems. For example, when designing a payment processing system, adhering to the OCP helps evelopers easily add support for new payment methods without altering existing code.

By creating an abstract Shape class or an IShape interface, new payment methods can be added as separate classes, ensuring that the core payment processing logic remains unchanged and adheres to the OCP.

Conclusion

The Open/Closed Principle is a fundamental concept in object-oriented programming and a core tenet of the SOLID principles. By adhering to the OCP in C#, developers can create maintainable, scalable, and flexible software systems that are easier to extend and modify.

By understanding key concepts such as abstraction, inheritance, and polymorphism, and following best practices for implementing the Open/Closed Principle, developers can craft clean and robust code that stands the test of time.

Top comments (1)

Collapse
 
ant_f_dev profile image
Anthony Fung

Great overview!

By making classes closed for modification, it means that existing behaviours using those classes shouldn't have changed. The bonus of that is that manual testing for those unchanged components will not need to be as rigorous as if they had been modified.