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

Hem*_*ant 20 c# abstract-class interface operator-overloading

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

Cod*_*uth 24

有点黑客,但......

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

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

    protected abstract MyClass __DoAddition(MyClass c2);
}
Run Code Online (Sandbox Code Playgroud)

  • 这个问题是返回类型是`MyClass`,而不是覆盖类.这使链接相当危险,链接是这里的意图. (8认同)
  • 您还可以使用通用抽象类,该类具有泛型类必须从中派生的约束.例如`public abstract class SomeClass <T>其中T:SomeClass <T>`然后让所有方法都将类型T作为参数,以及它们的返回类型. (3认同)

Mar*_*ell 9

不可以.唯一明智的方法是使用单元测试检查使用反射来查找所有具体实现,然后验证这种情况.你可以可能做在运行时再相同的东西通过一个静态构造函数,但随后的问题是静态构造函数?

另一种方法是放弃运算符并使用基于接口的方法; 例如,如果您需要T,+(T,T)那么而不是运算符具有与Add(T)方法的接口.这里的另一个优点是接口可用于泛型(通常通过约束),其中 - 使用来自通用代码的运算符需要一些努力.

  • 使用像 Add、Subtract 这样的方法是下一个明显的选择,但因为我的代码将有很多计算,比如 `s = s1 * 2 + s2 * s3 - s4 * (s5 - s6);`。使用方法会使它`s = s1.Multiply(2).Add(s2.Multiply(s3)).Subtract(s4.Multiply(s5.Subtract(s6)));` 肯定不是很可读! (2认同)

Pre*_*gha 5

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

public abstract class OverLoadingBase
{
    public abstract OverLoadingBase DoAdd(OverLoadingBase y);

    public static OverLoadingBase operator +(OverLoadingBase x, OverLoadingBase y)
    {
        return x.DoAdd(y);
    }    
}
Run Code Online (Sandbox Code Playgroud)

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