![]() |
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. 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 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 | |
|
|
||