感谢大家的回答。
最后,这是我为该问题选择的解决方案。希望有用。如果您有 cmets 或知道在不更改框架的情况下改进它的方法,请告诉我。
首先,我创建了一个要求最低的 ISensor 接口。之后我定义了一个新的 ISensor 通用接口如下:
public delegate void SensorErrorEventHandler<TSensor>(TSensor sensor, ISensorError error)
where TSensor : ISensor;
public delegate void SensorReadingCompletedEventHandler<TSensor, TReading>(TSensor sensor, TReading[] read)
where TSensor : ISensor
where TReading : ISensorReading<TSensor>;
public interface ISensor : IDisposable
{
bool IsOpen { get; }
bool Started { get; }
void Connect();
void Disconnect();
void Start();
void Stop();
}
public interface ISensor<TSensor, TReading> : ISensor
where TSensor : ISensor
where TReading : ISensorReading<TSensor>
{
TReading[] LastReadings { get; }
event SensorErrorEventHandler<TSensor> Error;
event SensorReadingCompletedEventHandler<TSensor, TReading> ReadCompleted;
bool Read(out TReading[] readings);
}
public interface ISensorReading<TSensor> where TSensor : ISensor
{
TSensor Sensor { get; }
bool Mistaken { get; }
}
定义了这些接口并遵循相同的结构,我能够进行第一个实现:具有对应 ITelemetricReading 的 TelemetricSensor 类
public delegate void TelemetricSensorThresholdExceededEventHandler<TSensor>(TSensor sensor)
where TSensor : ITelemetricSensor;
public interface ITelemetricSensor : ISensor
{
/* Properties, events and methods */
}
public interface ITelemetricReading : ISensorReading<ITelemetricSensor>
{
/* Properties, events and methods */
}
public abstract class TelemetricSensor<TSensor, TReading> : ITelemetricSensor, ISensor<TSensor, TReading>
where TSensor : ITelemetricSensor
where TReading : ITelemetricReading, ISensorReading<TSensor>
{
public abstract TReading[] LastReadings { get; }
public event SensorErrorEventHandler<TSensor> Error;
public event SensorReadingCompletedEventHandler<TSensor, TReading> ReadCompleted;
public abstract bool Read(out TReading[] readings);
}
TelemetricSensor 抽象类的 TReading 很有趣。它被定义为
TReading : ITelemetricReading, ISensorReading<TSensor>
这可能看起来是多余的,因为 ITelemetricReading 继承自 ISensorReading,但需要编译代码并满足两者的要求
TReading[] LastReadings { get; }
财产和
bool Read(out TReading[] readings);
方法。最后,为了跳过繁琐的转换(可能还有一些错误),可以对 Read(...) 进行多次重载,以便每个都提供正确转换的数据并满足所有接口实现。