• 【转】密封类


    10.3.1 密封类概述及声明

    10.3  密封类与密封方法

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

    10.3.1  密封类概述及声明

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

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

    类是静态类。

    类包含带有安全敏感信息的继承的受保护成员。

    类继承多个虚成员,并且密封每个成员的开发和测试开销明显大于密封整个类。

    类是一个要求使用反射进行快速搜索的属性。密封属性可提高反射在检索属性时的性能。

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

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

    说明:① 密封类不能作为基类被继承,但它可以继承别的类或接口。

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

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

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

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

    10.3.2 密封方法概述及声明

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

    例10.9  下面代码声明一个类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关键字主要是为派生类调用基类成员提供一种简写的方法。

    10.3.3  密封类与密封方法的使用

    密封类除了不能被继承外,与非密封类的用法大致相同,而密封方法则必须通过重写基类中的虚方法来实现。下面通过一个实例讲解如何在程序中使用密封类和密封方法。

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

     public class myClass1
    {
    /// <summary>/// 虚方法,用来显示信息/// </summary>
    public virtual void ShowInfo()
    {
    }
    }
    public sealed class myClass2 : myClass1 //密封类,继承自myClass1
    {
    private string id = "";
    //string类型变量,用来记录编号
    private string name = "";
    //string类型变量,用来记录名称
    /// <summary>/// 编号属性///
    ///</summary>
    public string ID
    {
    get{return id;}set{id = value;}
    }
    /// <summary>/// 名称属性/// </summary>
    public string Name
    {
    get{return name;}
    set{name = value;}
    }
    /// <summary>/// 密封并重写基类中的ShowInfo方法///
    /// </summary>
    public sealed override void ShowInfo()
    {
    Console.WriteLine(ID + " " + Name);
    }
    }
    class Program
    {
    static void Main(string[] args)
    {
    myClass2 myclass2 = new myClass2();
    //实例化密封类对象myclass2.ID = "BH0001";
    //为密封类中的编号属性赋值
    myclass2.Name = "TM"; //为密封类中的名称属性赋值
    myclass2.ShowInfo(); //调用密封类中的密封方法}
    }
    }

    运行结果为BH0001 TM。

    10.4  小结

    本章介绍了面向对象技术的高级应用,主要包括接口、抽象类、抽象方法、密封类及密封方法等内容。接口的存在可以使C#中存在多重继承,这样使得程序的结构更加合理;abstract关键字和sealed关键字分别实现了抽象和密封的定义,这两种方法使得程序的设计更加严密。这里需要注意的是,在声明密封方法时,必须通过重写基类中的虚方法实现。

  • 相关阅读:
    区域赛
    kd树的创建和求最近邻
    Fliptile POJ
    第六周作业
    第四次作业
    第三次作业
    第二周作业
    第一次作业
    董雅洁 我的第0次作业
    21 UI_布局 之 线性布局 xml配置方式
  • 原文地址:https://www.cnblogs.com/gzh4455/p/2399910.html
Copyright © 2020-2023  润新知