C#程序设计自学经典
上QQ阅读APP看书,第一时间看更新

5.6 密封类与密封方法

在C#中,不能被继承的类称为密封类(sealed),密封类可以用来限制扩展性。如果密封了某个方法,则该成员不能被重写。

C#中使用sealed关键字来实现类或方法等成员变量的密封,其语法格式如下:

    访问修饰符 sealed class 类名
    {
        //类成员
    }

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

一个密封成员必须对虚成员或隐含虚成员进行重写,如抽象成员。但是,密封成员自己是不能被重写的,因为它是密封的。虽然密封成员不能被重写,但是一个在基类中的密封成员可以用new修饰符在派生类中进行隐藏。更重要的是,由于密封类从不用作基类,所以有些运行时优化可以略微提高密封类成员的调用速度。

下面以一个小例子来说明密封类与密封成员。

例5-11:密封类与密封成员(ConsoleSealed)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleSealed
    {
        class Program
        {
            static void Main(string[] args)
            {
                Cars cars = new HatchbackCars();
                cars.FuelConsumption();
    
                cars = new Sedan();
                cars.FuelConsumption();
    
                HatchbackCars hCars = new HatchbackCars();
                hCars.FuelConsumption();
    
                Sedan sedan = new Sedan();
                sedan.FuelConsumption();
    
                Console.ReadLine();
            }
        }
    
        public abstract class Cars
        {
            public virtual void FuelConsumption()
            {
                Console.WriteLine("Cars油耗");
            }
        }
    
        public sealed class HatchbackCars : Cars
        {
            public sealed override void FuelConsumption()
            {
                Console.WriteLine("HatchbackCars油耗");
            }
        }
    
        public sealed class Sedan : Cars
        {
            public sealed override void FuelConsumption()
            {
                Console.WriteLine("Sedan油耗");
            }
        }
    } 

运行结果如图5-11所示。

图5-11 密封类与密封成员

在此例中,HatchbackCars和Sedan类不能被进一步地细化。此外,HatchbackCars. FuelConsumption与Sedan.FuelConsumption方法均不能被重写。