sealed

2017-11-21  本文已影响0人  慕城祉宇流年殇

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;

}

}

}

上一篇 下一篇

猜你喜欢

热点阅读