具有可用计数的泛型类型
本文关键字:泛型类型 | 更新日期: 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()来实现这一点。注意,如果没有为您使用的类型定义加法/乘法操作符,它们将抛出异常。