具有可用计数的泛型类型

本文关键字:泛型类型 | 更新日期: 2023-09-27 18:08:34

我正在用泛型测试c#中的多态性,并试图找到使泛型可计数的方法,但c#编译器不接受泛型上的求和等操作。我找到了一种变通方法,在此基础上创建了下面的代码,该代码继承自提供适当功能的接口:

using System.IO;
using System;
interface ICountable<T>
{
    T Add(T a, T b);
    T Multiply(T a, T b);
}
interface IExecute<T> : ICountable<T>
{
    T Operation(T a, T b);
}
class IntSum : IExecute<int>
{
    public int Add(int a, int b)
    {
        return a + b;
    }
    public int Multiply(int a, int b)
    {
        return a*b;
    }
    public int Operation(int a, int b)
    {
        return Add(a,b);
    }
}
class DoubleMultiply : IExecute<double>
{
    public double Add(double a, double b)
    {
        return a + b;
    }
    public double Multiply(double a, double b)
    {
        return a*b;
    }
    public double Operation(double a, double b)
    {
        return Multiply(a,b);
    }
}
class Program
{
    static void Main()
    {
        Console.WriteLine(DoOperation(new IntSum(), 1, 2));
        Console.WriteLine(DoOperation(new DoubleMultiply(), 3.5d, 3d));
    }
    static TResult DoOperation<TOperand, TResult>(TOperand obj, TResult a, TResult b)
    where TOperand : IExecute<TResult>
    {
        return obj.Operation(a,b);
    }
}

上面的代码可以工作,但最后我使用继承到一个具体的基本类型,并且有很多冗余的代码块。我的最终目标是使这样的类型尽可能泛型,类似如下:

using System.IO;
using System;
interface ICountable<T>
{
    T Add(T a, T b);
    T Multiply(T a, T b);
}
interface IExecute<T> : ICountable<T>
{
    T Operation(T a, T b);
}
// Generic code
class Sum<T> : IExecute<T>, ICountable<T>
{
    public T Add(T a, T b)
    {
        return a + b;
    }
    public T Multiply(T a, T b)
    {
        return a*b;
    }
    public T Operation(T a, T b)
    {
        return Add(a,b);
    }
}
class Program
{
    static void Main()
    {
        //Console.WriteLine(DoOperation(new IntSum(), 1, 2));
        //Console.WriteLine(DoOperation(new DoubleMultiply(), 3.5d, 3d));
    }
    //static TResult DoOperation<TOperand, TResult>(TOperand obj, TResult a, TResult b)
    //where TOperand : IExecute<TResult>
    //{
    //    return obj.Operation(a,b);
    //}
}

显然,编译器会报错,因为它不能对两个泛型求和。你认为我一定要继承到特定的原语吗?谢谢。

具有可用计数的泛型类型

您可以使用Expression.Add()和Expression.Multiply()来实现这一点。注意,如果没有为您使用的类型定义加法/乘法操作符,它们将抛出异常。