Csharp/C#教程:在C#中是否有任何方法可以在派生类中强制执行运算符重载?分享


在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) { ... } } 

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

上述就是C#学习教程:在C#中是否有任何方法可以在派生类中强制执行运算符重载?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 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); } } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/996707.html

(0)
上一篇 2021年12月25日
下一篇 2021年12月25日

精彩推荐