C# 希望避免在传递给组合的策略中出现降级
以下是我在金融业的问题领域: Asset ========== Asset parent assetID + compareTo(Asset anotherAsset) Portfolio : Asset ----------------- name risk limit List stocks + compareTo(Asset anotherAsset) + composite.CompareTo(Portfolio, ComparisonRules). Stock : Asset ------- market amount company + compareTo(Asset anotherAsset) AnotherStock : Stock -------------------- someOtherProperty + compareTo(Asset anotherAsset) 资产 ========== 资产母公司 阿塞蒂德 +比较(资产与其他资产) 投资组合:资产 ----------------- 名称 风险限额 上市股票 +比较(资产与其他资产) +composite.CompareTo(投资组合,比较规则)。 股票:资产 ------- 市场 数量 公司 +比较(资产与其他资产) 另一种股票:股票 -------------------- 其他财产 +比较(资产与其他资产) 我已经将复合模式应用于*Portfolio*s中的结构*Stock*s。我想有一个干净的方法来定制这个组合的compareTo方法。也就是说,另一只股票总是与另一只股票进行比较,一只股票对一只股票。在我看来,这是一种战略模式 我想执行以下操作(psuedocode) 差异=复合。比较到(另一个复合,比较规则)。 composite.CompareTo类似于: ComparisonRules.Compare(this.Stocks[currentAssetID],otherComposite[currentAssetID]) 比较规则。比较(资产a、资产b)会做一些像这样丑陋的事情: if( a is Stock and b is Stock) : convert to stock and do stock-based comparison else if (a is AnotherStock and b is AnotherSTock): convert to AnotherStock 如果(a是库存,b是库存):转换为库存并进行基于库存的比较 如果(a是另一种股票,b是另一种股票):转换为另一种股票C# 希望避免在传递给组合的策略中出现降级,c#,oop,design-patterns,C#,Oop,Design Patterns,以下是我在金融业的问题领域: Asset ========== Asset parent assetID + compareTo(Asset anotherAsset) Portfolio : Asset ----------------- name risk limit List stocks + compareTo(Asset anotherAsset) + composite.CompareTo(Portfolio, ComparisonRules). Stock : Asset --
有没有一种方法可以编写ComparisonRules,这样我就不必向下转换,但仍然可以提供自定义ComparisonRules对象?从规则的角度来看,听起来您需要的是泛型。如果您定义了以下内容:
public class ComparisonRule<TStock> where TStock : Stock
{
public int Compare(TStock lValue, TStock rValue)
{
...
}
}
这将允许您定义一个可以将任何股票
作为比较规则
进行比较的规则,或者一个只能将一只股票
作为比较规则
进行比较的规则
但是,这并不能帮助您确定如何知道哪些Stock
对象要传递给更高级别的规则。为此,您需要能够定义一个不太具体的ComparisonRule
版本,我们可以通过一个接口:
public interface IComparisonRule
{
bool CanCompare(Stock lValue, Stock rValue);
int Compare(Stock lValue, Stock rValue);
}
public abstract class ComparisonRule<TStock> : IComparisonRule where TStock : Stock
{
bool IComparisonRule.CanCompare(Stock lValue, Stock rValue)
{
return lValue is TStock && rValue is TStock;
}
int IComparisonRule.Compare(Stock lValue, Stock rValue)
{
return Compare((TStock)lValue, (TStock)rValue);
}
public abstract int Compare(TStock lValue, TStock rValue);
}
在更高的级别(即在
投资组合
)中,您只需将i比较规则
列表作为您的规则,然后您可以调用CanCompare
,并传入两个股票
实例以查看其是否有效比较,然后将它们传递到Compare
,以便执行比较。您的问题并不完全清楚;什么是复合。与之相比?假设您在问题的开头提供了一个类图(排序),那么composite.CompareTo
的命名无效。此外,“将比较定制为该组合的方法”也不完全清楚;您的意思是您希望能够提供一个规则列表,并且每个规则必须处理另一个股票、股票等等?您的意思是您希望能够提供一个规则列表,并且每个规则必须处理另一个股票、股票等等:是的,比较规则是否对两个股票起作用(即,将一只股票与另一只股票进行比较)或两份股票清单(将一份清单与另一份清单进行比较)?感谢您详尽的回答。
Stock
|
--------------------------
| |
OneStock AnotherStock
public interface IComparisonRule
{
bool CanCompare(Stock lValue, Stock rValue);
int Compare(Stock lValue, Stock rValue);
}
public abstract class ComparisonRule<TStock> : IComparisonRule where TStock : Stock
{
bool IComparisonRule.CanCompare(Stock lValue, Stock rValue)
{
return lValue is TStock && rValue is TStock;
}
int IComparisonRule.Compare(Stock lValue, Stock rValue)
{
return Compare((TStock)lValue, (TStock)rValue);
}
public abstract int Compare(TStock lValue, TStock rValue);
}
public class MyRule : ComparisonRule<AnotherStock>
{
public override int Compare(AnotherStock lValue, AnotherStock rValue)
{
return lValue.someOtherProperty.CompareTo(rValue.someOtherProperty);
}
}