Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 希望避免在传递给组合的策略中出现降级_C#_Oop_Design Patterns - Fatal编程技术网

C# 希望避免在传递给组合的策略中出现降级

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 --

以下是我在金融业的问题领域:

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是另一种股票):转换为另一种股票
有没有一种方法可以编写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);
    }
}