当前位置: 首页 > article >正文

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

前言

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

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

  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.kler.cn/a/404408.html

相关文章:

  • Java实现简单的搜索引擎
  • 硬件知识 cadence16.6 原理图输出为pdf 网络名下划线偏移 (ORCAD)
  • 实验室管理现代化:Spring Boot技术方案
  • 高级 SQL 技巧讲解
  • ROS VRRP软路由双线组网方式
  • 小米顾此失彼:汽车毛利大增,手机却跌至低谷
  • 弹幕发送功能‘简单’实现
  • 数据集论文:面向深度学习的土地利用场景分类与变化检测
  • 设计模式-Adapter(适配器模式)GO语言版本
  • 2024信创数据库TOP30之达梦DM8
  • php:nginx如何配置WebSocket代理?
  • 接雨水
  • 智能工厂的设计软件 为了监管控一体化的全能Supervisor 的监督学习 之 序8 进化论及科学的信息技术创新:分布式账本/区块链/智能合约 之2
  • yolov5 数据集分享:纯干货
  • GEE 训练教程——Sentinel-1的卷积(核函数)的分析和可视化
  • this.$prompt 限制输入长度
  • Windows环境GeoServer打包Docker极速入门
  • 出海第一步:搞定业务系统的多区域部署
  • 大模型-微调与对齐-非强化学习的对齐方法
  • CSS3 动画:前端开发的动态美
  • 实现了图像处理、绘制三维坐标系以及图像合成的操作
  • 对原jar包解压后修改原class文件后重新打包为jar
  • RestTemplate应用实践总结
  • 请问有什么限制预约报名人数的微信小程序/系统?
  • Arcgis 绘制地图
  • buuoj WEB做题笔记