zl程序教程

您现在的位置是:首页 >  其它

当前栏目

面向对象——密封类

面向对象
2023-09-14 09:05:45 时间

密封类

通过在类定义前面放置关键字 sealed,可以将类声明为密封类。例如:

public sealed class D

{

    // Class members here.

}

密封类不能用作基类。因此,它也不能是抽象类。密封类禁止派生。

由于密封类从不用作基类,所以有些运行时优化可以使对密封类成员的调用略快。

重写基类虚成员的派生类成员,如方法、字段、属性或事件,可被声明为密封成员。

在后续的派生类中,这将取消该成员的虚效果。方法是在类成员声明中将 sealed 关键字置于 override 关键字的前面。例如:

public class D : C

{

    public sealed override void DoWork() { }

}

特点:(1) 使用sealed关键字来定义密封类。

(2) 密封类不能被继承。

(3) 在密封类不能定义虚函数,不能定义抽象函数。

(4) 可以使用sealed关键字来密封方法,但是只有在覆盖基类的方法时才能使用sealed关键字。

(5) 使用sealed关键字密封的方法不能被覆盖,防止派生类进一步重写该方法,但能被重载,能被隐藏。

(6) 注意:在使用sealed关键字时,不能同时使用abstract或virtual关键字。

使用密封类注意一下几点: 1、密封类不能作为基类被继承,但它可以继承别的类或接口。

2、在密封类中不能声明受保护成员或虚方法,因为受保护成员和只能从派生类进行访问,而虚成员只能在派生类中重写。

3、由于密封类的不可继承性,因此密封类不能声明抽象的。

示例:

using System;

using System.Collections.Generic;

using System.Text;

namespace TestSealedClass_01

{ // 密封类 不能被继承

sealed class A

    {

        public void Method1()

        {}

        //错误,在密封类中不能定义虚函数

        //public virtual void Method2()

        //{}

        //错误,在密封类中不能定义抽象函数

        //public abstract void Method3();

    }

     //class B : A   //错误,密封类A不能被继承

    //{}

    class AutoMobile

    {

        public virtual void Display()

        {

            Console.WriteLine("这是基类 AutoMobile");

        }

        //Display()方法不是重写,所以不能使用sealed关键字

        //public sealed void Display()

        //{

        //    Console.WriteLine("这是基类 AutoMobile");

        //}

    }

    class Car : AutoMobile

    {

        //使用sealed关键字来密封方法

        public sealed override void Display()

        {

            Console.WriteLine("这是派生类 Car");

        }

       public void Display(string mark) //使用sealed关键字密封的方法,能被重载

       {

            Console.WriteLine("这是派生类 Car:{0}", mark);

        }

    }

    class SmallCar : Car

    {

        //使用sealde关键字密封的方法,不能被覆盖

        //public override void Display()

        //{}

        //使用sealde关键字密封的方法,能被隐藏

        public new void Display()

        {  Console.WriteLine("这是派生类 Car"); }

    }

    class Program

    {

        static void Main(string[] args)

        {

            Car car = new Car();

            car.Display();

        }

    }

}