假设我有一个接口
public interface IA
{
double PerformCalculation();
}和一个
public class C
{
public IA ia {get; set;}
public double DoCalculation()
{
return ia.SomeFunctionToImplement();
}
}对子类型,我指的是实现此接口的类。PerformCalculation背后的思想是,它是一个函数,在实现它的子类型中执行密集的数值计算,遵循一个数值算法。我的问题是,我有一些子类型,除了数值算法,还有一个公式允许跳过数值算法,所以对于这些子类型,我有一个选择:算法或公式。
让我跟踪这个选择的方式/“设计”是什么?
发布于 2019-03-22 17:06:56
i有一些子类型,对于这些子类型,除了数值算法之外,还有一个允许跳过数值算法的公式,
实际上,您所要求的是在契约中嵌入您希望具体实现提供的副作用。例如,它的实现很快;它很慢;它对资源很少。就编译器可强制执行的语言功能而言,接口不能强制执行副作用。因此,“跟踪此选择”的唯一方法是使用命名约定建议提示。如果调用者真的关心副作用,您可以定义一个接口,如下所示:
interface IA
{
void PerformAlgorithm();
void PeformFormula();
}这是一个糟糕的解决方案,但是您没有任何有吸引力的选择来在界面级别强制执行副作用。至少调用者现在能够选择要调用的方法,但必须信任具体类的实现者是真实的,以符合提示性的名称。
发布于 2019-03-22 17:36:34
你可以用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类,都可以只填充一个或两个实现,并且您的类可以决定使用哪一个实现。
这与让接口同时实现这两种方法没有太大区别,但它不会用不必要的方法使不支持公式方法的实现变得混乱。
https://stackoverflow.com/questions/55295781
复制相似问题