簡體   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