C#中使用list封装多个同类型对象以及组合拓展实体的应用

文章目录

  • 一、list使用方法
  • 二、C#组合拓展实体

一、list使用方法

在C#中,使用List<T>集合是封装多个同类型对象的常用方式。List<T>是泛型集合,T是集合中元素的类型。下面是一个简单的例子,演示如何创建一个List<T>,并向其中添加对象。

首先,假设我们有一个类,比如一个Person类,它有一些属性:

public class Person
{public string Name { get; set; }public int Age { get; set; }// 假设还有其他属性和方法
}

然后,我们可以这样使用List<T>

using System;
using System.Collections.Generic;  // 确保引入了这个命名空间public class Program
{public static void Main(){// 创建一个Person对象的ListList<Person> people = new List<Person>();// 创建Person对象并添加到List中people.Add(new Person() { Name = "Alice", Age = 30 });people.Add(new Person() { Name = "Bob", Age = 25 });people.Add(new Person() { Name = "Charlie", Age = 35 });// 遍历List并打印每个Person对象的信息foreach (Person p in people){Console.WriteLine($"Name: {p.Name}, Age: {p.Age}");}}
}

上面的代码首先导入了必要的命名空间System.Collections.Generic来使用List<T>。然后,创建了一个Person类型的List,并添加了几个Person对象到这个列表中。foreach循环被用来遍历这个列表并打印每个人的信息。

这样,我们就可以管理一个动态数组(列表)的同类型对象了,而且List<T>提供了许多方便的方法,如AddRemoveFind等,来操作集合中的元素。

二、C#组合拓展实体

在C#中,“组合”(Composition)通常是指一种设计模式,它表明一个类包含了一个或者多个其他类的实例来实现代码复用或者增加新的功能。这与"继承"不同,继承表示一个类是另一个类的子类。“拓展实体”(Extended Entities)一般指的是在组合模式中被用来拓展功能的那些包含的类的实例。 (定义有些复杂,不用管直接看例子也行)

组合被用于当我们想要将一些行为或者状态封装到一个单独的类中,并且希望通过含有这些类的实例的方式在多个地方重用它们。这通常是在希望建立一个对象,其行为是由多个源对象组成的时候,比如在创建一个复杂对象时,这个对象的功能需要来自于多个不同的源对象。

具体例子如下:

设想我们正在构建一个游戏,有一个Weapon类(武器)和一个Character类(人物)。在这个游戏中,每个角色可以拥有不同的武器。在这里,Weapon是一个可以被组合到Character中的实体。

首先,定义一个Weapon类:

public class Weapon //这个类代表游戏中的武器,它有两个公共属性和一个构造函数,以及一个用于执行攻击动作的方法
{
//这是两个公开属性public string Name { get; set; }  //武器的名称public int Damage { get; set; }   //使用这个武器进行攻击时造成的伤害
//构造函数,用来创建weapon类的新实例,就是说我们创建Weapon类的时候,要提供Name和Damage来初始化对象public Weapon(string name, int damage){Name = name;Damage = damage;}
//一个不返回任何值的方法,调用这个方法后,会显示武器的名称和攻击造成的伤害public void Attack(){Console.WriteLine($"{Name} attacks for {Damage} damage!");//在这个字符串中,{Name}和{Damage}是插值表达式,它们会被替换为对象当前的Name和Damage属性的值。}
}

然后,定义一个Character类,并在其中组合Weapon

public class Character     //这个是游戏中的角色,并演示了怎样通过组合来使用之前定义的Weapon类
{
// 两个公开属性public string Name { get; set; }  //用于存储角色的名称public Weapon EquippedWeapon { get; set; }  //用于存储角色当前装备的武器,这个属性可以持有一个Weapon类的实例,或者为null(如果角色没有装备武器)//构造函数,它接收一个参数name,用于在创建Character实例时设置角色的名称public Character(string name){Name = name;}
//这是一个方法,用于为角色准备一个武器,这个方法接收一个Weapon实例作为参数,并将其分配给EquippedWeapon 属性。然后,它打印一条消息到控制台,表示角色已经装备了该武器。public void EquipWeapon(Weapon weapon){EquippedWeapon = weapon;Console.WriteLine($"{Name} equipped {weapon.Name}!");}
// Attack方法用于执行攻击,它首先检查EquippedWeapon属性是否为null,如果角色有武器,那么就调用attack方法,要是么得,就在控制台上打印一条消息,说明角色无法攻击,因为没武器。public void Attack(){if (EquippedWeapon != null){EquippedWeapon.Attack();}else{Console.WriteLine($"{Name} has no weapon to attack!");}}
}

现在,我们可以创建WeaponCharacter的实例,并将一个武器实体组合到一个角色中:

public class Program //Program是一个包含Main方法的类。Main方法是C#程序的入口点,也就是运行程序时第一个被调用的方法。
{public static void Main(){Weapon sword = new Weapon("Sword", 50); //创建武器对象,Sword 武器是一把剑,伤害是50Character knight = new Character("Knight"); //创建一个名为Knight(大侠)的角色knight.EquipWeapon(sword);//装备武器:这里调用了knight对象的EquipWeapon方法,并将之前创建的sword实例作为参数传递进去。这个方法会将sword对象赋值给knight对象的EquippedWeapon属性,并在控制台输出一条消息表明"Knight"装备了"Sword"。knight.Attack();//执行攻击:这行代码调用了knight对象的Attack方法。Attack方法检查EquippedWeapon是否不为空(在这个例子中,我们刚刚装备了"Sword"),然后调用EquippedWeapon(即sword对象)的Attack方法。这最终将在控制台输出一条消息,表明"Sword"攻击并造成了50点伤害。}
}

在这个例子中,当knight.Attack()被调用时,它实际上会调用EquippedWeaponAttack()方法,这是组合在工作的例子。这样,Character类通过组合Weapon实体来拓展它的功能。这种方式允许Character获得Weapon的功能并且可以动态地改变,这是相对于继承更加灵活的设计方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙 gnss 开关使能流程

先WiFi&#xff0c;后 定位&#xff0c;再从蓝牙到NFC&#xff0c;这个就是我大致熟悉开源鸿蒙代码的一个顺序流程&#xff0c;WiFi 的年前差不多基本流程熟悉了&#xff0c;当然还有很多细节和内容没有写到&#xff0c;后续都会慢慢的丰富起来&#xff0c;这一篇将开启GNSS的篇…

js设计模式:计算属性模式

作用: 将对象中的某些值与其他值进行关联,根据其他值来计算该值的结果 vue中的计算属性就是很经典的例子 示例: let nowDate 2023const wjtInfo {brithDate:1995,get age(){return nowDate-this.brithDate}}console.log(wjtInfo.age,wjt年龄)nowDate 1console.log(wjtInf…

mq大量消息堆积有哪些解决方案

当消息队列中出现大量消息堆积时&#xff0c;可能会导致系统性能下降、消息延迟增加以及服务不可用等问题。针对这种情况&#xff0c;可以采取以下几种解决方案&#xff1a; 增加消费者数量&#xff1a;增加消费者数量可以提高消息消费的速度&#xff0c;缩短消息队列中消息的处…

在 Windows 上安装 Redis 过程全记录(使用WSL在Windows中搭建虚拟环境)

在Windows上使用Redis进行开发 Windows 上不正式支持 Redis。但是&#xff0c;您可以按照以下说明在 Windows 上安装 Redis 进行开发&#xff0c;本教程采用WSL方式安装Linux虚拟环境&#xff08;并非唯一方式&#xff0c;也可通过其他方式安装Linux虚拟环境&#xff0c;本教程…

flink分区与算子链

flink分区与算子链 flink 分区策略flink 什么情况下才会把 Operator chain 在一起形成算子链&#xff1f; flink 分区策略 GlobalPartitioner 数据会被分发到下游算子的第一个实例中进行处理RebalancePartitioner 数 据会 被循 环发 送到 下 游的 每一 个实 例中 进 行处 理。…

【算法与数据结构】1020、130、LeetCode飞地的数量 被围绕的区域

文章目录 一、1020、飞地的数量二、130、被围绕的区域三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、1020、飞地的数量 思路分析&#xff1a;博主认为题目很抽象&#xff0c;非常难理解。想了好久&#xff0c;要理解…

【蝶变跃升】壹起来|就业辅导系列活动——职业生涯规划和模拟面试

为使困难家庭更深层次了解自己就业现状&#xff0c;明确就业方向&#xff0c;同时提升在面试时的各类技巧。2024年2月17日&#xff0c;由平湖市民政局主办、平湖吾悦广场和上海聘也科技有限公司协办、平湖市壹起来公益发展中心承办的“蝶变跃升”就业辅导系列——职业生涯规划和…

2024新版Java高频面试题+Java八股文面试真题

Java面试题_2024新版Java高频面试题Java八股文面试真题 Java高频面试专题视频课程&#xff0c;瓤括了Java生态下的主流技术面试题&#xff0c;课程特色&#xff1a; 1、全面&#xff0c;jvm、并发编程、mysql、rabbitmq、spring、mybatis、redis、分布式、微服务、数据结构等等…

零基础到高级:Android音视频开发技能路径规划

音视频开发趋势 Android音视频开发领域目前正处于一个高速发展的阶段&#xff0c;主要趋势如下&#xff1a; 超高清视频&#xff1a;4K视频亚毫米级显示清晰&#xff0c;更加逼真&#xff0c;为开发更加逼真的虚拟现实应用提供了基础。AI技术&#xff1a;自适应码率控制、视频…

GIT使用和简介

Git 是一个版本控制系统&#xff0c;它可以追踪文件的更改&#xff0c;并可以在不同的分支上进行并行开发。下面是 Git 的基本概念和使用方式的解释&#xff1a; 1. 仓库&#xff08;Repository&#xff09;&#xff1a;仓库是用来存储项目代码的地方。一个仓库可以包含多个文…

Flutter学习4 - Dart数据类型

1、基本数据类型 num、int、double &#xff08;1&#xff09;常用数据类型 num类型&#xff0c;是数字类型的父类型&#xff0c;有两个子类 int 和 double 通过在函数名前加下划线&#xff0c;可以将函数变成私有函数&#xff0c;私有函数只能在当前文件中调用 //常用数据…

Oracle误删除数据文件恢复---惜分飞

有客户通过sftp误删除oracle数据文件,咨询我们是否可以恢复,通过远程上去检查,发现运气不错,数据库还没有crash,通过句柄找到被删除文件 oraclecwgstestdb[testwctdb]/proc/20611/fd$ls -ltr total 0 lr-x------ 1 oracle oinstall 64 Feb 20 14:03 9 -> /oracle/db19c/rdbm…

R语言【raster】——res():获取(或设置)Raster*对象的x和/或y分辨率

Package raster version 3.6-27 Usage xres(x) yres(x) res(x) res(x) <- value Arguments 参数【x】&#xff1a;Raster*对象。 参数【value】&#xff1a;分辨率&#xff08;单个数或两个数的向量&#xff09;。 Value 单个数值或两个数值。 Examples r <- raster…

Python 使用配置文件管理API令牌和实现跨脚本调用

创建一个配置文件&#xff08;例如config.ini&#xff09;&#xff0c;在里面存储你的token。使用Python的configparser模块来读取配置文件。创建一个模块&#xff08;例如api_token.py&#xff09;&#xff0c;它将负责从配置文件读取token&#xff0c;并且该模块可以被其他脚…

Python学习笔记——类(基础知识)

学习编程&#xff0c;无论那种语言&#xff0c;面向对象编程&#xff08;object-oriented programming&#xff0c;OOP&#xff09;是当前最有效最普遍的编写方法之一。类则是面向对象编程的最基础的知识&#xff0c;可以说能够深刻理解类即掌握面向对象编程。 关于编程&#…

docker之安装mongo创建运行环境

目录 一、docker pull 最新资源 二、启动mongo镜像 启动命令查看日志拉取低版本镜像成功启动 三、进入mongo容器 进入容器进入mongo环境查询当前所在库切换库至admin随意切换库 并 创建用户登录用户新增文档数据等 五、总结 版本兼容可备份操作 一、docker pull 最新资源…

java序列化之Jackson

当涉及到在Java中进行JSON序列化和反序列化时,Jackson和Gson是两个最常用的库。它们都提供了强大的功能来处理JSON数据,但在某些方面有一些不同之处。 Jackson Jackson 是一个功能强大且灵活的 JSON 处理库,由 FasterXML 维护。以下是 Jackson 的一些特点 强大的功能 Ja…

关于OpenAI的Sora的基本介绍

OpenAI Sora&#xff1a;探索人工智能与区块链技术的融合 随着人工智能&#xff08;AI&#xff09;和区块链技术的日益成熟&#xff0c;OpenAI Sora 应运而生&#xff0c;成为这两大前沿技术融合的典型案例。本文将为您科普OpenAI Sora&#xff0c;探讨其在AI与区块链领域的独…

C#中的`out`关键字

C# 中的 out 关键字是一个用来在方法调用时传递数据的修饰符。它允许你在方法内部创建一个临时的变量&#xff0c;用于接收传递进来的参数值&#xff0c;并在方法执行完毕后&#xff0c;将该变量的值返回给调用方法的对象。out 关键字主要用于那些需要知道方法执行结果的参数上…

顺序表详解(如何实现顺序表)

文章目录 前言 在进入顺序表前&#xff0c;我们先要明白&#xff0c;数据结构的基本概念。 一、数据结构的基本概念 1.1什么是数据结构 数据结构是由“数据”和“结构”两词组合而来。所谓数据就是&#xff1f;常见的数值1、2、3、4.....、姓名、性别、年龄&#xff0c;等。…