我有一个我一直在努力的系统。本质上,它使用大量抽象来处理以后的扩展不仅是预期的,而且是必要的。需要这样做的一个地方是数据访问。该系统通常处理封装一些观察(在观察值或一组值的意义上)并使用它们的管理对象。为此,我有一些大意:
public interface Observation
{
/** UniqueKey is used to access/identify an observation */
UniqueKey Key
{
get;
}
}
public interface ObservationDataSource
{
/**
* Retrieves an Observation from the actual data source.
* performs any necessary operations to encapsulate values in object
*/
Observation GetObservationByUniqueKey(UniqueKey key);
}
这些接口的特定实现会出现问题。最终,Observation
andObservationDataSource
类是用特定的运行时类实现的。但是,UniqueKey
也可以扩展以处理用于数据源中观察的任何唯一标识值集(可能是 id,可能是时间等)。所以任何实现GetObservationByUniqueKey
都会暴露一个UniqueKey
参数,但需要一个特定的子类。我希望在UniqueKey
传入后将其转换为特定类型。
这似乎是一个糟糕的设计选择,因为实现对参数要求撒谎——但我看不到另一种方法。我希望其他人使用这些接口,所以我不能说我会记住这个约定。
有什么想法可以修复它或更优雅地处理它吗?