复制构造函数和继承

时间:2015-04-27 12:02:01

标签: java inheritance copy-constructor

我对java对象副本和继承感到好奇。可以说我有以下两个类:

abstract class Algorithm {
  public abstract void run();
}

class Specialized extends Algorithm {
  @Override
  public void run();
}

现在我想测试专门的算法。我真的想与多个实例/参数并行执行此操作。问题是run方法不可重入,因此我必须有Specialized的每线程实例。当然,任何类型AlgorithmRunner都应该与抽象类Algorithm一起使用,以便能够测试多个不同的特化。问题是我需要以通用的方式从现有的? extends Algorithm构造一个新的instanceof。我怎样才能做到这一点?我可以轻松地为每种专业化编写复制构造函数,但这需要使用countries.json检查切换,我宁愿避免。

2 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点。一种是让Algorithm具有用于获取实例的抽象工厂方法:

abstract class Algorithm {
  public abstract void run();

  protected abstract Algorithm buildInstance();
}

class Specialized extends Algorithm {
  @Override
  public void run() {
      // ...
  }

  @Override
  protected Algorithm buildInstance() {
      return new Specialized();
  }
}

FWIW,我倾向于将AlgorithmRunnerAlgorithm分开,并让它接受AlgorithmCreator或与工厂方法类似的实例。

答案 1 :(得分:3)

您可以尝试使用Factory pattern

interface AlgorithmFactory {
    public abstract Algorithm createAlgorithm();
}

class SpecializedFactory implements AlgorithmFactory {
    @Override
    public Specialized createAlgorithm() {
        return new Specialized();
    }
}

然后将AlgorithmFactory传递给AlgorithmRunner允许它在不知道其实现的情况下实例化Algorithm的子类。