假设我有一个界面
public interface IA
{
double PerformCalculation();
}
和一个
public class C
{
public IA ia {get; set;}
public double DoCalculation()
{
return ia.SomeFunctionToImplement();
}
}
按子类型,我的意思是实现此接口的类。 PerformCalculation
背后的想法是,它是一个遵循数值算法的函数,在实现它的子类型中进行大量的数值计算。我的问题是,除了数值算法之外,我还有一些子类型,其中有一个公式可以跳过数值算法,因此对于这些子类型,我可以选择:算法还是公式。
哪些方法/“设计”可以让我跟踪此选择?
答案 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类的任何人都只能填充一个或两个实现,并且您的类可以决定使用哪个实现。
这与使接口同时实现这两种方法没有什么不同,但是不会使那些不支持带有不必要方法的公式方法的实现混乱。