【C#】——密封类与密封方法

    如果所有类都可以被继承,那么很容易导致继承的滥用,进而使类的层次结构体系变得十分复杂,这样使开发人员对类的理解和使用变得十分困难。为了避免滥用继承,C#中提出了密封类的概念。


密封类概述及声明

    密封类可以用来限制扩展性,如果密封了某各类,则其他类不能从该类继承;如果密封了某个成员,则派生类不能重写该成员的实现。默认情况下,不应密封类型和成员。密封可以防止对库的类型和成员进行自定义,但也会硬性某些开发人员对可用性的认识。

C#中使用密封类时,如果满足如下条件,则应将其密封

  • 类时静态类。
  • 类包含带有安全敏感信息的继承的手保护成员。
  • 类继承多个虚成员,并且密封每个成员的开发和测试开销明显大于密封整个类。
  • 类时一个要求使用反射进行快速搜索的属性。密封属性可提高反射在检索属性时的性能。

C#中声明密封类时需要使用 sealed 关键字,具体语法格式如下:

    访问修饰符 sealed class 类名:基类或接口
    {
        //类成员
    }

说明:

1.密封类不能作为基类被继承,但它可以继承别的类或接口。

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

3.由于密封类的阿不可继承性,因此密封类不能声明为抽象的,即 sealed 修饰符不能与 abstract 修饰符同时使用。

【例1】声明一个密封类,该密封类中包含一个 int 类型的变量和一个无返回值类型的方法,它们只能通过实例化密封类的对象来访问,而不能被继承。

    public sealed class myClass //声明密封类
    {
        public int =0;
        public void method()
        {
            Console.WriteLine("密封类"):
        }
    }


密封方法概述及声明

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

【例2】声明一个类 myClass1 ,该类中声明一个虚方法 Method。然后声明一个密封类 myClass2 ,该类继承自 myClass1 类,在密封类 myClass2 中密封并重写 myClass1 类中的虚方法 Method。

    public class myClass1 //声明密封类
    {
        public virtual void Method()
        {
            Console.WriteLine("基类中的虚方法");
        }
    }
    public sealed class myClass2 : myClass1
    {
        public sealed override void Method()  //密封并重写基类中的虚方法Method
        {
            base.Method();
            Console.WriteLine("密封类中重写后的方法");
        }
    }

说明:上面的代码中,密封并重写基类中的虚方法 Method 时,用到了“base.Method();”语句,该语句表示调用基类中的 Method 方法。base 关键字主要是为派生类调用基类成员提供一种简写的方法。


密封类与密封方法的使用

    密封类除了不能被继承外,与非密封类的用法大致相同,而密封方法则必须通过重写基类中的虚方法来实现。

【例3】创建一个控制台应用程序,其中声明一个类 myClass1 ,该类中声明了一个虚方法 ShowInfo ,用来显示信息。然后声明一个密封类 myClass2 ,继承自 myClass1 类,在 myClass2 密封类中声明两个公共属性,分别用来表示用户编号和名称。急着密封并重写 myClass1 基类中的虚方法 ShowInfo,并提供具体的实现。最后在主程序类 Program 的 Main 方法中实例化 MyClass2 密封类的一个对象,然后使用该对象访问 myClass2 密封类中的公共属相和密封方法。

    public class myClass1
    {
        public virtual void ShowInfo() //虚方法,用来显示信息
        {

        }
    }
    public sealed class myClass2 : myClass1 //密封类,继承 myClass1
    {
        private string id = "";
        private string name ="";
        public string ID
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        public sealed override void ShowInfo()
        {
            Console.WriteLine(ID + "" + Name);
        }
    }
    class Program
    {
        static void Main(atring[] args)
        {
            myClass2 myclass2 = new myClass2();
            myclass2.ID = "BH0001";
            myclass2.Name = "TM";
            myclass2.ShowInfo();
        }
    }
    //运行结果为 BH0001 TM
小结:接口的存在可以使C#中存在多重继承,这样使程序结构更加合理。 abstract 关键字和 sealed 关键字分别实现了抽象和密封的定义,这两种方法时程序的设计更加严密。这里需要注意的是,在声明密封方法时,必须通过重写基类中的虚方法实现。

猜你喜欢

转载自blog.csdn.net/cangsheng45/article/details/79781620
今日推荐