【发布时间】:2011-02-09 10:33:05
【问题描述】:
我有一种情况,我希望某种类型的对象能够用作两种不同的类型。如果“基本”类型之一是接口,这将不是问题,但在我的情况下,最好它们都是具体类型。
我正在考虑将其中一种基类型的方法和属性的副本添加到派生类型,并添加从派生类型到该基类型的隐式转换。然后,用户可以通过直接使用重复的方法、将派生类型分配给基类型的变量或将其传递给采用基类型的方法来将派生类型视为基类型。
看起来这个解决方案很适合我的需求,但我有什么遗漏吗?是否存在这种情况不起作用,或者在使用 API 时可能会增加混乱而不是简单?
编辑:关于我的具体场景的更多细节:
这是为了将来重新设计指标在RightEdge 中的编写方式,这是一个自动交易系统开发环境。价格数据表示为一系列条形图,这些条形图具有给定时间段(1 分钟、1 天等)的开盘价、最低价、最高价和收盘价。指标对一系列数据进行计算。一个简单指标的示例是移动平均指标,它给出了其输入的最近 n 个值的移动平均值,其中 n 是用户指定的。移动平均线可以应用于收盘价,也可以应用于另一个指标的输出以使其平滑。
每次出现新柱时,指标都会为该柱计算其输出的新值。
大多数指标只有一个输出系列,但有时有多个输出很方便(见MACD),我想支持这一点。
因此,指标需要从“组件”类派生,该类具有在新数据进入时调用的方法。但是,对于只有一个输出系列(这是其中大部分)的指标,它将是有利于他们自己作为一个系列。这样,用户可以使用SMA.Current 作为 SMA 的当前值,而不必使用SMA.Output.Current。同样,Indicator2.Input = Indicator1; 优于 Indicator2.Input = Indicator1.Output;。这可能看起来差别不大,但我们的许多目标客户都不是专业的 .NET 开发人员,所以我想让这尽可能简单。
我的想法是对只有一个输出系列的指标进行从指标到其输出系列的隐式转换。
【问题讨论】:
-
你能提供更多关于你的实际用例的细节吗?你的基本类型是什么?通常,针对特定情况找到好的解决方案比针对一般问题更容易。
-
@dtb 根据要求,我在我的场景中添加了一些细节:)
-
你的问题主要是如何组合系列和指标的问题。如果您想保留具有输入和输出属性的类模式,我可能会保持原样(即
Indicator2.Input = Indicator1.Output;)。它是明确的、容易理解的和容易发现的。隐式转换增加了不必要的复杂性 IMO。但是,由于您谈论的是未来可能的重新设计,您可能会对以完全不同的方式组成系列和指标感兴趣,因此我发布了另一个答案。
标签: c# .net api-design implicit-conversion