【发布时间】:2011-12-19 14:44:14
【问题描述】:
我深入研究了 C#,但遇到了一个我似乎无法解决的问题:
我设计了一个财务回测和交易引擎,作为其中的一部分,我喜欢实施一个“策略容器”。这个策略容器应该有两个目的。 (1) 保存执行数学计算的不同策略的实例,以及 (2) 提供访问器以便将新的分时数据传递到策略实例并从策略实例接收某些信息。
我上面提到的不同策略应该是唯一的类,但是,它们是从基类派生的。我想在这些策略中执行完全不同的操作,因此我认为将它们设计为从一个基类派生的单独类是可行的。一个复杂之处是我需要策略容器中包含的每个策略类的多个实例。每个策略类还包含一个股票代码列表,每个代码都应该获取它的 on strategy 实例。
策略容器的另一个重要点是它可以创建、实例化,然后还可以调用每个策略实例。
我想问你们中的一些人有什么样的想法,我可以如何设计和实施这个:
- 总体上最好的设计模式是什么?
- 如前所述,如果我为每个策略创建不同的类,那么我显然也会得到不同的类型,我如何将所有这些都保存在策略容器内的一个容器/集合中?
- 如何通过反射或其他方式创建、实例化和调用每个策略实例的方法,而不知道我最终会得到多少。我知道策略的名称和类型,也知道股票代码的名称。
- 我只想提供我想连接的策略(我提供策略名称 = 类名称?),并为每个策略提供一个股票代码列表。策略容器将为提供列表的策略类型的每个策略中的每个交易品种创建实例,并随后调用“RunStrategy(Quote quote)”方法,该方法将新报价输入每个实例,以便可以执行计算。
- 一个目标是使每个策略类的接口尽可能干净,大多数标准(重复)功能都在派生的基类中实现。
我不要求提供完整的源代码,而是提供您认为我应该如何设计这个东西以及我如何完成上述每一点的想法。这是我自己的东西,不会变成任何商业产品。我对编写实现数学点点滴滴的代码非常满意,但我对设计模式和系统架构不太熟悉。
编辑: Graymatter,我玩了一下,似乎你提供了我想要的东西。非常感谢。
class Program
{
static void Main(string[] args)
{
List<IStrategy> container = new List<IStrategy>();
container.Add(new StrategyOne());
container[0].AddValue(50);
Console.ReadLine();
}
}
public interface IStrategy
{
void AddValue(int value);
}
public class StrategyOne : StrategyBase
{
public override void Calculates()
{
Console.WriteLine("This is my value: " + myValue);
}
}
public class StrategyBase : IStrategy
{
protected int myValue;
public void AddValue(int value)
{
Console.WriteLine("Run Strategy in Base");
myValue = value;
Calculates();
}
public virtual void Calculates()
{
}
}
【问题讨论】:
标签: c# class reflection containers base