C# 中的密封类
密封类
如果我们不希望一个类被其他的类继承,我们可以把这个类定义为密封类。定义密封类需要使用 sealed 关键字。下面的代码定义了一个关于圆的密封类;
sealed class Circle
{
public int radius; //圆的半径
public double GetInfo()
{
return 2*Math.PI*radius;
}
class RedCircle : Circle
{
}
把类定义为密封时,最有可能的情形是;如果要对库,类或自己编写的其他类进行操作,则重写某些功能会导致错误;也可以因商业原因把类标记为密封类,以防止第三方以违反注册协议的方式扩展该类。把类标记为 sealed 会严重限制它的使用。 .NET 基类库提供了许多密封类,System.String 就是其中一个。{
}
使用 sealed 修饰的类成员不能被 protected 修饰,否则编译器会报警告!
除了修饰类, sealed 关键字也可以修饰方法。如果某个方法用 sealed 修饰则表示该方法不能被子类重写。不是任何方法都可以用 sealed 修饰的,在一个类中定义的新方法是不能用 sealed 修饰的,只有在子类中重写了基类的方法才可以用 sealed 修饰。在Circle 类中,如果我们把 GetInfo 方法的定义改为“public sealed double GetInfo()”则会报“GetInfo()不是重写方法,所以无法将其密封”的错误。下面的代码演示了如何密封方法:
class A
{
public virtual void ShowInfo()
{
Console.WriteLine("基类的方法");
}
}
class B :A
{
public override sealed void ShowInfo()
{
Console.WriteLine("该方法不能再被重写了!");
}
}
因为 B 类的 ShowInfo 方法是重写了 A 类的ShowInfo 方法,所以可以使用 sealed 修饰。如果再有下面的代码,则会报编译错误:{
public virtual void ShowInfo()
{
Console.WriteLine("基类的方法");
}
}
class B :A
{
public override sealed void ShowInfo()
{
Console.WriteLine("该方法不能再被重写了!");
}
}
class C :B
{
public override void ShowInfo()
{
Console.WriteLine("继续重写基类的方法!");
}
}
sealed 关键字提供了一种方式,可以确保列或方法是最终的版本,不可以再被继承或重写。
{
public override void ShowInfo()
{
Console.WriteLine("继续重写基类的方法!");
}
}