Home

Sealed Classes

     

Introduction

Any of the classes we have used so far can be inherited from. If you create a certain class and don't want anybody to derive another class from it, you can mark it as sealed. In other words, a sealed class is one that cannot serve as base for another class.

 

To mark a class as sealed, type the sealed keyword to the left of the class keyword. Here is an example:

sealed class Ball
{
	public int TypeOfSport;
	public string Dimensions;
}

If the class is marked with an access modifier, the sealed keyword can appear before or after the public keyword.

Here is an example:

public sealed class Ball
{
	public int TypeOfSport;
	public string Dimensions;
}

A class that is derived from another can also be sealed. Here is an example:

public abstract class Triangle
{
}

sealed public class Irregular : Triangle
{
}

There is not much to do about a sealed class. Simply remember that no class can be derived from it. After creating the sealed class, you can use it as you see fit. Here is an example:

using System;

public abstract class Triangle
{
    private double bs;
    private double hgt;

    public Triangle(double length = 0.00D, double height = 0.00D)
    {
        this.bs = length;
        this.hgt = height;
    }

    public virtual double Area()
    {
        return this.bs * this.hgt / 2;
    }

    public void Describe(string type = "")
    {
        Console.WriteLine("Triangle - {0}", type);
        Console.WriteLine("Base:   {0}", this.bs);
        Console.WriteLine("Height: {0}", this.hgt);
        Console.WriteLine("Area:   {0}", this.Area());
    }
}

sealed public class Irregular : Triangle
{
    public Irregular(double Base, double Height)
        : base(Base, Height)
    {
    }
}

public class Exercise
{
    public static int Main()
    {
        Irregular tri = new Irregular(42.73, 35.05);
        tri.Describe("Irregular");

        return 0;
    }
}

This would produce:

Triangle - Irregular
Base:   42.73
Height: 35.05
Area:   748.84325
Press any key to continue . . .

Besides creating a class with the sealed keyword, if you create a static class, it becomes automatically sealed. This means that you cannot derive a class from a static class. So, the sealed and the static class have in common that both are sealed. The difference is that you can declared a variable of a sealed class to access its members but you use the name of a static class to access its members.

Sealing a Property

If you use the sealed keyword on a class, the whole class becomes sealed. You may not want the whole class to be sealed. Sometimes, you may want only some members to be sealed. To create a sealed property, its class must be derived from another class. Here is an example of such as class created as abstract:

public abstract class RoundShape
{
    public virtual  double Radius { get; set; }
    public abstract double Diameter { get; }
}

Of course, you must derive a class from such as class. Before sealing a property, you must override it from the parent class. That is, you must marked the property in the derived class as override. Here are examples:

public abstract class RoundShape
{
    public virtual  double Radius { get; set; }
    public abstract double Diameter { get; }
}

public class Circle : RoundShape
{
    private double rad;

    public override double Radius
    {
        get
        {
            return this.rad;
        }

        set
        {
            this.rad = value;
        }
    }

    public  override double Diameter
    {
        get
        {
            return this.rad * 2;
        }
    }
}

You can still create a new class that is based on Circle and you can override the Radius property in that new class. If you want, you can prevent this. To seal a property, type the sealed keyword close to the override keyword. The sealed keyword can appear before or after override. Here are examples:

using System;

public abstract class RoundShape
{
    public virtual  double Radius { get; set; }
    public abstract double Diameter { get; }
}

public class Circle : RoundShape
{
    private double rad;

    public sealed override double Radius // sealed before override
    {
        get
        {
            return this.rad;
        }

        set
        {
            this.rad = value;
        }
    }

    public override sealed double Diameter // override before sealed = same thing
    {
        get
        {
            return this.rad * 2;
        }
    }
}

public class Exercise
{
    private static int Main(string[] args)
    {
        RoundShape circ = new Circle();
        circ.Radius = 42.86;

        Console.WriteLine("Circle Characteristics");
        Console.WriteLine("Radius:   {0}", circ.Radius);
        Console.WriteLine("Diameter: {0}", circ.Diameter);

        return 0;
    }
}

This would produce:

Circle Characteristics
Radius:   42.86
Diameter: 85.72
Press any key to continue . . .

When a member has been sealed, the child classes that derive from it cannot override that member. The following will cause an error:

public abstract class RoundShape
{
    public virtual  double Radius { get; set; }
    public abstract double Diameter { get; }
    //public abstract double Area();
}

public class Circle : RoundShape
{
    private double rad;

    public sealed override double Radius
    {
        get
        {
            return this.rad;
        }

        set
        {
            this.rad = value;
        }
    }

    public override sealed double Diameter
    {
        get
        {
            return this.rad * 2;
        }
    }
}

public sealed class Sphere : Circle
{
    private double rad;

    public override double Radius
    {
        get
        {
            return this.rad;
        }

        set
        {
            this.rad = value;
        }
    }
}

 This would produce:

Error	1	'Sphere.Radius.get': cannot override inherited member 
'Circle.Radius.get' because it is sealed	C:\Exercise1\Exercise.cs	47	9	Exercise1

Error	2	'Sphere.Radius.set': cannot override inherited member 
'Circle.Radius.set' because it is sealed	C:\Exercise1\Exercise.cs	52	9	Exercise1

Sealing a Method

Besides the properties, you can also seal a method. The primary rule to follow is that, if you know or suspect that a different version of a method will be needed by child classes, don't seal it. When deriving a new class, you have the option of sealing it or not. Here is an example:

using System;

public abstract class RoundShape
{
    public virtual  double Radius { get; set; }
    public abstract double Diameter { get; }
    public abstract double Area();
}

public class Circle : RoundShape
{
    private double rad;

    public sealed override double Radius
    {
        get
        {
            return this.rad;
        }

        set
        {
            this.rad = value;
        }
    }

    public override sealed double Diameter
    {
        get
        {
            return this.rad * 2;
        }
    }

    // Don't mark this method as "sealed" because the sphere must override it
    public override double Area() 
    {
        return this.rad * this.rad * 3.14159;
    }
}

public sealed class Sphere : Circle
{
    // We can now seal this method because we don't intend
    // to override it down. Its class is sealed already anyway
    public override sealed double Area() 
    {
        return 4 * this.Radius * this.Radius * 3.14159;
    }
}

public class Exercise
{
    private static int Main(string[] args)
    {
        RoundShape circ = new Circle();
        circ.Radius = 42.86;

        Console.WriteLine("Circle Characteristics");
        Console.WriteLine("Radius:   {0}", circ.Radius);
        Console.WriteLine("Diameter: {0}", circ.Diameter);
        Console.WriteLine("Area:     {0}\n", circ.Area());

        Sphere sph = new Sphere();
        sph.Radius = 35.75; ;

        Console.WriteLine("Sphere Characteristics");
        Console.WriteLine("Radius:   {0}", sph.Radius);
        Console.WriteLine("Diameter: {0}", sph.Diameter);
        Console.WriteLine("Area:     {0}", sph.Area());
        
        return 0;
    }
}

This would produce:

Circle Characteristics
Radius:   42.86
Diameter: 85.72
Area:     5771.036741564

Sphere Characteristics
Radius:   35.75
Diameter: 71.5
Area:     16060.5934775
Press any key to continue . . .

If you create a new method in a derived class, that is, a method that does not exist in the parent class, you cannot seal it. This means that you can seal only a method that can be overridden:

using System;

public abstract class RoundShape
{
    public virtual  double Radius { get; set; }
    public abstract double Diameter { get; }
    public abstract double Area();
}

public class Circle : RoundShape
{
    private double rad;

    public sealed override double Radius
    {
        get
        {
            return this.rad;
        }

        set
        {
            this.rad = value;
        }
    }

    public override sealed double Diameter
    {
        get
        {
            return this.rad * 2;
        }
    }

    // Don't mark this method as "sealed" because the sphere must override it
    public override double Area() 
    {
        return this.rad * this.rad * 3.14159;
    }
}

public sealed class Sphere : Circle
{
    // We can now seal this method because we don't intend
    // to override it down. Its class is sealed already anyway
    public override sealed double Area() 
    {
        return 4 * this.Radius * this.Radius * 3.14159;
    }
 
    // Cannot use "sealed" because this method is not inherited
    public double Volume()
    {
        return 4 * this.Radius * this.Radius * this.Radius * 3.14159 / 4;
    }
}

public class Exercise
{
    private static int Main(string[] args)
    {
        RoundShape circ = new Circle();
        circ.Radius = 42.86;

        Console.WriteLine("Circle Characteristics");
        Console.WriteLine("Radius:   {0}", circ.Radius);
        Console.WriteLine("Diameter: {0}", circ.Diameter);
        Console.WriteLine("Area:     {0}\n", circ.Area());

        Sphere sph = new Sphere();
        sph.Radius = 35.75; ;

        Console.WriteLine("Sphere Characteristics");
        Console.WriteLine("Radius:   {0}", sph.Radius);
        Console.WriteLine("Diameter: {0}", sph.Diameter);
        Console.WriteLine("Area:     {0}", sph.Area());
        Console.WriteLine("Volume:   {0}\n", sph.Volume());

        return 0;
    }
}

This would produce:

Circle Characteristics
Radius:   42.86
Diameter: 85.72
Area:     5771.036741564

Sphere Characteristics
Radius:   35.75
Diameter: 71.5
Area:     16060.5934775
Volume:   143541.554205156

Press any key to continue . . .
 
 

Home Copyright © 2010-2011 FunctionX