首页 > 解决方案 > 有没有更好的方法来用泛型类型实现这个 IEquatable 接口

问题描述

目前我有一个类,它几乎只是一个布尔值的包装器,用于表示来自某些物理硬件的值。我将有另一堂这样的课,这是双节课。随着系统的增长,我们可能会有更复杂的类型,所以我希望事情可以扩展,但我从这里开始。所有这些类都代表物理值,因此它们需要是等价的,以便我们可以检查它们的有效性。到目前为止,我已经以这种方式实现了它们:

我有一个实现的 ISignalValue 接口IEquatable<ISignalValue>

    public interface ISignalValue : IEquatable<ISignalValue>
    {
       public string AssociatedSignal { get; set; }
    }

然后,我有一个实现此接口的通用基类,每个 SignalValue 都将从该基类继承。

public class SignalValue<T> : ISignalValue
{
    public readonly T Value;

    public SignalValue(T value)
    {
        Value = value;
    }

    public string AssociatedSignal { get; set; }

    public bool Equals(ISignalValue other)
    {

        if (Value is IEquatable<T>)
        {
            return Value.Equals((IEquatable<T>)other);
        }
        else return false;
    }   
}

最后,这是我实现的一个信号值。

public class DiscreteValue : SignalValue<DiscreteValue>
{
    public DiscreteValue(bool value) : base(value){}

    public double ToDouble() => Value ? 1 : 0;

    public static implicit operator DiscreteValue(bool b) => new DiscreteValue(b);
    public static implicit operator bool(DiscreteValue d) => d.Value;

}

我创建了隐式运算符,因为我希望类的用户能够做类似的事情, discreteValue.Equals(true)所以他们不需要做类似的事情discreteValue.Equals(new DiscreteValue(true))

现在,这一切正常。但我想知道的是,有没有更好的方法来实现这个,最具体地说是 IEquatable 接口?出于某种原因,将 DiscreteValue 定义为DiscreteValue : SignalValue<DiscreteValue>似乎很奇怪。DiscreteValue 是 DiscreteValue 类型的 SignalValue?感觉就像在这个词本身的定义中使用这个词。

我最初的想法是定义一个DiscreteValue: SignalValue<bool>更有意义的 DiscreteValue。但问题是,当我执行以下操作时,它会失败,因为一个是IEquatable<bool>,另一个是IEquatable<DiscreteSignal>

我得到这个例外:

无法将“-omitted-.Values.DiscreteValue”类型的对象转换为“System.IEquatable`1[System.Boolean]”类型

public bool Equals(ISignalValue other)
{

   if (Value is IEquatable<T>)
   {
     return Value.Equals((IEquatable<T>)other);
   }
   else return false;
 }   

那么,有没有更好的方法来处理这个问题,或者将 DiscreteValue 定义DiscreteValue: SignalValue<DiscreteValue>为要走的路?

标签: c#genericsinterface

解决方案


推荐阅读