我喜欢总是使用显式接口继承和私有构造函数来定义我的类,以便我强制客户端使用接口而不是直接新建类。我过去从未发现需要使用运算符重载,但现在我有一个完美匹配的类。不幸的是,我发现你必须使用静态方法来重载运算符,这意味着你不能在接口上定义它们。
为什么不喜欢这个?
(IMyObject)object1++;
您无法将界面传递给重载功能:
public static bool operator ==(IMyObject a, IMyObject b)
{
return a.Equals(b);
}
不起作用。
您必须使用实现来定义它:
public static bool operator ==(MyObject a, MyObject b)
{
return a.Equals(b);
}
我遇到的第一个缺陷是Equals()
没有用。 Equals()
只调用GetHashCode(),它是使用显式接口继承定义的,它调用System.Object.GetHashCode()
而不是我通过显式接口继承定义的那个:
int IMyObject.GetHashCode()
{
return _value.GetHashCode();
}
我可以在对象上覆盖GetHashCode并调用(IMyObject)this._value.GetHashCode();
,但这看起来非常混乱。
我知道您可以使用抽象类而不是接口,并在抽象类中声明您的运算符的重载。说实话,我不知道我是否喜欢这个,但也许是最好的方式?我不想让客户投射,以便能够在我的课堂上使用不同的功能,而且我也不希望任何人像我一样遇到任何缺陷。
糟糕的是,语言团队没有设计运营商重载,因此您可以使用虚拟方法,但我确定他们有自己的理由
编辑:
我决定反对我在这里的最佳做法,并让客户直接上课,而不是使用界面。我更喜欢不得不经常使用该类的不同功能。我会在这里留下这个问题,万一有人可以在将来找到一个好的解决方案。