我有以下对象:
- 公式
- 股票
- 柜台
- 等...
所有这些对象都称为指标并具有共同的属性(Id、名称、值...)。 每个实体都有自己的属性:
- 公式:FormulaExpression、FormulaCode、OperandsList ...
- 股票:StockValue、StockLimit...
- 计数器:CounterIndex...
- 等...
所以从逻辑上讲,我必须创建包含通用属性的指标类,并且对于每个实体我必须创建一个继承自指标的类。
公式是一种特殊的指标,可以包含任何类型的指标。公式的指示符被命名为操作数。
操作数对象具有以下属性: operandId, operandCode, operandIndex
当我想列出公式操作数时,我想获取从指标、操作数和实体类型继承的对象(例如,创建一个具有指标属性、操作数属性和股票属性的对象)
哪种设计模式或哪种架构允许我有这种行为?
进一步解释问题
实体(Formula
、stock
、Counter
..)是Indicators
,不是必需的操作数
,操作数
也是指标
。对象 Indicator
是实体的原始类型,我们可以创建一个 Indicator
然后将其装饰成一个 Formula
,而不是装饰成当它被添加到另一个 Formula
时成为一个 Operand
。
最佳答案
最好的方法是使用一个 expando 对象,每个操作数使用多态分派(dispatch) 填充该对象。 expando 对象允许您添加自定义属性,多态分派(dispatch)允许您关闭代码以防止操作数更改。
您将从使用包含基本元素的 Operand 的基类开始
public abstract class Operand
{
public int Id { get; set; }
public string Name { get; set; }
public dynamic BuildObject()
{
dynamic o = new ExpandoObject();
o.Id = Id;
o.Name = Name;
AddPropertiesToObject(o);
return o;
}
protected internal abstract void AddPropertiesToObject(dynamic o);
}
然后添加一个新的 Operand 类型就非常容易了,因为你可以独立地控制要添加的内容:
public class Stock : Operand
{
public double StockValue { get; set; }
protected internal override void AddPropertiesToObject(dynamic o)
{
// I decided to ignore the base class Id and Name
// adding them would be trivial, but may not be what you need since
// it would overwrite the base values...
// To add them you would have to wrap this virtual method call with
// a call to a function doing the insertion in the base class
o.StockValue = StockValue;
}
}
Formula
对象将简单地迭代包含的操作数并依次调用它们的 AddPropertiesToObject
(当然它也可以添加自己的数据,但对于我没有的示例不包括任何)
public class Formula : Operand
{
public List<Operand> InnerOperands { get; set; }
protected internal override void AddPropertiesToObject(dynamic o)
{
foreach (var op in InnerOperands)
{
op.AddPropertiesToObject(o);
}
}
}
关于c# - 哪种设计模式允许获得此架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23264292/