c# - 有没有更好的方法来用泛型类型实现这个 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>
为要走的路?
解决方案
推荐阅读
- android - 如何用 Geb Spock Appium 实现页面对象机制
- xml - 在 XML 中设置 Fragment 的控制器
- ruby-on-rails - Refinery CMS - 如何调整资源图像的大小?
- php - 如何将字符串数据更改为 Laravel Query 格式
- mysql - Mysql,左连接选择并创建索引
- wordpress - WooCommerce 无法更改模板文件中的内容
- url - 更改 prestashop 中自动生成的 url 的结构
- android - 从Android NDK 15切换到17 找不到malloc和朋友
- android - 如何在 camera2 android 中手动控制 SensorExposureTime 和 SensorSensitivity(ISO)?
- c# - wpf中拖放时如何设置Listview Itemtemplate