sealed 密封类,为了避免滥用继承
形式:
public sealed class myClass2
密封类不能作为基类被别的元素继承,但其可以继承别的类或接口
密封类中不能声明受保护成员或虚成员,因为受保护成员只能在派生类中访问,而虚成员只能在派生类中重写方法
密封类的不可继承性,是因为不能声明为抽象类,即sealed前不能用abstract修饰。
使用密封类的情况:
1.如果是静态类
2.类中包含敏感信息的
3.类继承多个虚成员,不如整个密封
4.类要求是一个提供反射快速搜索,密封类搜索好
密封方法
并不是每个方法都可以声明为密封方法,密封方法只能用于对基类的虚方法进行实现,并提供具体的实现。
所以,声明密封方法时,sealed修饰符总是和override修饰符同时使用
public class myclass
{
public virtual void method()
{
Console.WriteLine("基类中的虚方法");
}
}
public sealed class myclass2:myclass
{
public sealed overrider void method()
{
base.method();
Console.WriteLine("重写后的方法");
}
}
说明:base.method();表示调用基类中的method方法,base关键字主要是为派生类调用基类成员提供一种简写形式
密封类和密封方法
密封类除了不能继承外和其他非密封类差不多。而密封方法则必须通过重写基类中的虚方法来实现。
例子:
namespace Test
{
public class myClass1
{
/// <summary>
/// 虚方法,用来显示信息
/// </summary>
public virtual void ShowInfo()
{
}
}
public sealed class myClass2 : myClass1 //密封类,继承自myClass1
{
private string id = ""; //string类型变量,用来记录编号
private string name = ""; //string类型变量,用来记录名称
/// <summary>
/// 编号属性
/// </summary>
public string ID
{
get
{
return id;
}
set
{
id = value;
}
}
/// <summary>
/// 名称属性
/// </summary>
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
/// <summary>
/// 密封并重写基类中的ShowInfo方法
/// </summary>
public sealed override void ShowInfo()
{
Console.WriteLine(ID + " " + Name);
}
}
class Program
{
static void Main(string[] args)
{
myClass2 myclass2 = new myClass2(); //实例化密封类对象
myclass2.ID = "BH0001"; //为密封类中的编号属性赋值
myclass2.Name = "TM"; //为密封类中的名称属性赋值
myclass2.ShowInfo(); //调用密封类中的密封方法
}
}
}
运行结果BH0001 TM