首页 > 编程语言 >C# & Unity 面向对象补全计划 七大原则 之 合成/聚合复用原则( CARP)难度:☆☆☆☆ 总结:在类中使用类,而不是继承类

C# & Unity 面向对象补全计划 七大原则 之 合成/聚合复用原则( CARP)难度:☆☆☆☆ 总结:在类中使用类,而不是继承类

时间:2024-08-09 13:26:14浏览次数:10  
标签:set 补全 get C# Weapon Character Unity public Name

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正
本系列作为七大原则和设计模式的进阶知识,看不懂没关系

请看专栏:http://t.csdnimg.cn/mIitr,查漏补缺

1.合成/聚合复用原则( CARP)

        合成/聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的

        说白了,类和类之间方便互通的话就少用点继承,这样会减少耦合,提高灵活性

合成(Composition):表示强的“拥有”关系,新对象包含了已有对象,成为其一部分,例如,大雁有两个翅膀,翅膀与大雁是合成关系,它们的生命周期一样

聚合(Aggregation):表示弱的“拥有”关系,新对象可以包含已有对象,但已有对象不是新对象的一部分,例如,大雁属于一个雁群,雁群可以有多只大雁,所以大雁和雁群是聚合关系

2.举栗子

假设我们正在开发一个游戏,其中有不同类型的武器和角色,我们希望设计一个灵活的系统,以便在游戏中组合不同的武器和角色,而不是通过继承来实现复用

首先,我们定义以下几个类:

Weapon 类表示武器,它具有属性如攻击力、射程、弹药等

Character 类表示角色,它包含属性如姓名、生命值、装备的武器等

最后一个类表示玩家,需要角色的属性以及武器的基本信息

using System;
using System.Collections.Generic;

class Weapon
{
    public string Name { get; set; }
    public int AttackPower { get; set; }
    public float Range { get; set; }
}

class Character
{
    public string Name { get; set; }
    public int Health { get; set; }
    public Weapon EquippedWeapon { get; set; }
}

class Player
{
    public string Username { get; set; }
    public List<Character> Characters { get; set; }

    public Player(string username)
    {
        Username = username;
        Characters = new List<Character>();
    }

    public void AddCharacter(Character character)
    {
        Characters.Add(character);
    }
}

class Program
{
    static void Main()
    {
        // 创建武器
        var sword = new Weapon { Name = "Sword", AttackPower = 50, Range = 2.0f };
        var bow = new Weapon { Name = "Bow", AttackPower = 40, Range = 10.0f };

        // 创建角色
        var warrior = new Character { Name = "Warrior", Health = 100, EquippedWeapon = sword };
        var archer = new Character { Name = "Archer", Health = 80, EquippedWeapon = bow };

        // 创建玩家
        var player = new Player("Player123");
        player.AddCharacter(warrior);
        player.AddCharacter(archer);

        // 输出信息
        Console.WriteLine($"Player: {player.Username}");
        foreach (var character in player.Characters)
        {
            Console.WriteLine($"Character: {character.Name}, Health: {character.Health}, Weapon: {character.EquippedWeapon.Name}");
        }
    }
}

该例子将已有的 Weapon 和 Character 对象组合成了 Player 对象,没有利用继承关系,非常好用

标签:set,补全,get,C#,Weapon,Character,Unity,public,Name
From: https://blog.csdn.net/2301_77947509/article/details/141059276

相关文章

  • 《信息学奥赛一本通编程启蒙》3031-3050(Scratch、C、C++、python)
    3031:练7.3买图书(C、C++、python)3031:练7.3买图书(C、C++、python)-CSDN博客3032:练7.4梯形面积(C、C++、python)3032:练7.4梯形面积(C、C++、python)-CSDN博客3033:【例8.1】人民币支付(Scratch、C、C++、python)3033:【例8.1】人民币支付(Scratch、C、C++、python)-CSDN博客3......
  • 打卡信奥刷题(528)用Scratch图形化工具信奥B2020[普及组/提高] 分糖果
    分糖果题目描述某个幼儿园里,有555位小朋友编号依次为1,2......
  • Codeforces 165E Compatible Numbers 题解
    思路高维前缀和高维前缀和把数的二进制看成一个集合,二进制的每一位为\(1\)为全集\(V\)。根据题目描述,若两数\(a,b\)相容,则\(a\operatorname{and}b=0\),容易发现,\(b\in\complement_{V}a\),所以我们只需要用高维前缀和处理出\(\complement_{V}a\)的一个元素即可。......
  • 什么是CSPO及成为CSPO的好处?
    组织在导入Scrum过程中,关于产品负责人,即PO通常会遇到类似于这样或那样的情况,例如有时整个项目在用Scrum但却无PO;有时项目中有PO但PO却没有充分被授权;有时PO又过分被动;还有时PO与SM是由项目中同一个人兼任……遇到这诸多问题,该如何解决呢?在这里我们不妨先明确一下PO这个角色的定义......
  • P5975 [CEOI2009] photo
    题目链接。可过掉帖子中的所有Hack数据。Analysis\(f_{l,r,p}\)表示覆盖了\([l,r]\)区间内纵坐标\(\gep\)的点最矩形个数(离散化后)。那么就有转移:\[f_{l,r,p}=\min(f_{l,r,p},f_{l,mid,p}+f_{mid+1,r,p})\]\[f_{l,r,p}=\min(f_{l,r,p},f_{l,r,res}+1)\]令\(h......
  • Rozanolixizumab (UCB7665) 是一种人源化高亲和力抗人新生儿 Fc 受体 (FcRn) 单克隆抗
    CAS:1584645-37-3品牌:MedChemExpress(MCE)存储条件:PleasestoretheproductundertherecommendedconditionsintheCertificateofAnalysis.生物活性:Rozanolixizumab(UCB7665)是一种人源化高亲和力抗人新生儿Fc受体(FcRn)单克隆抗体(IgG4P),用于降低自身免疫和......
  • 德谷胰岛素是一种超长效形式的胰岛素 |MedChemExpress (MCE)
    CAS:844439-96-9品牌:MedChemExpress(MCE)存储条件:PleasestoretheproductundertherecommendedconditionsintheCertificateofAnalysis.生物活性:德谷胰岛素是一种超长效形式的胰岛素,用于治疗由1型和2型糖尿病引起的高血糖症。Insulindegludec显示结合效率,......
  • C语言 | printf、scanf及库函数
    目录一、关于printf和scanf1、输入输出的概念2、语句2.1printf()函数2.2.1print输出格式2.2.2占位符  2.2.3限定宽度2.2.3.1对于小数以外的2.2.3.2对于小数2.2.4显示符号2.2scanf()函数2.2.1基本用法2.2.2基本格式2.2.3限定宽度2.2.4scanf的返回......
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【2.3】RK3588上使用C++启用多线程推理更多内容
    本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。B站配套视频:https://www.bilibili.com/video/BV1or421T74f基础背景对于国产化芯片来说,是采用NPU进......
  • Object-Oriented Programming
    Object-OrientedProgrammingResitCourseworkThisassignmentinvolvesthedevelopmentofJavaclassesandaprogramtosupportanalysisofearthquakedatacompiledbytheUnitedStatesGeologicalSurvey.Wehaveprovidedthreeexampledatasetsthatyou......