sealed、new、virtual、abstract与override 趣解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | 1. sealed ——“断子绝孙” 密封类不能被继承。密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于 方法或属性时, sealed 修饰符必须始终与 override 一起使用。 即:密封类不会有子类,所以是“断子绝孙”。 2. new ——“你是你的,我是我的” new 关键字用于显式隐藏从基类继承的成员。也就是在使用派生类时调用的方式方法是 new 关键字新定义出 来的方法,而不是基类的方法。 在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。使用 new 显式隐藏成员会取消此警告,并 使用派生类新定义的方法。 即:好比是不用祖宗的东西,而是用自己创造( new )的东西。 3. virtual ——“为了子孙后代” virtual 关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称做虚成员。虚成员的实现可由 派生类中的重写成员更改。 调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派 生类重写该成员,则它可能是原始成员。 在默认情况下,方式是非虚拟的。非虚方法不能重写。 不能将 virtual 修饰符与一下修饰符一起使用: static 、 abstract 和 override 。 除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。 在静态属性上使用 virtual 修饰符是错误的。 通过 override 修饰符的属性声明,在派生类中重写虚拟继承属性。 即: virtual 是为了让子孙后代可以实现各自的梦想而做的。 4. abstract ——“我是上帝” abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。 在类声明中使用 abstract 修饰符,以指示该类只能是其他类的基类。标记为抽象或包含在抽象类中的成员 必须通过从抽象类派生的类来实现。 抽象类具有以下特性: 抽象类不能实例化。 抽象类可以包含抽象方法和抽象访问器。 不能用 sealed 修饰符修改抽象类,这意味着该类不能被继承。 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现。 在方法或属性声明中使用 abstract 修饰符以指示此方法或属性不包含实现。 抽象方法具有以下特性: 抽象方法是隐式的 virtual 方法。 只允许在抽象类使用抽象方法声明。 抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在结束后 没有花括号。 实现由 override 方法提供,它是非抽象类的成员。 在抽象方法声明中使用 static 或 virtual 修饰符是错误的。 除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。 在静态属性上使用 abstract 修饰符是错误的。 在派生类中,通过包括使用 override 修饰符的属性声明可以重写抽象的基础属性。 即: abstract 是一种抽象,好比上帝,是人们对神的抽象,看似什么都能干,其实什么都干不了。 5. override ——“一手遮天” 使用 override 修饰符来修改方法、属性、索引器或事件。主要是提供派生类对基类方法的新实现。覆盖 上面 abstract 、 virtual 两种关键字修饰的成员。 由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的签名。 重写基方法必须是虚拟的、抽象或重写的。不能重写非虚方法或静态方法。 不能使用下列修饰符修改重写方法: new 、 static 、 virtual 和 abstract 。 重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且重写属性必须是虚拟的、 抽象的或重写的。 即: override 好比不但不用祖宗的那套,而且还自己创一套新功夫代替祖宗那套。 6、 new 和 override 的区别如下: 用 override 的基类方法必须要用 virtual ,而 new 不必要。 用一个基类的对象调用基类的 virtual 方法时, override 重写的派生类的方法会被访问,而 new 重写的派生 类中的方法不会被访问。 |
资料来源:《.NET深入体验与实战精要》 李天平 著
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?