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

代码重构 - 泛型继承与安全检查 - 泛型递归约束 - Curiously Recurring Template Pattern (CRTP)

Unity事件委托时,要设计事件类(类似Qt的信号类),实现基本一样就类型类名不一样,需要抽象

[!tip] 重构技巧
两个类的实现代码完全一样, 就只有类名或类型不一样的时候, 而且还需要不断扩展 (未来会增加各种事件) 的时候, 这时候就用泛型 + 继承来提取

  • 继承解决扩展的问题,
  • 泛型解决实现代码一致, 类不一致的问题

C# 实现

image

image

using System;namespace FrameworkDesign.Example
{// 泛型事件基类(带递归约束)// 约束:T 必须是继承自 EventBase<T> 的具体事件类型(自身类型约束)public abstract class EventBase<T> where T : EventBase<T>, new(){// 静态委托链:存储当前事件类型的所有订阅者private static Action mOnEvent;// 单例实例(确保每个具体事件类型只有一个实例)private static T mInstance;public static T Instance => mInstance ?? (mInstance = new T());// 注册订阅者public static void Register(Action onEvent){if (onEvent != null)mOnEvent += onEvent;}// 注销订阅者public static void UnRegister(Action onEvent){if (onEvent != null)mOnEvent -= onEvent;}// 触发事件(由具体事件类型调用)protected void TriggerEvent(){mOnEvent?.Invoke();}// 具体事件的触发逻辑(留给子类实现)public abstract void Trigger();}// --------------------------// 具体事件类型示例(继承通用框架)// --------------------------// 游戏开始事件(继承通用基类,满足递归约束)public class GameStartEvent : EventBase<GameStartEvent>{// 实现具体的触发逻辑public override void Trigger(){// 可以添加事件触发前的自定义逻辑Console.WriteLine("游戏开始事件触发前准备...");// 调用基类的触发方法TriggerEvent();}}// 游戏结束事件(另一个具体事件)public class GameOverEvent : EventBase<GameOverEvent>{public override void Trigger(){Console.WriteLine("游戏结束事件触发前准备...");TriggerEvent();}}
}

Cpp要实现只需要在顶层泛型调用时添加编译期检查即可,直接使用继承即可

// 转换为派生类(编译期检查:如果 Derived 不是正确的派生类,会报错)
static_cast<Derived*>(this)->PrintImpl();

http://www.gsyq.cn/news/42932.html

相关文章:

  • 安装btop
  • AI应用开发新范式!基于 RDS Supabase 服务高效构建轻量级应用,赢取淘公仔、加湿器等好礼!
  • odoo18-半成品入线边库、成品入成品库-教程
  • RK3588 上的 LLM(三):板端部署 RKLLM 并进行大模型推理(以 RK3588 为例)
  • FPS24 个人题解
  • 2025年11月有哪些值得推荐的洗地机品牌?友望云朵2.0实力领衔五大品牌
  • 构建可用于生产环境的AI智能体
  • 2025 年 11 月食堂承包公司权威推荐榜:专业饭堂承包方案,大型食堂承包商服务实力与客户口碑深度解析
  • 2025 年 11 月鞋业设计技术培训学校推荐排行榜,鞋业设计/技术培训,鞋业加盟公司推荐,专业教学与创业支持口碑之选
  • 2025 年 11 月仓储货架,重型货架,货架托盘厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读!
  • 2025 年 11 月优力胶厂家推荐排行榜,防静电优力胶,高硬度优力胶,专业定制与优质服务口碑之选
  • 微信公众号文章一篇最多放几个视频?
  • 2025年11月除锈剂厂家推荐排行榜:专业解析钢铁、金属、不锈钢等材料除锈解决方案
  • 2025 年 11 月研磨膏厂家推荐排行榜,金刚石研磨膏,油性金刚石研磨膏,水性金刚石研磨膏公司推荐
  • 555定时器-1 555定时器简介
  • 2025年北京唯宝智能马桶公司权威推荐榜单:annwa智能马桶/科勒卫浴/vivi马桶源头公司精选
  • Looper、MessageQueue、Message及Handler的关系是什么?如何保证MessageQueue的并发访问安全? - 教程
  • 「机器学习笔记7」决策树学习:从理论到实践的全面解析(上) - 详解
  • axios 请求错误重复请求
  • 2025年磷酸氢二钠供货厂家权威推荐榜单:磷酸二氢钠/草酸/磷酸氢二钾源头厂家精选
  • 2025年无风感空调品牌权威推荐榜单:省电空调/小户型空调/防直吹空调源头厂家精选
  • 2025年绝缘油滤油机直销厂家权威推荐榜单:润滑油滤油机/真空抽气机组/透平油滤油机设备源头厂家精选
  • 国产化文档开发组件Spire.Office 10.10 全新发布!多项文档处理能力重磅升级
  • fastutil 实战指南:用原始类型集合把性能“薅满”
  • 实用指南:【Java并发】深入理解synchronized
  • Modbus Tcp协议
  • Cursor 2.0 扩展 Composer 功能,助力上下文感知式开发 - 公众号
  • Linux命令总览
  • 量化选股与量化交易第819篇:大单短线量化指标公式 - Leone
  • 量化选股与量化交易第820篇:趋势突破K线均线平台指标公式 - Leone