我正在使用泛型类型测试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);
//}
}
显然,编译器抱怨因为它不能求和两种泛型类型。你认为我总是要继承特定的原语吗?感谢。
答案 0 :(得分:0)
您可以使用Expression.Add()和Expression.Multiply()来实现此目的。请注意,如果没有为您使用的类型定义加法/乘法运算符,它们将抛出异常。