• C#中密封类和密封方法


    目录

    一、定义与特性

    1.何时使用密封类

    2.定义

    3.特性

    二、示例


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

    一、定义与特性

            密封类可以用来限制扩展性,如果密封了某个类,则其他类不能从该类继承;如果密封了某个成员,则派生类不能重写该成员的实现。默认情况下,不应密封类型和成员。

    1.何时使用密封类

    1. C#中使用密封类时,如果类满足如下条件,则应将其密封:
    2. ☑ 类包含带有安全敏感信息的继承的受保护成员。
    3. ☑ 类继承多个虚成员,并且密封每个成员的开发和测试开销明显大于密封整个类。
    4. ☑ 类是一个要求使用反射进行快速搜索的属性。密封属性可提高反射在检索属性时的性能。

    2.定义

    1. C#中声明密封类时需要使用sealed关键字,具体语法格式如下:
    2. 访问修饰符 sealed class 类名:基类或接口
    3. {
    4. //类成员
    5. }

    3.特性

    • 密封类不能作为基类被继承,但它可以继承别的类或接口。
    • 在密封类中不能声明受保护成员或虚成员,因为受保护成员只能从派生类进行访问,而虚成员只能在派生类中重写。
    • 由于密封类的不可继承性,因此密封类不能声明为抽象的,即sealed修饰符不能与abstract修饰符同时使用
    • 并不是每个方法都可以声明为密封方法,密封方法只能用于对基类的虚方法进行实现,并提供具体的实现。所以,声明密封方法时,sealed修饰符总是和override修饰符同时使用
    • 密封类除了不能被继承外,与非密封类的用法大致相同,只能通过实例化密封类的对象来访问,而不能被继承。而密封方法则必须通过重写基类中的虚方法来实现。

    二、示例

            声明一个密封类myClass2,继承自myClass1类,在myClass2密封类中声明两个公共属性,分别用来表示用户编号和名称,然后密封并重写myClass1基类中的虚方法ShowInfo(),并提供具体的实现。最后在主程序类ProgramMain()方法中实例化MyClass2密封类的一个对象,然后使用该对 象访问myClass2密封类中的公共属性和密封方法。

    1. // 密封类和密封方法
    2. namespace _05
    3. {
    4. public class MyClass1
    5. {
    6. public virtual void Showlnfo() //虚方法,用来显示信息
    7. {
    8. }
    9. }
    10. public sealed class MyClass2 : MyClass1 //密封类,继承自myClass1
    11. {
    12. private string id = ""; //string类型变量,用来记录编号
    13. private string name = ""; //string类型变量,用来记录名称
    14. public string ID //编号属性
    15. {
    16. get
    17. {
    18. return id;
    19. }
    20. set
    21. {
    22. id = value;
    23. }
    24. }
    25. public string Name // 名称属性
    26. {
    27. get
    28. {
    29. return name;
    30. }
    31. set
    32. {
    33. name = value;
    34. }
    35. }
    36. public sealed override void Showlnfo() //密封并重写基类中的Showlnfo()方法
    37. {
    38. Console.WriteLine(ID + "" + Name);
    39. }
    40. }
    41. class Program
    42. {
    43. static void Main(string[] args)
    44. {
    45. MyClass2 myclass2 = new() //实例化密封类对象
    46. {
    47. ID = "BH0001", //为密封类中的编号属性赋值
    48. Name = "TM" //为密封类中的名称属性赋值
    49. };
    50. myclass2.Showlnfo(); //调用密封类中的密封方法
    51. }
    52. }
    53. }
    54. //运行结果:BH0001TM

  • 相关阅读:
    【自然语言处理(NLP)】基于Transformer的英文自动文摘
    药物管理信息系统(C#药材信息管理系统)
    AI相关资料整理
    知识变现海哥:知识付费的本质不是知识,而是解决问题
    (vue)iView 表格点击编辑按钮后编辑当前行
    【解刊】Elsevier旗下CCF-B类,3区SCI,见刊快,值得投吗?
    企业云成本管控,你真的做对了吗?
    网络基础2(上):http协议、tcp/udp协议
    基于Java的农资采购销售管理系统设计与实现(源码+lw+部署文档+讲解等)
    企业级软件开发流程
  • 原文地址:https://blog.csdn.net/wenchm/article/details/134530326