C# 密封类和密封方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 密封类和密封方法相关的知识,希望对你有一定的参考价值。


  1. C#中使用关键字sealed,将类和方法声明为密封类或者密封方法;   

sealed class A  //密封类
  {
    
   }
 
   public sealed override void N()  //密封方法
   {
       Console.WriteLine();
    }


2.对于密封类来说,表示该类不能被继承;对于密封方法来说,表示该方法不能被重写;

 

  例①:   

//对于密封类来说,表示该类不能被继承
    sealed class A
    {
    }
    class B : A //错误提示:B无法从密封类型A派生
    {
    }

 

 例②:    

class A
    {
        public virtual void M()
        {
            Console.WriteLine("M()方法被调用!");
        }
        
        public virtual void N()
        {
            Console.WriteLine("N()方法被调用!");
        }
    }
    
    class B : A
    {
        public override void M()
        {
            Console.WriteLine("M()方法被重写!");
        }
        
        public sealed override void N()
        {
            Console.WriteLine("N()方法被重写并被密封!");
        }
    }
    
    class C : B
    {
       public override void M() //B重写了A中的N方法而且没有密封,C就可以重写B中的N方法了
       {
            Console.WriteLine("M()方法!");
       }
       
        public override void N() //报错,B重写了A中的N方法并密封,C就无法重写B中的N方法了
        {
        }
    }


3.密封类不能作为基类被继承,但它可以继承别的类或借口;   

      interface D //声明一个接口
    {
    }
    
    sealed class A : B  //密封类可以继承其他非密封类
    {
    }
    
    sealed class C : D //密封类可以继承接口
    {
    }
    
    class B : A  // 报错,B无法从密封类型A派生,密封类不能被继承
    {
    }

  

4.密封类不能被声明为抽象的,因为抽象类总希望被继承,而密封类不能被继承。(sealed和abstract不  能修饰一个类名)

      sealed abstract class A  //抽象类不能同时又是密封的或者静态的
    {
        
    }


5.在密封类中不能声明受保护成员(声明了也不报错)、虚成员、抽象成员,因为受保护成员只能从派生  类进行访问,而虚成员只能在派生类中重写,非抽象类中不能有抽象方法。

      sealed class A  
    {
        protected void B() //不报错,密封类中声明了新的保护成员
        {
        }
        
        public virtual void C() //报错,错误提示: C是密封类A中的虚拟成员
        {
        }
        
        public abstract void D(); //报错,错误提示: D是抽象的,但是它包含在非抽象类A中
    }


6.并不是每个方法都可以声明为密封方法,密封方法只能用于对基类的虚方法进行实现并提供具体的实  现,所以,声明密封方法时,sealed总是和override同时使用。

  如2.中的例②。


以上是关于C# 密封类和密封方法的主要内容,如果未能解决你的问题,请参考以下文章

C#之密封类(详解)

解读经典《C#高级编程》第七版 Page100-107.继承.Chapter4

jqc#零基础学习之路抽象类和密封

C#:在密封类中模拟和测试受保护(或私有)方法——方法

静态和密封类差异

深入kotlin-数据类和密封类