首页 > 解决方案 > 创建计算数字 T 平均值的通用类

问题描述

我需要创建一个类

Average<T> 

包含3个方法:

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();

我整天都在努力解决这个问题,所以我没有取得任何成就。谁能帮我这个?

标签: c#.netgenerics

解决方案


考虑以下几点:

  • 数字没有这样的通用约束。
  • 当您想到限制为 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();
    }
}

推荐阅读