上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方法均不能被重写。