根据子类型的几种行为

时间:2019-03-22 08:41:58

标签: c#

假设我有一个界面

public interface IA
{
    double PerformCalculation();
}

和一个

public class C
{
    public IA ia {get; set;}
    public double DoCalculation()
    {
        return ia.SomeFunctionToImplement();
    }
}

按子类型,我的意思是实现此接口的类。 PerformCalculation背后的想法是,它是一个遵循数值算法的函数,在实现它的子类型中进行大量的数值计算。我的问题是,除了数值算法之外,我还有一些子类型,其中有一个公式可以跳过数值算法,因此对于这些子类型,我可以选择:算法还是公式。

哪些方法/“设计”可以让我跟踪此选择?

2 个答案:

答案 0 :(得分:0)

  

除了数字,我还有一些子类型   算法中,有一个公式可以跳过数值   算法

您本质上的要求是在合同中嵌入您希望具体实现提供的副作用。例如实施速度很快;它很慢;资源不足。就编译器可执行的语言功能而言,接口不能产生副作用。因此,“跟踪此选择”的唯一方法是使用命名约定建议提示。如果调用者确实在乎副作用,则可以定义如下接口:

interface IA 
{
   void PerformAlgorithm();
   void PeformFormula();
}

这是一个糟糕的解决方案,但是对于在接口级别实施副作用,您没有任何吸引人的选择。至少,调用者现在可以选择要调用的方法,但是必须信任具体类的实现者才能真正符合建议性名称。

答案 1 :(得分:0)

您可以使用FormulaIA来增强class C

public class C
{
    public IA NumericalIA { get; set; }
    public IA FormulaIA { get; set; }

    public double DoCalculation()
    {
        if (this.FormulaIA != null && ShouldUseFormula()) // ShouldUseFormula is your logic for deciding
        {
            return this.FormulaIA.PerformCalculation();
        }
        else
        {
            return this.NumericalIA.PerformCalculation();
        }
    }
}

然后,创建C类的任何人都只能填充一个或两个实现,并且您的类可以决定使用哪个实现。

这与使接口同时实现这两种方法没有什么不同,但是不会使那些不支持带有不必要方法的公式方法的实现混乱。