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

命名常量集合接口INamedConstantCollection<T>实现

public interface INamedConstantCollection<TObject, TName> : IEnumerable<TObject>, IEnumerable where TName : IComparable{TObject this[TName name] { get; }TObject this[int index] { get; }int Count { get; }int Capacity { get; }}

这是一个泛型接口,定义了命名常量集合的基本契约,结合了索引访问和枚举能力。

接口定义解析

public interface INamedConstantCollection<TObject, TName> : IEnumerable<TObject>, IEnumerable where TName : IComparable
{// 通过名称索引访问TObject this[TName name] { get; }// 通过位置索引访问TObject this[int index] { get; }// 实际元素数量int Count { get; }// 集合容量int Capacity { get; }
}

泛型参数说明

  • TObject:集合中存储的元素类型

  • TName:元素名称的类型,必须实现 IComparable 接口(确保名称可比较)

成员详解

1. 名称索引器

TObject this[TName name] { get; }

允许通过元素的名称来获取集合中的对象。这是该接口的核心特性,实现了"命名常量"的访问方式。

2. 位置索引器

TObject this[int index] { get; }

提供传统的基于位置的索引访问,使集合可以像数组一样使用。

3. Count 属性

int Count { get; }

返回集合中实际包含的元素数量(非空元素)。

4. Capacity 属性

int Capacity { get; }

返回集合的总容量(包括可能为空的槽位)。

继承的接口

  • IEnumerable<TObject>:提供强类型枚举能力

  • IEnumerable:提供非泛型枚举能力

这使得所有实现该接口的集合都可以用于foreach循环和LINQ查询。

设计意图

该接口的设计目的是:

  1. 提供双重访问方式:

    • 通过名称(语义化访问)

    • 通过索引(顺序访问)

  2. 保持集合的不可变性:

    • 只有getter没有setter

    • 符合"常量集合"的设计理念

  3. 支持枚举:

    • 可以用于LINQ操作

    • 支持foreach迭代

典型实现示例

public class NamedConstantCollection<TObject, TName> : INamedConstantCollection<TObject, TName>where TObject : INamed<TName>where TName : IComparable
{private readonly TObject[] _items;public NamedConstantCollection(TObject[] items){_items = items ?? throw new ArgumentNullException(nameof(items));}public TObject this[TName name] { get => _items.FirstOrDefault(x => x.Name.CompareTo(name) == 0);}public TObject this[int index] => _items[index];public int Count => _items.Count(x => x != null);public int Capacity => _items.Length;public IEnumerator<TObject> GetEnumerator() => _items.Where(x => x != null).GetEnumerator();IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

使用场景

  1. 配置系统:

interface IConfigItem : INamed<string> { ... }var configs = new NamedConstantCollection<IConfigItem, string>(...);
var timeoutConfig = configs["Timeout"];
  1. 枚举扩展:

var colors = new NamedConstantCollection<Color, string>(...);
var red = colors["Red"];
  1. 资源管理:

var resources = new NamedConstantCollection<Resource, string>(...);
var logo = resources["CompanyLogo"];

接口特点

  1. 只读性:没有提供修改集合的方法,强调不可变性

  2. 双重访问:支持名称和位置两种访问方式

  3. 强类型:通过泛型确保类型安全

  4. 可枚举:可以轻松集成到现有LINQ生态中

扩展思考

在实际开发中,可以考虑以下扩展:

1.添加TryGet方法避免异常:

bool TryGet(TName name, out TObject value);

2.添加名称集合访问:

IEnumerable<TName> Names { get; }

3.添加空值检查:

bool Contains(TName name);

这个接口为命名资源的组织提供了一种清晰、类型安全的契约,特别适合需要同时支持名称和索引访问的常量集合场景。

 

http://www.xdnf.cn/news/7833.html

相关文章:

  • 顶级流媒体服务商 Spotify 2025.04 故障复盘报告,吃他人的堑长自己的智
  • 4.8 加密模块
  • 无人机报警器360°检测技术分析!
  • 先验知识融合机器学习的几种方式
  • VentureBeat AI 最新资讯 (2025-05-19)
  • NVM安装使用及问题解决
  • Semaphore解决高并发场景下的有限资源的并发访问问题
  • 整型数相加的溢出
  • Python的蚁群优化算法实现与多维函数优化实战
  • 【Java高阶面经:微服务篇】1.微服务架构核心:服务注册与发现之AP vs CP选型全攻略
  • C语言指针深入详解(五):回调函数、qsort函数
  • 卡片布局自适应
  • c语言刷题之实际问题
  • 一文读懂|大模型智能体互操作协议:MCP/ACP/A2A/ANP
  • Redis学习专题(三)主从复制
  • 单端IO和差分IO标准
  • 《Metasploit框架核心模块解析与安全防护实践》​
  • 树 Part 6
  • 2025年PMP 学习二十二 15章 项目绩效域
  • BUUCTF——Kookie
  • FEKO许可证与其他电磁仿真软件的比较
  • 《算法笔记》11.1小节——动态规划专题->动态规划的递归写法和递推写法 问题 A: Fibonacci
  • 嵌入式自学第二十四天(5.20)
  • Stack Queue
  • AI智能体-Coze文本知识库-飞书文档数据提取
  • LLM大模型工具链
  • NHANES最新指标推荐:NHR
  • Python 中的类属性与实例属性详解
  • 【isaac sim-15】具身仿真-你的第一个机械臂程序---
  • 什么是库存预警系统,如何搭建自动化库存预警系统