在C#中是否有任何方法可以在派生类中强制执行运算符重载?

我需要定义一个接口,它必须强制执行某些运算符重载到实现它的类型。 似乎没有一种明显的方法可以做到这一点,因为运算符重载必须在类中使用静态方法完成。 有没有办法达到相同的效果(使用抽象类或其他任何东西)?

有点黑客,但……

您可以在基类中提供运算符重载,然后在其中一个类中调用一些已发布的抽象方法来完成该任务。

public abstract class MyClass { public static MyClass operator +(MyClass c1, MyClass c2) { return c1.__DoAddition(c2); } protected abstract MyClass __DoAddition(MyClass c2); } 

不可以。唯一明智的方法是使用unit testing检查使用reflection来查找所有具体实现,然后validation这种情况。 您也可以通过静态构造函数在运行时执行相同的操作,但问题是哪个静态构造函数?

另一种方法是放弃运算符并使用基于接口的方法; 例如,如果你需要T+(T,T)那么代替运算符的接口有Add(T)方法。 这里的另一个优点是接口可用于generics(通常通过约束),其中 – 使用来自通用代码的运算符需要一些努力。

您可以在抽象基类中实现重载,但是将实际操作细节委托给抽象方法。 然后,这将必须实施,并且重载将与其实现相关。

 public abstract class OverLoadingBase { public abstract OverLoadingBase DoAdd(OverLoadingBase y); public static OverLoadingBase operator +(OverLoadingBase x, OverLoadingBase y) { return x.DoAdd(y); } } 

虽然我不确定这是否完整。

我过去做过这个…

 public abstract class BaseClass where TClass : BaseClass { public static TClass operator +(TClass c1, TClass c2) { return c1.DoAddition(c2); } protected abstract TClass DoAddition(TClass c2); } 

然后实施如下:

 public class ConcreteClass : BaseClass { protected ConcreteClass DoAddition(ConcreteClass c2) { ... } } 

由于它的操作员只能过载而不能被覆盖,因此非常困难。 我能想到的最好的解决方案是使用抽象类并像这样重载。

 public abstract class MyBase { public abstract MyBase Add(MyBase right); public abstract MyBase Subtract(MyBase right); public static MyBase operator +(MyBase x, MyBase y) { //validation here return x.Add(y); } public static MyBase operator -(MyBase x, MyBase y) { //validation here return x.Subtract(y); } }