c# sealed修饰符
一、概述
sealed的中文意思是密封,故名思义,就是由它修饰的类、方法、属性将不能被继承或是重写。
MSDN上解释如下:
sealed 修饰符可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与 override 一起使用。将密封类用作基类或将 abstract 修饰符与密封类一起使用是错误的。
这段话虽然精简,但是可以挖掘的东西却很多,我们一个一个来。
二、主要内容
1、密封类
当sealed用于类时,说明该类是密封类,不能被继承。一般是用于子类,例如:
[csharp] view plain copy
public class human
{
public int age{
get;
set;
}
public virtual void SayHello(){}
}
public sealed class chinese:human
{
public override void SayHello()
{
Console.WriteLine("你好!");
}
}
此时我们便不能对chinese类进行派生,否则会报如下错误:
[html] view plain copy
“sealed_test.native”: 无法从密封类型“sealed_test.chinese”派生。
此外,sealed和abstract是互斥的,这很好理解。抽象类必须被继承,而密封类不允许继承,当然不能放在一起。
2、密封方法
当sealed应用于方法时,它会重写基类的方法,而且不能再在子类中被重写,而且必须和override一起使用。
sealed必须应用于重写的基类的方法,不能是子类自己的方法,例如:
[csharp] view plain copy
public class human
{
public int age{
get;
set;
}
public virtual void SayHello(){}
}
public sealed class chinese:human
{
public sealed override void SayHello()//是重写,可以密封,子类中不能再重写该方法
{
Console.WriteLine("你好!");
}
public sealed void dowork()//dowork不是重写,所以无法将其密封
{
Console.WriteLine("doing work!");
}
}
另外sealed应用于重写方法时,必须和override一起使用,这一点很好理解。因为sealed只能应用于重写方法,当然就必须使用override关键字,而且我们还可以得出结论,sealed只能应用于基类中的abstract、virtual和override方法,因为只有这些方法才可以被override。例如:
[csharp] view plain copy
public abstract class human
{
int age{
get;
set;
}
public virtual void SayHello(){}
public abstract void DoWork();
public void Run()//该方法不能在子类中被重写,也就不能被密封。
{
Console.WriteLine("running!");
}
}
public sealed class chinese:human
{
public sealed override void SayHello()
{
Console.WriteLine("你好!");
}
public sealed override void DoWork()
{
Console.WriteLine("doing work!");
}
}
3、密封属性
密封属性类似于密封方法,sealed也只能和override一起使用,那么它只能应用于基类的虚属性,抽象属性或override了的属性。例如:
[csharp] view plain copy
public abstract class human
{
public virtual int age{
get;
set;
}
}
public class chinese:human
{
private int _age;
public sealed override int age
{
get
{
return _age;
}
set
{
if(value>0){
_age = value;
}
}
}
网友评论