[英]C# interface to check type T has an operator / A way to check if type T has an operator
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;
}
}
有没有办法做到这一点? 建议我让我所有的数学课都从抽象类继承,但是我不能为所有这些数学类都提供抽象类,因为它们是内置的,属于库的一部分。 我无法修复代码。
据我所知,您不能在接口上定义运算符。
但是运算符或多或少是语法糖。
您可以定义:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.