繁体   English   中英

通过通用接口调用具体的类函数

[英]Invoke concrete class functions through common interface

我有以下实现通用接口的具体类

EvaluatorA : IEvaluator
EvaluatorB : IEvaluator
EvaluatorC : IEvaluator

接口IEvaluator只有一个功能- Evaluate ,这是在所有三种评估的实施。 我有一个驱动程序类,该类基于配置调用评估器,但是,它只能(通过设计)对IEvalutor ,即,它不需要知道当前正在调用哪个具体评估器。

当其中一个评估程序(例如EvaluatorC )需要实现新功能Predict ,就会出现问题,而我的要求仅是对EvaluatorC ,需要在调用Evaluate之后调用Predict函数。

临时解决方案1:一种解决方案是检查评估者类型:

// evaluator is previously instanciated
evaluator.Evaluate();
if (evaluator is EvaluatorC)
    evaluator.Predict();

如您所见,这并不整齐。 明天再说我需要调用另一个函数DanceEvaluatorB和功能Sing两个EvaluatorAEvaluatorB ,它变得凌乱。

临时解决方案2:将函数Predict添加到接口IEvaluator ,对于其他评估器,只需将函数实现为空即可。 这可能适用于void返回类型函数,但是如果返回类型不是void ,则需要在驱动程序中进行其他安全检查。 另外,我不确定仅将空函数用作占位符是否是一个好主意。

临时解决方案3:将接口更改为抽象类。 这类似于解决方案2,但是提供了Predict的默认实现。 但是,我也不喜欢这种方法,因为它改变了项目的原始结构,与解决方案2相比并没有带来很多好处。

总的来说,我对这个问题没有令人满意的解决方案。 我希望decoration pattern可以有所帮助(但我不确定)。 此问题并非特定于任何编程语言。 请加入并分享您的想法。

编辑1:添加了有关评估者职责的一些详细信息评估者应评估给定的解决方案并返回一些度量。 获取评估指标后,驱动程序将执行一些内部管理任务,例如报告,请注意,所有评估者都需要这样做。 然后,其中一个评估者( EvaluatorC )需要根据生成的报告来调用Predict() 但是,其他评估者不需要此步骤。

由于我们正在谈论设计模式,因此我认为您所描述的内容使我想到了模板方法pattern

本质是,您可以在基类中定义算法的框架,然后让子类选择是否要实现某些步骤。 这是一个例子。

abstract class EvaluatorPredictor {
  void evaluateAndPredict() {
    evaluate();
    predict();
  }

  protected void evaluate() {
    // no-op
  };

  protected void predict() {
    // no-op
  };
}

class AEvaluator extends EvaluatorPredictor {
  protected void evaluate() {
    System.out.println("I implement this");
  }
}

class BEvaluator extends EvaluatorPredictor {
  protected void evaluate() {
    System.out.println("I implement this");
  }


  protected void predict() {
    System.out.println("I implement this too");
  }
}

请注意,您可以通过合成获得更多功能。 例如, EvaluatorPredictor或与此相关的任何类都可以使用分别实现EvaluatorPredictor接口的两个对象。

class Whatever {
  constructor(e Evaluator, p Predictor) {
    this.e = e;
    this.p = p;
  }

  void evaluateAndPredict() {
    this.e.evaluate();
    this.p.predict();
  }
}

PS。 请原谅我糟糕的类似于Java的语法。 我确定方法声明或访问修饰符中有错误。 希望以上帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM