自定义的泛型类和泛型约束

简介:

自定义的泛型类和泛型约束

现在继续考虑Order,在企业中订单有很多种,运输单、出库单、外借单、报关单等等。因此应该把Order作为基类,然后其他订单从该类派生。
现在我们再看一下用户业务流程:当不同的用户角色创建了不同的订单,然后系统将这些订单汇总到公司的审计部,当审计通过后,订单将转向各自需要处理的业务部门。
为了实现这个方案,我们在Order声明了一个Send方法。

   
   
  1. public class Order 
  2. {  
  3. public string OrderID;  
  4. public readonly DateTime CreateDate = DateTime.Now;  
  5. public virtual void Send()  
  6. {System.Console.WriteLine("Order");}  
  7. }  

由于Send声明为virtual的,所以为其子类的各订单提供了多态的行为。
 

   
   
  1. public class ConsignationBill : Order 
  2.  {  
  3.  public override void Send()  
  4.  {  
  5.  System.Console.WriteLine("ConsignationBill");  
  6.  }  
  7.  }  
  8.  public class DispatchBill : Order 
  9.  {  
  10.  public override void Send()  
  11.  {  
  12.  System.Console.WriteLine("DispatchBill");  
  13.  }  
  14.  }  
  15.  public class WarehouseBill : Order 
  16.  {  
  17.  public override void Send()  
  18.  {  
  19.  System.Console.WriteLine("WarehouseBill");  
  20.  }  
  21.  }  
现在考虑一个很实际的处理问题,当审计部门通过了订单的审核,需要执行Send方法,以便将订单转到业务相应的部门。那我们希望有一个类来处理对审核后的订单的任务传递
 

   
   
  1. public class Audit  
  2.  {  
  3.  private readonly Order tmpOrder;  
  4.  public Audit(Order order)  
  5.  {  
  6.  tmpOrder = order;  
  7.  }  
  8.  public void AuditTask()  
  9.  {  
  10.  tmpOrder.Send();  
  11.  }   
  12.  }  
 测试一下
 
 new Audit(new ConsignationBill()).AuditTask();
 new Audit(new DispatchBill()).AuditTask();
 new Audit(new WarehouseBill()).AuditTask();

通过了,效果不错。
现在考虑更多情况,Send很明显是用于业务流转的方法,除了订单,其他业务数据也会有流转的要求,为了统一,很显然,应该用到接口

    
    
  1. public interface ISend  
  2. {  
  3. void Send();  
  4. }  
更特别的是,不是所有的单据都有业务流转的行为,所有不能让Order去实现ISend接口,而是由Order的各子类去按实际情况分别实现ISend。
所以刚才的类的实现为
 

    
    
  1. public class ConsignationBill : Order,ISend  
  2.  {  
  3.  public void Send()  
  4.  {  
  5.  System.Console.WriteLine("ConsignationBill");  
  6.  }  
  7.  }  
  8.  public class DispatchBill : Order, ISend  
  9.  {  
  10.  public void Send()  
  11.  {  
  12.  System.Console.WriteLine("DispatchBill");  
  13.  }  
  14.  }  
  15.  public class WarehouseBill : Order, ISend  
  16.  {  
  17.  public void Send()  
  18.  {  
  19.  System.Console.WriteLine("WarehouseBill");  
  20.  }  
  21.  }  
现在我们如果要求Audit能够正常调用Send的方法,那Audit的实现为
 

    
    
  1. public class Audit  
  2. {  
  3. private readonly ISend sender;  
  4. public Audit(ISend Sender)  
  5. {  
  6. sender = Sender;  
  7. }  
  8. public void AuditTask()  
  9. {  
  10. System.Console.WriteLine(sender.GetType().ToString());  
  11. sender.Send();  
  12. }   
  13. }  
ok,虽然修改了Audit,但对调用者完全没有影响。那还有新的要求吗?有!
现在Audit类能接受所有实现了ISend的类,现在要求更严谨的处理:Audit类只能处理Order的子类,且该子类必须实现了ISend的接口。
晕啊,怎么写啊?使用反射帮忙
 

    
    
  1. public class Audit  
  2. {  
  3. private readonly ISend sender;  
  4. public Audit(ISend Sender)  
  5. {  
  6. sender = Sender;  
  7. }  
  8. public void AuditTask()  
  9. {  
  10. if (sender.GetType().BaseType.Name == "Order")  
  11. {  
  12. System.Console.WriteLine(sender.GetType().BaseType.Name);  
  13. System.Console.WriteLine(sender.GetType().ToString());  
  14. sender.Send();  
  15. }  
  16. }  
  17. }  
  18. 能不能代码更简洁简单呢?可以,用泛型的约束能力  
  19.  
  20. public class TAudit<T> where T : Order, ISend  
  21. {  
  22. private readonly T sender;  
  23. public TAudit(T Sender)  
  24. {  
  25. sender = Sender;  
  26. }  
  27. public void AuditTask()  
  28. {  
  29. System.Console.WriteLine(sender.GetType().BaseType.Name);  
  30. System.Console.WriteLine(sender.GetType().ToString());  
  31. sender.Send();  
  32. }  
  33. }  

以上说明该泛型能接受的对象是从Order继承,且实现了ISend接口,实例化的代码为
 
 new TAudit<ConsignationBill>(new ConsignationBill()).AuditTask();
 new TAudit<DispatchBill>(new DispatchBill()).AuditTask();
 new TAudit<WarehouseBill>(new WarehouseBill()).AuditTask();
使用泛型的约束,能让代码更加的清晰和简单。

本文转自shyleoking 51CTO博客,原文链接:http://blog.51cto.com/shyleoking/806247

相关文章
|
2天前
|
弹性计算 运维 搜索推荐
三翼鸟携手阿里云ECS g9i:智慧家庭场景的效能革命与未来生活新范式
三翼鸟是海尔智家旗下全球首个智慧家庭场景品牌,致力于提供覆盖衣、食、住、娱的一站式全场景解决方案。截至2025年,服务近1亿家庭,连接设备超5000万台。面对高并发、低延迟与稳定性挑战,全面升级为阿里云ECS g9i实例,实现连接能力提升40%、故障率下降90%、响应速度提升至120ms以内,成本降低20%,推动智慧家庭体验全面跃迁。
|
3天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
351 91
|
10天前
|
人工智能 自然语言处理 前端开发
Qoder全栈开发实战指南:开启AI驱动的下一代编程范式
Qoder是阿里巴巴于2025年发布的AI编程平台,首创“智能代理式编程”,支持自然语言驱动的全栈开发。通过仓库级理解、多智能体协同与云端沙箱执行,实现从需求到上线的端到端自动化,大幅提升研发效率,重塑程序员角色,引领AI原生开发新范式。
851 156
|
3天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
257 156
|
4天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
11天前
|
机器人 API 调度
基于 DMS Dify+Notebook+Airflow 实现 Agent 的一站式开发
本文提出“DMS Dify + Notebook + Airflow”三位一体架构,解决 Dify 在代码执行与定时调度上的局限。通过 Notebook 扩展 Python 环境,Airflow实现任务调度,构建可扩展、可运维的企业级智能 Agent 系统,提升大模型应用的工程化能力。
|
人工智能 前端开发 API
前端接入通义千问(Qwen)API:5 分钟实现你的 AI 问答助手
本文介绍如何在5分钟内通过前端接入通义千问(Qwen)API,快速打造一个AI问答助手。涵盖API配置、界面设计、流式响应、历史管理、错误重试等核心功能,并提供安全与性能优化建议,助你轻松集成智能对话能力到前端应用中。
816 154