泛化一对方法而不会丢失静态类型检查

时间:2019-01-22 23:28:01

标签: java oop design-patterns

我正在一个宠物项目中尝试练习(纯正?)OO,并且无法从几个类中弄清楚如何分解一个共同的行为。 enter image description here enter image description here

public Solution improve(Solution initialSolution)
{
    stopCondition.setInitialSolution(initialSolution);

    Solution nextSolution = initialSolution;
    do
    {
        nextSolution = nextSolutionGenerator.generate(nextSolution);
    }
    while(!stopCondition.isStopConditionReached());

    return nextSolution;
}

如您所见,生成对于BinaryNextSolutionGenerator和PermutationNextSolutionGenerator都是通用的。我知道解决方案生成(Solution solution)应该在NextSolutionGenerator中,但是如果我将PermutationSolution实例发送到BinaryNextSolutionGenerator实例中,我不想在编译时丢失类型验证。 看起来我必须使用通用编程,或者我的设计从根本上是错误的(或者是一个普通的权衡?),但是我之前希望有一些有经验的意见。

顺便说一句,仅生成调用doGenerate的操作,因为我打算在其中添加一些常用的日志记录代码。

1 个答案:

答案 0 :(得分:0)

  1. 将解决方案和生成器/重构为接口。
    • 泛型的“好地方”是将Integer getVariable(int idx)重构为<V extends java.lang.Number> getVariable(int idx)
    • 另一个“好的通用场所”是Soultion“ generator.generate”的(精确)类型...
  2. 介绍该接口的抽象实现!并放置尽可能多的通用代码(public Solution<V> generate() {...}),强制执行所需的方法(<S extends Solution<V>> proteced abstract S doGenerate(S prev);AbstractGenerator也是放置imporve的地方(并且public generate)方法。
  3. 扩展这些抽象类并实施强制方法(使用解决方案的具体实现)
  4. 与解决方案构建器相同:使用抽象,扩展

...

https://github.com/xerx593/soq54317950更好地解释了我的观点...还概述了improve()StopCondition<V extends Number, S extends Solution>