c# - 创建计算数字 T 平均值的通用类
问题描述
我需要创建一个类
Average<T>
包含3个方法:
- T average() - 返回 T 值集合的平均值;
- add(T item) - 将项目添加到 T 值的集合中
- reset() - 将 Average 实例重置为其默认状态
T 必须是数字(int、float、byte 等)
据我了解,我必须创建基本抽象类或接口:
public abstract class NumericBase<T>{}
我的派生类继承:
public class NumericInt:NumericBase<int>{}
之后我应该创建我的平均类:
public class Average<T> where T: NumericBase<T>
但我猜最后一步是错误的,因为我必须在 Average 类中创建方法 add(T item),如果我正确理解了这个任务,它必须像这样工作:
Average<int> av = new Average();
av.add(3);
av.add(4);
int averageValue = av.average();
av.reset();
我整天都在努力解决这个问题,所以我没有取得任何成就。谁能帮我这个?
解决方案
考虑以下几点:
- 数字没有这样的通用约束。
- 当您想到限制为 2-3 种类型的泛型约束时,通常意味着您不需要泛型类型,而是需要创建 2-3 个不同的类。
我不确定您是否真的需要使用泛型类型,但如果出于学习目的,您只想使用泛型、列表和 Enumerable 类方法,您可以检查T
构造函数中的类型以及它是否不是允许的类型之一(例如 int 和 double)然后抛出异常。
using System;
using System.Collections.Generic;
using System.Linq;
public sealed class MyBadClass<T>
{
List<T> list;
public MyBadClass()
{
var allowedTypes = new[] { typeof(int), typeof(double), typeof(float) };
if (!allowedTypes.Contains(typeof(T)))
throw new Exception($"Type '{typeof(T)}' not supported.");
list = new List<T>();
}
public double Average()
{
return list.Cast<double>().Average();
}
public void Add(T value)
{
list.Add(value);
}
public void Reset()
{
list.Clear();
}
}
推荐阅读
- c++ - 除了默认值,我如何从这个 switch 语句中获得输出?
- ffmpeg - FFMPEG 找不到 H264 编码器
- react-native - 无法解析 Apollo Client 版本 3 的模块
- javascript - 为什么 AJAX 不停止页面刷新?
- android - 为什么重新安装 Android Studio 后 SHA-1 在 Google Play Console 中不起作用?
- python - 如何使日期仅显示一个月的周末(周六和周日)?
- typescript - Vue.js/TypeScript 中的动态类绑定
- c++ - 谷歌测试检查浮点不相等
- performance - Jmeter http请求完成通知
- elasticsearch - 如何更新一组文档的 routingId