C#核心(17)密封类

server/2024/12/19 20:46:25/

前言

我们先前已经学完了继承中的大部分知识,今天我们就来学习最后一个知识点,密封类。

其实我不喜欢叫他密封类,我比较喜欢叫他结扎。

在Unity中,C#的密封类(sealed class)是一个重要的概念,它源自于C#语言本身的设计。在C#中,密封类用于防止其他类从该类继承。这种设计有几个历史背景和实际应用。

密封类的历史背景

  1. 面向对象编程的原则
  • C#是一种面向对象的语言,它支持继承和多态。密封类的概念出现是为了提供一种方式来控制继承,以便开发者能够明确表示某个类不允许被进一步扩展。
  1. 设计上的考虑
  • 在软件设计中,某些类可能不希望被修改以保持其设计的完整性或安全性。例如,Unity中的一些基础库和系统类可能被设计为密封,以避免意外的修改导致不稳定或未定义的行为。
  1. 性能优化
  • 使用密封类可以让编译器和运行时进行优化,因为它知道该类不会被继承。这可以提高性能,尤其是在涉及虚方法调用的时候。对于Unity这类需要高性能渲染和快速计算的环境,这尤为重要。

Unity中的应用

在Unity中,密封类常用于一些基础组件和API中,例如:

  • Unity的基础类如 Vector3 和 Quaternion 等,它们被设计为工具类,用于提供基本的数学运算,并且不希望被继承以保证行为的一致性。
  • 类库的版本控制:当一个类封闭时,版本更新时可以保证原有功能不被外部修改,这对大型项目尤为关键,能够避免升级时引入的不兼容问题

当然你自己的函数也可以密封。

基本概念

使用sealed作为关键字的类,让类无法继承。

你想,既然不能有儿子,那可不就是结扎嘛。

实例

其实这个东西理解起来很简单,我们直接上实例。

using System;// 密封类
sealed class Game
{// 私有字段private string name;private int score;// 构造函数public Game(string name){this.name = name;score = 0;}// 公有方法public void Play(){Console.WriteLine("Playing {0}...", name);score += 10;}public void ShowScore(){Console.WriteLine("Current score for {0}: {1}", name, score);}
}class Program
{static void Main(string[] args){// 创建游戏实例Game game = new Game("Super Mario");// 进行游戏game.Play();game.Play();game.Play();// 显示分数game.ShowScore();// 由于Game类是密封类,无法被继承// 下面的代码将无法编译通过// class NewGame : Game { }}
}

博主也不给你留练习题了,你知道有这个概念就行,在以后设计中,如果你不希望别人继承你的类,或者你不希望这个类被继承,可以尝试这样设计。

通常我们都是让最底层的子类不能被继承,保证规范性和安全性

总结

到这里我们继承相关的所有知识,我们就来简单回顾一下吧。

继承的基本规则我们讲了基本的语法和一些使用方法,然后就介绍了七大原则,也是让你初步体会了设计相关的准则,以及为什么会这样,之后我们又讲了继承中的构造函数,你也知道构造函数的执行顺序,就是万物之父和装箱拆箱的概念,以及今天的密封类。

如果你有什么忘记的,建议重新回去翻翻,这些东西都是基础中的基础,希望你能牢牢掌握。

还是那句话,学习路上,脚踏实地。

请期待我的下一篇博客!

我来自佑梦游戏开发,感谢你的关注和收藏!


http://www.ppmy.cn/server/151535.html

相关文章

2019陕西ICPC-Grid with Arrows

Grid with Arrows 题意 一个总规模为n m 的矩阵,矩阵上的每个位置有其下一位置的信息,询问是否存在一种解法从某一点出发,使得整个矩阵的每个位置都被访问到,如果越界或者遇到重复访问位置的解法被认为失败。 解决思路 求是否…

射频测试入门学习(三)——程控仪器是怎样和电脑连接通信的

目录 一、程控仪器需要哪些条件 二、可程控仪器 三、专业的仪器通信软件、驱动 四、编程语言 五、电脑控制仪器条件汇总 六、仪器指令查询 七、结语 一、程控仪器需要哪些条件 1、需要具备硬件条件(可程控的仪器、个人计算机(PC)) 2、专业的仪器通信软件、驱动 3、…

Git-分支(branch)常用命令

分支 我们在做项目开发的时候,无论是软件项目还是其他机械工程项目,我们为了提高效率以及合理的节省时间等等原因,现在都不再是线性进行,而是将一个项目抽离出诸进行线,每一条线在git中我们就叫做分支,bran…

CSS Grid 布局:属性及使用详解

CSS Grid 布局:属性及使用详解 一、CSS Grid 布局的基础概念二、主要的 CSS Grid 属性1、display: grid / display: inline-grid声明 Grid 容器2、grid-template-columns / grid-template-rowsGrid 容器中列和行的尺寸3、 grid-template-areas命名布局区域4、gap/ g…

自动驾驶控制与规划——Project 2: 车辆横向控制

目录 零、任务介绍一、环境配置二、算法三、代码实现四、效果展示 零、任务介绍 补全src/ros-bridge/carla_shenlan_projects/carla_shenlan_stanley_pid_controller/src/stanley_controller.cpp中的TODO部分。 一、环境配置 上一次作业中没有配置docker使用gpu,…

马尔可夫决策过程

目录标题 一、简单介绍什么是马尔可夫决策过程二、马尔可夫过程2.1 随机过程2.2 马尔可夫的性质2.2 马尔可夫过程 三、马尔可夫奖励过程3.1 回报3.2 价值函数 四、马尔可夫决策过程4.1 策略4.2 状态价值函数4.3 动作价值函数4.4 贝尔曼期望方程 五、蒙特卡洛方法六、占用度量七…

解决 Ubuntu 20.04 上编译 OpenCV 3.2 时的类型不匹配错误

解决 Ubuntu 20.04 上编译 OpenCV 3.2 时的类型不匹配错误 make[2]: *** [modules/python3/CMakeFiles/opencv_python3.dir/build.make:329:modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o] 错误 1 make[1]: *** [CMakeFiles/Makefile2:11856&a…

SpringBoot feign基于HttpStatus重试

场景 基于springboot开发的项目,对接第三方,第三方的接口有限流策略,某个时间段内有调用频率限制,返回的状态码HttpStatus不是200,而HttpStatus是429。现基于HttpStatus我们发起的重试。 技术点 springbootfeign fe…