C#关键字之sealed详解

sealed作为形容词是封闭的,未知的。sealed修饰类时说明该类将不能被继承或重写,修饰方法(函数或属性)时可防止扩充类重写此方法(函数或属性)。通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱。恰当的使用sealed修饰符也可以在一定程度上提高运行效率,因为不用考虑继承类会重写该成员。

一、密封类
1.结构是隐匿密封的,因此不能继承,不能和abstract同时使用。
2.密封类中不可能有派生类。
3.若密封类实例中存在虚成员函数,该成员函数可以转化为非虚的,函数修饰符virtual不再生效。

二、密封方法
1.不能被重写,防止在方法所在类的派生类中对该方法进行重载。
2.并不是类的每个成员方法都可以作为密封方法,条件是必须对基类的虚方法进行重载,提供具体的实现方法。因此必须和override关键字一起使用,因为使用sealed修饰符的方法肯定是基类中相应的虚成员。

示例:

using System;
using System.Collections.Generic;
using System.Text; 

namespace Example06
{    
   class Program    
   {        
        class A        
        {            
           public virtual void F()            
           {                
               Console.WriteLine("A.F");            
           }            
           public virtual void G()            
           {                
               Console.WriteLine("A.G");            
           }        
        }        
        class B : A        
        {
            //重写虚方法F
            public sealed override void F()
            {
               Console.WriteLine("B.F"); 
            }
            //重写虚方法G
            public override void G() 
            {
                Console.WriteLine("B.G");
            } 
        }        
        class C : B
        {
             //以下是错误的,因为类B中的方法F是密封的,不能再被重写
             //public override void F()
             //{
             //    Console.WriteLine("C.F");
             //}

             //以下是方法重写是正确的
             public override void G()
             {
                 Console.WriteLine("C.G");
             }
        }
        static void Main(string[] args)
        {
            new A().F();//A.F
            new A().G();//A.G
            new B().F();//B.F
            new B().G();//B.G
            new C().F();//B.F  只能输出类B中对该方法的实现
            new C().G();//C.G
            Console.ReadLine();
        }
    }
}

你可能感兴趣的:(c#)