interface IMathable
{
public static IMathable operator +(IMathable l, IMathable r);
public static IMathable operator -(IMathable l, IMathable r);
}
这样可能吗?我有一系列的数学课。 Vector2 / 3/4/5/6 Matrix3x3 / 4x4 / 5x5 / 6x6等。
他们没有共同的课程,他们开车。但它们都有+ - * /
之类的运算符我希望有一个类似的课程。
class MyClass <T> where T : IMathable
{
T magnitude_required_to_reach_toHere;
public MyClass (IMathable from, IMathable toHere)
{
magnitude_required_to_reach_toHere = from + toHere;
}
}
有没有办法实现这个目标?我被建议让所有的数学课都从抽象课开始,但我不能为所有这些数学课提供抽象课,因为它们是内置的,是图书馆的一部分;我无法修复代码。
答案 0 :(得分:1)
据我所知,您无法在界面上定义运算符。
但是运营商或多或少都是语法糖。
您可以定义:
interface IMathable {
IMathable add (IMathable other);
IMathable sub (IMathable other);
}
实际上,运算符或多或少是一种方法,但是该方法的标识符(+
和-
)以及编译器维护符号表的位置,并找出适当的运算符本身
修改:您提出的要求是不可能的。特别是因为IMathable
无法知道假定的返回类型应该是什么。
然而,通过使用一些函数式编程可以解决它的某种解决方法:
class MyClass <T> {
T magnitude_required_to_reach_toHere;
public MyClass (T from, T toHere, Func<T,T,T> addfunction) {
magnitude_required_to_reach_toHere = addFunction(from,toHere);
}
}
因此,您传递一个函数作为参数,该函数必须具有如何解决问题的计算知识。例如,如果T
是一个整数:
MyClass<int> mc = new MyClass<int>(5,7,(x,y) => x+y);