sealed作为形容词是封闭的,未知的。sealed修饰类时说明该类将不能被继承或重写,修饰方法(函数或属性)时可防止扩充类重写此方法(函数或属性)。通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱。恰当的使用sealed修饰符也可以在一定程度上提高运行效率,因为不用考虑继承类会重写该成员。
一、密封类
1.结构是隐匿密封的,因此不能继承,不能和abstract同时使用。
2.密封类中不可能有派生类。
3.若密封类实例中存在虚成员函数,该成员函数可以转化为非虚的,函数修饰符virtual不再生效。
二、密封方法
1.不能被重写,防止在方法所在类的派生类中对该方法进行重载。
2.并不是类的每个成员方法都可以作为密封方法,条件是必须对基类的虚方法进行重载,提供具体的实现方法。因此必须和override关键字一起使用,因为使用sealed修饰符的方法肯定是基类中相应的虚成员。
示例:
using System;
using System.Collections.Generic;
using System.Text;
namespace Example06
{
class Program
{
class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
public virtual void G()
{
Console.WriteLine("A.G");
}
}
class B : A
{
//重写虚方法F
public sealed override void F()
{
Console.WriteLine("B.F");
}
//重写虚方法G
public override void G()
{
Console.WriteLine("B.G");
}
}
class C : B
{
//以下是错误的,因为类B中的方法F是密封的,不能再被重写
//public override void F()
//{
// Console.WriteLine("C.F");
//}
//以下是方法重写是正确的
public override void G()
{
Console.WriteLine("C.G");
}
}
static void Main(string[] args)
{
new A().F();//A.F
new A().G();//A.G
new B().F();//B.F
new B().G();//B.G
new C().F();//B.F 只能输出类B中对该方法的实现
new C().G();//C.G
Console.ReadLine();
}
}
}