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)
不可以.唯一明智的方法是使用单元测试检查使用反射来查找所有具体实现,然后验证这种情况.你可以也可能做在运行时再相同的东西通过一个静态构造函数,但随后的问题是其静态构造函数?
另一种方法是放弃运算符并使用基于接口的方法; 例如,如果您需要T,+(T,T)那么而不是运算符具有与Add(T)方法的接口.这里的另一个优点是接口可用于泛型(通常通过约束),其中 - 使用来自通用代码的运算符需要一些努力.
您可以在抽象基类中实现重载,但是将实际操作细节委托给抽象方法.然后,这将必须实施,并且重载将与他们的实现相关.
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)
虽然我不确定这是否完整.
| 归档时间: |
|
| 查看次数: |
9268 次 |
| 最近记录: |