C#(12) 内部类和分部类

embedded/2024/11/24 20:41:11/

前言

我们发现,其实我们这几节一直都在学习拓展相关的方法,不管是拓展方法,还是运算符重载,还是今天的内部类和分部类。它们都可以用来增强、扩展或重新定义类的功能,使得代码更加灵活和可重用。

研究分部类和内部类有几个原因:

  1. 模块化:分部类和内部类可以帮助将代码分割成更小的逻辑单元,使得代码更加模块化和可维护。通过将相关的代码组织在一起,可以提高代码的可读性和可重用性。

  2. 封装性:分部类和内部类提供了更高级别的封装,可以将某些类或类成员限制在特定的作用域内。这样可以防止不需要访问的代码被访问,并保护关键的内部实现细节。

  3. 组织性:分部类和内部类可以帮助将相关的类和成员组织在一起,使得代码的结构更加清晰。这对于大型项目来说特别重要,可以减少代码的混乱程度和冗余性。

  4. 扩展性:通过分部类和内部类,可以更容易地实现代码的扩展和修改。可以轻松地添加新的功能和成员,而不会影响到其他部分的代码。

我们不难发现,他们其实都是为了更好的封装,不管是拓展方法还是运算符重载,我们其实都不太希望总在主代码上改来改去的,而是希望我们在原本的基础上加上一个什么,它也可以运行,并且还多了一个什么内容。

进入一个场景想一想,其实也很正常:

人不可能规避bug,你总是在整体上动刀子,保不定昨天还能正常跑,今天就暴毙了,你当然可以说你的修复bug能力无敌好,但工作总是有期限的,负责人也不会允许你这样去操作。

因为公司秉承着,程序和程序猿一个能跑就行。

也不闲聊了,我们进入今天的正题。

内部类

概念:在一个类中再声明一个类

特点:使用时要包裹着点出自己

作用:亲密关系的体现

注意:访问修饰符的作用很大

示例:

写了一个玩家类,内部有仓库类还有职业类,并且留下了一点习题。

使用方法注意看注释,其实也很好理解,就是在类里继续声明一个类。

using System;namespace Game
{public class Player{private string playerName;private int playerLevel;public Player(string name){playerName = name;playerLevel = 1;}public void PrintPlayerInfo(){Console.WriteLine($"玩家姓名: {playerName}");Console.WriteLine($"玩家等级: {playerLevel}");// 使用内部类进行访问修饰符的示例PlayerInventory inventory = new PlayerInventory();inventory.PrintInventory();}private class PlayerInventory{private string[] items;public PlayerInventory(){items = new string[] { "咸鱼宝剑", "c#牌盾牌", "unity牌弓箭" };}public void PrintInventory(){Console.WriteLine("玩家的仓库:");foreach (string item in items){Console.WriteLine(item);}}//任务一:写一个添加物品的方法并在主类里调用使用}public class Occupation{public string[] names;public Occupation(){names = new string[] { "战士", "法师", "牧师" };}public void ChooseOccupation(){//任务二:写一个选择职业的方法,并在外部调用}}}public class Program{public static void Main(string[] args){Player player = new Player("ling1s");player.PrintPlayerInfo();Player.Occupation occupation=new Player.Occupation();//外部使用Console.WriteLine(occupation.names[0]);}}
}

分部类和分布方法

分部类

概念:把一个类分成几部分声明

关键字:partial

作用:分布描述一个类,增加程序的可拓展性

注意:

  • 可以写在多个脚本文件中
  • 访问修饰符要一致
  • 不能有重复方法

分部方法

概念:将方法的声明和实现私有化

特点:

  1. 默认私有,不能加访问修饰符

  2. 只能在分部类中声明

  3. 返回值只能是void

  4. 可以有参数但不能有out关键字 

示例:

博主为你提供了一个塔防游戏的小模板,你可以参考一下理解分部类的作用,里面的分部类其实都可以写在其他的程序文件里,互相调用,但是这个就要你自己去尝试操作一下了,只要使用了你主类的命名空间,就可以对你想要分部的类进行继续写。

这里的这个任务偏难,建议有基础和有信心的朋友们尝试独立完成。

using System;namespace TowerDefenseGame
{  public partial class Tower{public string Name { get; set; }public int Damage { get; set; }public int Range { get; set; }public Tower(string name, int damage, int range){Name = name;Damage = damage;Range = range;}public void DisplayInfo(){Console.WriteLine($"塔的名字: {Name}, 伤害: {Damage}, 范围: {Range}");}}public partial class Tower{public void AttackEnemy(Enemy enemy){if (IsInRange(enemy)){Console.WriteLine($"{Name} 攻击 {enemy.Name} 造成了 {Damage} 伤害!");enemy.TakeDamage(Damage);}else{Console.WriteLine($"{enemy.Name} 脱离了 {Name}范围.");}}private bool IsInRange(Enemy enemy){// 假设我们有一个简单的距离检测  return enemy.Distance <= Range;}}public partial class Tower{public void UpgradeDamage(int additionalDamage){Damage += additionalDamage;Console.WriteLine($"{Name} 升级了,当前伤害: {Damage}");}}public class Enemy{public string Name { get; set; }public int Health { get; set; }public int Distance { get; set; }public Enemy(string name, int health, int distance){Name = name;Health = health;Distance = distance;}public void TakeDamage(int damage){Health -= damage;Console.WriteLine($"{Name} 被打了 {damage} 伤害! 剩下: {Health}点血");}}
class Program
{static void Main(string[] args){Tower tower1 = new Tower("炮塔", 50, 10);tower1.DisplayInfo();Enemy enemy1 = new Enemy("哥布林", 100, 8);//选做任务://为enemy和塔添加一个二维坐标,并且enemy有固定的移动轨迹,进入塔的攻击范围,塔会自动攻击//可考虑功能:塔杀敌升级,敌人检测生成tower1.AttackEnemy(enemy1);tower1.UpgradeDamage(10);tower1.AttackEnemy(enemy1);}
}
}

 总结

分部类和内部类讲完,其实封装相关的知识点就告一段落了,下一阶段我们会开始讲继承相关的知识点。

核心的东西其实是更好提高你程序能力的步骤,基本的编程思路你已经在入门和基础中get了,但是想要成为一个厉害的程序猿,核心和未来的进阶才是重中之重。

基础打好,unity的学习才不会特别难,只有有足够的理论基础,才能支撑你去开发自己的游戏。

请期待我的下一篇博客!

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


http://www.ppmy.cn/embedded/140201.html

相关文章

DTH11传感器温度湿度+esp8266+阿里云+小程序

arduino在之前灯的基础上再添加两个库 Adafruit_Sensor&#xff0c;#include “DHT.h” 代码如下 #include <ESP8266WiFi.h> // 引入Arduino ESP8266核心库 #include <ArduinoJson.h> // 引入JSON处理库 #include <Ticker.h> // 引入定时库 #inclu…

SciPy库spatial.transform模块Rotation类的from_rotvec 函数介绍

SciPy 库的 spatial.transform 模块 Rotation 类 是一个工具类&#xff0c;用于在多种旋转表示形式&#xff08;例如旋转矩阵、四元数、旋转向量、欧拉角等&#xff09;之间进行转换&#xff0c;以及执行旋转操作。 示例代码 1. 构造旋转对象 from scipy.spatial.transform …

深度学习day1-Tensor 1

深度学习 一 初识Torch 1基础介绍 PyTorch是一个基于Python的深度学习框架&#xff0c;最初由Facebook开发&#xff0c;广泛用于计算机视觉、自然语言处理、语音识别等领域。用张量&#xff08;tensor&#xff09;来表示数据&#xff0c;可以在GPU上加速&#xff0c;处理大规…

Spring Boot OA系统:企业资源规划的新选择

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Redis的理解

1.Redis使用 C语言开发的。Redis 约定此版本号,为偶数的版本是稳定版(如:2.4版 2.6版),奇数版是非稳定版(如:2.5版 2.7版) 2.Redis 数据库中的所有的数据都存储在内存中,由于内存的速度远远快于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有明显优势,在普通一台计算机…

从〇开始深度学习(0)——背景知识与环境配置

从〇开始深度学习(0)——背景知识与环境配置 文章目录 从〇开始深度学习(0)——背景知识与环境配置写在前面1.背景知识1.1.Pytorch1.2.Anaconda1.3.Pycharm1.4.CPU与GPU1.5.整体关系 2.环境配置2.1.准备工作2.1.1.判断有无英伟达显卡2.1.2.清理电脑里的旧环境 2.1.安装Anaconda…

51单片机基础 06 串口通信与串口中断

目录 一、串口通信 二、串口协议 三、原理图 四、串口通信配置参数 1、常用的串行口工作方式1 2、数据发送 3、数据接收 4、波特率计算 5、轮询接收 6、中断接收 一、串口通信 串口通信是一种常见的数据传输方式&#xff0c;广泛用于计算机与外部设备或嵌入式系统之间…

C++设计模式:建造者模式(Builder) 房屋建造案例

什么是建造者模式&#xff1f; 建造者模式是一种创建型设计模式&#xff0c;它用于一步步地构建一个复杂对象&#xff0c;同时将对象的构建过程与它的表示分离开。简单来说&#xff1a; 它将复杂对象的“建造步骤”分成多部分&#xff0c;让我们可以灵活地控制这些步骤。通过…