Pracuję nad problemem, w którym jest kilka implementacji Foo
, wraz z kilkoma FooBuilder
. Podczas gdy Foo
ma kilka wspólnych zmiennych, które muszą być ustawione, mają również różne zmienne, które wymagają ich odpowiednich FooBuilder
do realizacji niektórych konkretnych funkcji. Dla zwięzłości, chciałbym mieć FooBuilder
„s ustawiające użyć metody łańcuchowym, jak:Java: powracająca podklasa w sygnaturze metody superklasy
public abstract class FooBuilder {
...
public FooBuilder setA(int A) {
this.A = A;
return this;
}
...
}
i
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;
}
...
}
i tak dalej, z kilku różnych FooBuilder
wdrożeń. Technicznie robi to wszystko, co chcę, jednak to podejście jest wrażliwe na kolejność wywołań metod, gdy wykonywane jest łańcuchowanie metod. Poniżej podano metodę niezdefiniowanych błędów kompilacji:
someFoo.setA(a).setB(b)...
Wymaganie, aby deweloper pomyślał o kolejności wywołań metod w łańcuchu. Aby tego uniknąć, chciałbym, aby ustawiający w FooBuilder
w jakiś sposób zwrócili rzeczywistą podklasę wykonawczą. Jednak nie jestem pewien, jak to zrobić. Jakie jest najlepsze podejście?
Wymusza również rzucanie we wszystkie strony lub uniemożliwia zmianę właściwości klas nadrzędnych, kiedy chcesz. –