接口实现C#泛型四则运算

news/2025/11/4 0:08:58/文章来源:https://www.cnblogs.com/hont/p/19188576

一般我们会对泛型字段做封装,使其支持OnChange、IsDirty等字段功能扩展,例如:

IObservable<float> hitPoint;

 

而有些字段则有挂载修改器的需求,修改器若使用lambda则对序列化不友好,因此考虑自行封装四则运算供修改器

给原始数值进行修改,但C#早期没有四则运算的接口。网上的dynamic动态类型做法对多平台并不友好。

 

不转弱类型的情况下,考虑通过接口解决,代码如下:

public interface IArithmeticOperator<T>
{public T Add(T x, T y);public T Sub(T x, T y);public T Mul(T x, T y);public T Div(T x, T y);
}public static class ArithmeticOperator<T>
{public static IArithmeticOperator<T> Instance;static ArithmeticOperator(){var type = typeof(T);if (type == typeof(int))Instance = (IArithmeticOperator<T>)(object)new IntAritOp();else if (type == typeof(float))Instance = (IArithmeticOperator<T>)(object)new FloatAritOp();}
}public class IntAritOp : IArithmeticOperator<int>
{public int Add(int x, int y) => x + y;public int Div(int x, int y) => x / y;public int Mul(int x, int y) => x * y;public int Sub(int x, int y) => x - y;
}public class FloatAritOp : IArithmeticOperator<float>
{public float Add(float x, float y) => x + y;public float Div(float x, float y) => x / y;public float Mul(float x, float y) => x * y;public float Sub(float x, float y) => x - y;
}public class AttributeModifier<T>
{private T _delta;public AttributeModifier(T delta) { this._delta = delta; }public T Add(T current) => ArithmeticOperator<T>.Instance.Add(current, _delta);public T Sub(T current) => ArithmeticOperator<T>.Instance.Sub(current, _delta);public T Mul(T current) => ArithmeticOperator<T>.Instance.Mul(current, _delta);public T Div(T current) => ArithmeticOperator<T>.Instance.Div(current, _delta);
}public class Test01 : MonoBehaviour
{void Start(){var op01 = new AttributeModifier<int>(10);var op02 = new AttributeModifier<int>(2);int hitPoint = 0;hitPoint = op01.Add(hitPoint);hitPoint = op02.Mul(hitPoint);Debug.Log(hitPoint);//20var op03 = new AttributeModifier<float>(4.5f);var op04 = new AttributeModifier<float>(2.2f);float stamina = 0f;stamina = op03.Add(stamina);stamina = op04.Mul(stamina);Debug.Log(stamina);//9.900001
    }
}

 

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

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

相关文章

[Flink/Hologres/汽车] 骋在数据洪流上:Flink+Hologres驱动零跑科技实时计算的应用与实践 [转]

0 序本文根据 2025 云栖大会演讲整理而成演讲信息如下: 演讲人: 聂清 零跑汽车大数据高级专家 零跑科技的快速发展与数据挑战 https://zhuanlan.zhihu.com/p/1966879670852093187零跑科技成立于2015年12月,总部位于浙…

openssl 3和qt5好像打架哎

openssl 3和qt5好像打架哎用~/ssf2fcitx把搜狗的皮肤转换成fcitx的皮肤。 ssf2fcitx用了qt5. 29个.ssf文件中有2个segmentation error. #0 0x00007ffff7ae00f0 in ?? () from /lib/x86_64-linux-gnu/libcrypto.so.3#…

给一个百分制成绩,要求输出成绩等级‘A,B,C,D,E

物联1251 LYH include <stdio.h> int main() { float a; scanf("%f", &a); if( a>=90 ) printf("A"); else if( a<90&a>=80 ) printf("B"); else if( a<80&a…

大模型应用开发技术路线(上):从概念到RAG实战,这套方法论让我从0到1落地企业级AI应用

本文分享了作者从0到1落地企业级AI应用的经验,重点介绍检索增强生成(RAG)技术路线。涵盖RAG核心概念、架构组件、文档处理、向量存储、提示工程等关键技术,以及评估优化方法和常见问题解决方案,提供了实用的实施指南…

20251103 之所思 - 人生如梦

20251103 之所思1. 昨天跑完十公里之后没有做任何补给就匆忙开车回另一个城市,开着开着感觉很困,但是因为在高速上,起点和终点也没有服务区,所以就一直坚持,有几秒钟自己应该是睡着了,突然不知是什么东西(第六感…

COMSOL Multiphysics 6.3 软件下载安装教程(包含许可证设置),从获取安装包到成功启动

目录一、COMSOL Multiphysics 6.3 软件介绍二、 COMSOL Multiphysics 6.3下载方式三、 COMSOL Multiphysics 6.3安装配置(一) COMSOL Multiphysics 6.3系统要求(二) COMSOL Multiphysics 6.3安装前准备四、 COMSOL…

11月3日

今日主要完成了城发投项目管理系统的开发工作。重点搭建了系统基础架构,包括数据库设计、前端页面布局和核心功能模块的实现。通过解决JSP页面与Java类的兼容性问题,加深了对MVC模式的理解。在项目立项功能中,完善了…

2025.11.3

今天进行了java考试

2025.11.3总结

今天继续学软考,将23种设计模式及其概念过了一下,并将下午题的第三问找出做题技巧 第一题的第三问有些思路了 对于实体类E,方法P,数据库表D,之间的数据流传递是根据说明中的一定规律来的。 具体解释为。 实体类调用…

Python中的数据串用:以推荐系统中“用户偏好管理”为例

Python中的数据串用:以推荐系统中“用户偏好管理”为例 在推荐系统中,“用户偏好管理”是核心模块之一。它需要精准记录每个用户的浏览历史、评分、兴趣标签等数据,以此为基础生成个性化推荐。但如果在实现时忽略了…

JOIST/JOISC 板刷计划

11.3 23:00 开始写。 你说的对,但是我真的分不清这两个又啥区别 /kk。 P9331 [JOIST 2023] 护照 / Passport 把 \(i\) 连向 \(i+n\) 边权为 \(1\),\(i+n\) 连向 \([l_i,r_i]\) 边权为 \(0\)。 答案似乎是 \(dis(1,x)…

11.3日学习笔记

实验3:工厂方法模式 本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解工厂方法模式的动机,掌握该模式的结构; 2、能够利用工厂方法模式解决实际问题。 [实验任务一]:加密算法 目前常用的加密算法…

Serilog 日志库简单实践(二):控制台与调试 Sinks(.net8)

本文主要介绍了控制台与调试 Sinks,并通过示例项目简单演示了它们的用法,供参考。〇、前言 前文已经介绍过什么是 Serilog,以及其核心特点,详见:https://www.cnblogs.com/hnzhengfy/p/19167414/Serilog_basic。 本…

Stable Diffusion v4.8 保姆级下载安装教程:新手零失败实操指南(含 ControlNet 配置)

目录一、Stable Diffusion核心信息介绍二、Stable Diffusion 详细安装操作指南模块 1:Stable Diffusion 安装包和模型下载模块 2:Stable Diffusion安装步骤(每步带踩坑提醒,零失败)步骤 1:解压文件(最容易出错的…

6-10 阶乘计算升级版 (20 分)

#include <stdio.h> void Print_Factorial ( const int N ); int main(){ int N;scanf("%d", &N); Print_Factorial(N); return 0;} /* 你的代码将被嵌在这里 */ 打印N!的值,涉及到大数…

每日收货

package Calculation; import javax.swing.; import java.awt.; import java.util.Timer; import java.util.TimerTask; public class TimeFrame extends JPanel { private JLabel timeLabel; // 显示时间 private Tim…

【C130x 离在线】Python使用import opuslib 报错解决方案

背景 最近在用 CI130X 离在线的SDK测试串口采音(采用Opus压缩),然后用 deepSeek 写了一段 python 测试脚本; 由于采集得到的是Opus格式的数据,最后生成的文件也是 Opus 格式的文件,因此需要写一个脚本进行解码,…

读《Python神经网络编程(异步图书) 塔里克拉希德》有感

近日来感觉需要学习的东西还是很多。这本书很早就躺在我的电脑里了,记得是一次出差时想下载到我的surface中看的,但是一直没看下去。最近对深度学习入门感兴趣,于是想找些入门书籍来看,这本书比较简短,用通俗的语…

【CI130x 离在线】Python使用import opuslib 报错解决方案

一、下载opuslib库 1、先在命令行cd到自己Python所在目录路径 2、运行以下指令 python.exe -m pip install opuslib 二、运行代码出现错误 raise Exception(Could not find Opus library. Make sure it is installed.)…

002 vue3-admin项目的目录及文件说明之.gitignore文件

.gitignore 文件是 Git 版本控制系统中非常重要的配置文件,用于指定哪些文件或目录应该被 Git 忽略,不纳入版本控制。 基本概念 作用告诉 Git 哪些文件不需要追踪 避免将不必要的文件提交到代码仓库 保持仓库清洁,减…