Understanding Sealed Classes in C#

Introduction

In object-oriented programming, inheritance allows a class to be derived from another class, inheriting its properties and behaviors. However, there are scenarios where you might want to restrict further inheritance. This is where the sealed keyword in C# becomes useful. A sealed class cannot be inherited. This article will delve into the concept of sealed classes in C#, exploring their usage and benefits and providing practical examples.

What is a Sealed Class?

A sealed class in C# is a class that cannot be extended or inherited by any other class. When you define a class as sealed, you essentially tell the compiler that this class is the final class and cannot serve as a base class.

Why Use Sealed Classes?

There are several reasons to use sealed classes.

  1. Preventing Inheritance: By sealing a class, you prevent other classes from inheriting it, which can be useful for complete classes and should not be extended.
  2. Performance Optimization: The JIT compiler can optimize sealed classes more effectively because it knows there will be no subclasses.
  3. Security and Integrity: Sealed classes can help maintain the security and integrity of your code by preventing unintended or harmful inheritance.

Defining a Sealed Class

To define a sealed class, use the sealed keyword before the class definition. Here's a basic example.

public sealed class SealedClass
{
    public void DisplayMessage()
    {
        Console.WriteLine("This is a sealed class.");
    }
}

Attempting to Inherit a Sealed Class

If you try to inherit from a sealed class, the compiler will throw an error. For instance.

public class DerivedClass : SealedClass
{
    // This will cause a compile-time error.
}

Sealed Methods

In addition to sealing entire classes, you can also seal individual methods in a class. This is particularly useful in inheritance hierarchies where you want to prevent further overriding of a method. To seal a method, the method must be an override in a derived class.

Here's an example

public class BaseClass
{
    public virtual void DisplayMessage()
    {
        Console.WriteLine("Message from BaseClass");
    }
}

public class DerivedClass : BaseClass
{
    public sealed override void DisplayMessage()
    {
        Console.WriteLine("Message from DerivedClass");
    }
}

public class FurtherDerivedClass : DerivedClass
{
    // Attempting to override DisplayMessage here will cause a compile-time error.
}

Practical Example of a Sealed Class

Consider a scenario where you have a class representing a configuration for an application. You might want to seal this class to ensure that the configuration structure remains unchanged.

public sealed class AppConfig
{
    public string ApplicationName { get; set; }
    public string Version { get; set; }
    public string DatabaseConnectionString { get; set; }

    public void DisplayConfig()
    {
        Console.WriteLine($"Application Name: {ApplicationName}");
        Console.WriteLine($"Version: {Version}");
        Console.WriteLine($"Database Connection String: {DatabaseConnectionString}");
    }
}

public class Program
{
    public static void Main()
    {
        AppConfig config = new AppConfig
        {
            ApplicationName = "MyApp",
            Version = "1.0.0",
            DatabaseConnectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"
        };

        config.DisplayConfig();
    }
}

In this example, the AppConfig class is sealed to ensure that the configuration structure and behavior remain consistent and unaltered.

Conclusion

Sealed classes in C# provide a powerful way to prevent inheritance, optimize performance, and maintain the integrity of your code. By understanding when and how to use sealed classes, you can design more robust and secure applications. Whether it's for preventing further derivation or sealing critical methods in your class hierarchy, the sealed keyword is a valuable tool in the C# developer's toolkit.


Similar Articles