sealed 修饰符表示密封

用于类时,表示该类不能再被继承,不能和 abstract 同时使用,因为这两个修饰符在含义上互相排斥

用于方法和属性时,表示该方法或属性不能再被重写,必须和 override 关键字一起使用,因为使用 sealed 修饰符的方法或属性肯定是基类中相应的虚成员

通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱

恰当的利用 sealed 修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员

示例:

Code
using System;
using System.Collections.Generic;
using System.Text;

namespace Example06
{    
   class Program    
   {        
    class A        
    {            
       public virtual void F()            
       {                
           Console.WriteLine("A.F");            
       }            
       public virtual void G()            
       {                
           Console.WriteLine("A.G");            
       }        
    }        
    class B : A        
    {            
        public sealed override void F()
        {
           Console.WriteLine("B.F"); 
        }            
        public override void G() 
        {
            Console.WriteLine("B.G");
        } 
    }        
    class C : B
    {
         public override void G()
         {
             Console.WriteLine("C.G");
         }
    }
        static void Main(string[] args)
        {
            new A().F();
            new A().G();
            new B().F();
            new B().G();
            new C().F();
            new C().G();
            Console.ReadLine();
        }
    }
}using System;
using System.Collections.Generic;
using System.Text;

namespace Example06
{    
   class Program    
   {        
    class A        
    {            
       public virtual void F()            
       {                
           Console.WriteLine("A.F");            
       }

在基类(父类)中用virtual修饰符声明一个虚方法,然后在在派生类(子类)中用override修饰符覆盖基类虚方法。表明是对基类的虚方法重载。
这种优势在于它可以在程序运行时再决定调用哪一个方法,这就是所谓的“运行时多态”
或者称动态绑定。

public virtual void G()            
       {                
           Console.WriteLine("A.G");            
       }        
    }        
    class B : A        
    {            
        public sealed override void F()
        {
           Console.WriteLine("B.F"); 
        }            
        public override void G() 
        {
            Console.WriteLine("B.G");
        } 
    }        
    class C : B
    {
         public override void G()
         {
             Console.WriteLine("C.G");
         }
    }
        static void Main(string[] args)
        {
            new A().F();
            new A().G();
            new B().F();
            new B().G();
            new C().F();
            new C().G();
            Console.ReadLine();
        }
    }
}

结果: 类 B 在继承类 A 时可以重写两个虚函数,如图所示:

由于类 B 中对 F 方法进行了密封, 类 C 在继承类 B 时只能重写一个函数,如图所示:

控制台输出结果,类 C 的方法 F 只能是输出 类B 中对该方法的实现:

A.F A.G B.F B.G B.F C.G

转载于:https://www.cnblogs.com/TJessica/p/7059391.html

简述c#之sealed 修饰符相关推荐

  1. C#--virtual,abstract,override,new,sealed修饰符学习

    1.参考博客  http://www.cnblogs.com/oneword/archive/2009/07/02/1515279.html http://www.cnblogs.com/mygood ...

  2. 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)

    访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...

  3. c# 访问修饰符的访问权限

    1. 访问修饰符. 指定声明的类型和类型成员的可访问性. (1) public:是类型和类型成员的访问修饰符.公共访问是允许的最高访问级别.对访问公共成员没有限制. (2) private:是一个成员 ...

  4. python修饰符用法_c#教程之C#语言中的修饰符汇总

    https://www.xin3721.com/eschool/python.html 修饰符是用于限定类型以及类型成员的申明的一种符号. 下面主要从C#中的访问修饰符,作用于类和结构的修饰符,用在方 ...

  5. 用sealed修饰的类有什么特点

    sealed 修饰符用于防止从所修饰的类派生出其它类.如果一个密封类被指定为其他类的基类,则会发生编译时错误. 密封类不能同时为抽象类. sealed 修饰符主要用于防止非有意的派生,但是它还能促使某 ...

  6. C# 访问修饰符和声明修饰符

    一.访问修饰符的基本说明 1.public: 公有的,是类和类成员的访问修饰符,访问不受限制 2.private: 私有的,是一个成员访问修饰符,不能修饰类,只有在声明它的类和结构内部可以访问 3.i ...

  7. 第四回 基类中的修饰符,应该根据你对架构的理解去定义它们,没有绝对的

    基类中的修饰符,其实就是C#里的那几种修饰符,public ,proteced,internal,privat这四种基础类型,当然也还一个组合类型internal protected,它们都是C#里最 ...

  8. [译]Effective Kotlin系列之探索高阶函数中inline修饰符(三)

    简述: 不知道是否有小伙伴还记得我们之前的Effective Kotlin翻译系列,之前一直忙于赶时髦研究Kotlin 1.3中的新特性.把此系列耽搁了,赶完时髦了还是得踏实探究本质和基础,从今天开始 ...

  9. 【转】c#中类的默认访问修饰符

    最近去面试,被问到c#中类的默认访问修饰符,被搞晕了,回来在网上找到一篇好文章,才明白到底是怎么回事. 以下转自:http://blog.163.com/wangzhenbo85@126/blog/s ...

最新文章

  1. Android 进阶 Fragment 介绍和使用 (一)
  2. Matlab-使用逻辑值进行索引
  3. thinkphp通过模型查询mysql_thinkPHP视图模型详解,把mysql表关联简单化!
  4. wxWidgets:wxSpinCtrlDouble类用法
  5. SAP Fiori国际化支持之UI5 RTL support的实现原理
  6. Springboot-Jpa多数据库配置-2.0+版本
  7. matlab如何画函数的外包络曲线,怎样在MATLAB中划出一个函数的包络线?
  8. 分析mysql慢查询_mysql慢查询的分析方法_MySQL
  9. ArcGIS 可视性分析
  10. Atitit 提升开发效率几大策略 目录 1. 提升效率三原则 2 1.1. 更少的工作 2 1.2. 优化配置减少等待 2 1.3. 提升一次性处理能力 2 2. 方法提升 3 2.1. 分类优
  11. JMETER badboy 下载及安装
  12. html怎么用2个caption不换行,caption怎么用
  13. 从零开始的unity3d入门教程(二)----基本功能讲解
  14. 淘客app开发成本要多少
  15. 进制转换【最全进制转换汇总】(整数_小数_正数_负数)正负数整数小数十进制转任意进制-正负数整数小数任意进制转十进制-正负数低进制转高进制-正负数高进制转低进制
  16. 想知道如何图片转文字?这几个方法你别错过
  17. 使用idea进行远程调试
  18. win10常用快捷键及官网说明
  19. RISC-V学习笔记【执行】
  20. 少吃精粮,多吃粗粮 (吃纯燕麦治湿疹)

热门文章

  1. 图像增强之对比度拉伸
  2. 【调参实战】那些优化方法的性能究竟如何,各自的参数应该如何选择?
  3. 【NLP】GPT:第一个引入Transformer的预训练模型
  4. php layui实现添加input,Layui实现input输入和选择的方法
  5. 全球农业发展中国方案-国际农民丰收节贸易会:榜样力量
  6. 关于STM32F4的FMC CLK配置浅解
  7. CentOS部署NetCore - 2. 安装NetCore SDK On CentOS
  8. C# 创建Word项目标号列表、多级编号列表
  9. 80端口被屏蔽解决方法,80端口穿透之NAT端口映射技术
  10. Mycat高可用集群搭建