c# sealed修饰符

一、概述

sealed的中文意思是密封,故名思义,就是由它修饰的类、方法、属性将不能被继承或是重写。

MSDN上解释如下:

sealed 修饰符可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与 override 一起使用。将密封类用作基类或将 abstract 修饰符与密封类一起使用是错误的。

这段话虽然精简,但是可以挖掘的东西却很多,我们一个一个来。

二、主要内容

1、密封类

当sealed用于类时,说明该类是密封类,不能被继承。一般是用于子类,例如:

 public class human
    {
       public  int age{
             get;
             set;
         }
        public virtual void SayHello(){}
    }
 public sealed class chinese:human
    {
        public override void SayHello()
        {
            Console.WriteLine("你好!");
        }
    }
此时我们便不能对chinese类进行派生,否则会报如下错误:

“sealed_test.native”: 无法从密封类型“sealed_test.chinese”派生。
此外,sealed和abstract是互斥的,这很好理解。抽象类必须被继承,而密封类不允许继承,当然不能放在一起。

2、密封方法

当sealed应用于方法时,它会重写基类的方法,而且不能再在子类中被重写,而且必须和override一起使用。

sealed必须应用于重写的基类的方法,不能是子类自己的方法,例如:

  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。例如:

 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!");
        }
    }</span>

3、密封属性

密封属性类似于密封方法,sealed也只能和override一起使用,那么它只能应用于基类的虚属性,抽象属性或override了的属性。例如:

 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;
                }
            }
        }
    }

注:关于override可以参考下面的链接:https://msdn.microsoft.com/zh-cn/library/ebca9ah3.aspx

你可能感兴趣的:(c# sealed修饰符)