首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据子类型的几种行为

根据子类型的几种行为
EN

Stack Overflow用户
提问于 2019-03-22 16:41:58
回答 2查看 63关注 0票数 0

假设我有一个接口

代码语言:javascript
复制
public interface IA
{
    double PerformCalculation();
}

和一个

代码语言:javascript
复制
public class C
{
    public IA ia {get; set;}
    public double DoCalculation()
    {
        return ia.SomeFunctionToImplement();
    }
}

对子类型,我指的是实现此接口的类。PerformCalculation背后的思想是,它是一个函数,在实现它的子类型中执行密集的数值计算,遵循一个数值算法。我的问题是,我有一些子类型,除了数值算法,还有一个公式允许跳过数值算法,所以对于这些子类型,我有一个选择:算法或公式。

让我跟踪这个选择的方式/“设计”是什么?

EN

回答 2

Stack Overflow用户

发布于 2019-03-22 17:06:56

i有一些子类型,对于这些子类型,除了数值算法之外,还有一个允许跳过数值算法的公式,

实际上,您所要求的是在契约中嵌入您希望具体实现提供的副作用。例如,它的实现很快;它很慢;它对资源很少。就编译器可强制执行的语言功能而言,接口不能强制执行副作用。因此,“跟踪此选择”的唯一方法是使用命名约定建议提示。如果调用者真的关心副作用,您可以定义一个接口,如下所示:

代码语言:javascript
复制
interface IA 
{
   void PerformAlgorithm();
   void PeformFormula();
}

这是一个糟糕的解决方案,但是您没有任何有吸引力的选择来在界面级别强制执行副作用。至少调用者现在能够选择要调用的方法,但必须信任具体类的实现者是真实的,以符合提示性的名称。

票数 0
EN

Stack Overflow用户

发布于 2019-03-22 17:36:34

你可以用FormulaIA来增强你的class C

代码语言:javascript
复制
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类,都可以只填充一个或两个实现,并且您的类可以决定使用哪一个实现。

这与让接口同时实现这两种方法没有太大区别,但它不会用不必要的方法使不支持公式方法的实现变得混乱。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55295781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档