Java: возвращение подкласса в сигнатуре метода суперкласса

Я работаю над проблемой, где есть несколько реализаций Foo, сопровождаемых несколькими FooBuilder с. В то время как Fooимеют несколько общих переменных, которые необходимо установить, у них также есть отдельные переменные, которые требуют соответствующих FooBuilderдля реализации некоторых специфических функций. Для краткости я бы хотел, чтобы сеттеры FooBuilderиспользовали цепочку методов, например:

public abstract class FooBuilder {
  ...

  public FooBuilder setA(int A) {
    this.A = A;
    return this;
  }

  ...
}

и

public class FooImplBuilder extends FooBuilder{
  ...
  public FooImplBuilder setB(int B) {
    this.B = B;
    return this;
  }
  public FooImplBuilder setC(int C) {
    this.C = C;
    return this;
  }
  ...
}

и так далее, с несколькими различными реализациями FooBuilder.Технически это делает все, что я хочу, однако этот подход чувствителен к порядку вызовов методов при выполнении цепочки методов. Следующее содержит ошибки компиляции метода undefined:

someFoo.setA(a).setB(b)...

Требуется, чтобы разработчик думал о порядке вызовов методов в цепочке. Чтобы избежать этого, я хотел бы, чтобы сеттеры в FooBuilderкаким-то образом возвращали реальный реализующий подкласс. Однако я не уверен, как это сделать. Каков наилучший подход?

24
задан downer 10 June 2012 в 12:08
поделиться