我有一系列我想支持执行数学运算的类。让我们说它看起来像这样:
public interface IWrapValueBase
{
public int aValue { get; set; }
}
public abstract WrapValueBase : IWrapValueBase
{
public int aValue { get; set; }
//...
}
public WrapValue : WrapValueBase
{
//...
}
我想创建一些运算符,以便我可以使用任何实现此接口的操作。例如:
public static WrapValue operator +(IWrapValueBase first, IWrapValueBase second)
{
return new WrapValue(} { aValue = first.aValue + second.aValue };
}
所以我想要一个允许使用+运算符将任何IWrapValueBases
加在一起的运算符,并返回一个新的WrapValue
实例。即:
List<IWrapValueBase> myList = new List<IWrapValueBase>();
myList.Add(new WrapValue() { aValue = 1 });
myList.Add(new WrapValue() { aValue = 2 });
WrapValue result = new WrapValue() { aValue = 0 };
foreach(IWrapValueBase val in myList)
result = result + val;
Assert.Equal(result.aValue, 3);
有没有办法做到这一点?或者,我是否必须在WrapValueBase
类中定义运算符,并将IWrapValueBase
引用转换为WrapValueBase
。
我的解决方案的问题是,它需要IWrapValueBase
类的每个实现者拥有它自己的运算符定义,因为我们知道接口具有aValue属性,所以我们应该总是可以将两个实现接口的实例加在一起,无论它们的类型是什么。
答案 0 :(得分:1)
来自语言规范§20.2接口成员
接口不能包含常量,字段,运算符,实例 构造函数,终结符或类型,接口也不能包含 任何形式的静态成员。
你也不能:
您似乎不是使用运算符而是使用方法“添加”,或者在基类中实现它。你真的有多个IWrapValueBase实现者吗?