如何正确设计一个使用显式接口继承和运算符重载的类

时间:2015-06-25 16:44:43

标签: c# .net interface architecture operator-overloading

我喜欢总是使用显式接口继承和私有构造函数来定义我的类,以便我强制客户端使用接口而不是直接新建类。我过去从未发现需要使用运算符重载,但现在我有一个完美匹配的类。不幸的是,我发现你必须使用静态方法来重载运算符,这意味着你不能在接口上定义它们。

为什么不喜欢这个?

  1. 每次要使用运算符时都必须强制转换和对象:(IMyObject)object1++;
  2. 您无法将界面传递给重载功能:

    public static bool operator ==(IMyObject a, IMyObject b)
    {
        return a.Equals(b);
    }
    

    不起作用。

    您必须使用实现来定义它:

    public static bool operator ==(MyObject a, MyObject b)
    {
        return a.Equals(b);
    }
    
  3. 我遇到的第一个缺陷是Equals()没有用。 Equals()只调用GetHashCode(),它是使用显式接口继承定义的,它调用System.Object.GetHashCode()而不是我通过显式接口继承定义的那个:

     int IMyObject.GetHashCode()
     {
         return _value.GetHashCode();
     }
    

    我可以在对象上覆盖GetHashCode并调用(IMyObject)this._value.GetHashCode();,但这看起来非常混乱。

    我知道您可以使用抽象类而不是接口,并在抽象类中声明您的运算符的重载。说实话,我不知道我是否喜欢这个,但也许是最好的方式?我不想让客户投射,以便能够在我的课堂上使用不同的功能,而且我也不希望任何人像我一样遇到任何缺陷。

    糟糕的是,语言团队没有设计运营商重载,因此您可以使用虚拟方法,但我确定他们有自己的理由

    编辑:
    我决定反对我在这里的最佳做法,并让客户直接上课,而不是使用界面。我更喜欢不得不经常使用该类的不同功能。我会在这里留下这个问题,万一有人可以在将来找到一个好的解决方案。

0 个答案:

没有答案