Я использую Hierarchical Builder Pattern. Я использовал обобщенные значения, чтобы сделать тип возвращаемого значения моего установщика Parent Builder таким же, как и для child. Тем не менее я сталкиваюсь с проблемой, когда я использую метод дочернего сеттера после вызова метода родительского сеттера. Я не хочу определять свой дочерний метод c (setEngine (String) здесь) в моем Parent Builder. Есть ли другой способ решения этой проблемы?
Я сделал пример фрагмента для упомянутой проблемы, идентичный этому случаю.
CarFactory -> Возвращает объект с указанием c автомобиля, который хочет пользователь
Автомобиль -> Родитель для всех типов автомобилей, Swift, Duster et c
Swift -> Специфика c автомобиль
Родитель-> Дочерняя иерархия
Автомобиль -> Swift
CarBuilder -> SwiftBuilder
Car. java
package Builders;
public class Car {
int tyre;
int seat;
public int getTyre() {
return tyre;
}
public void setTyre(int tyre) {
this.tyre = tyre;
}
public int getSeat() {
return seat;
}
public void setSeat(int seat) {
this.seat = seat;
}
}
Swift. java
package Builders;
public class Swift extends Car {
boolean safetyAirbag;
String engine;
public boolean isSafetyAirbag() {
return safetyAirbag;
}
public String getEngine() {
return engine;
}
public void setSafetyAirbag(boolean safetyAirbag) {
this.safetyAirbag = safetyAirbag;
}
public void setEngine(String engine) {
this.engine = engine;
}
}
CarBuilder. java
package Builders;
public abstract class CarBuilder {
int tyre;
int seat;
public abstract <B extends CarBuilder>B self();
public abstract <T extends Car>T typeOfCar();
public <B extends CarBuilder>B setTyre(int tyre) {
this.tyre = tyre;
return self();
}
public <B extends CarBuilder> B setSeat(int seat) {
this.seat = seat;
return self();
}
public <C extends Car>C build()
{ C car=this.typeOfCar();
car.setSeat(seat);
car.setTyre(tyre);
return car;
}
}
SwiftBuilder. java
package Builders;
public class SwiftBuilder extends CarBuilder {
String engine;
@Override
public
SwiftBuilder self() {
return this;
}
@Override
public
Swift typeOfCar() {
return new Swift();
}
public SwiftBuilder setEngine(String string) {
this.engine=string;
return this;
}
public Swift build()
{ Swift s=(Swift)super.build();
return s;
}
}
CarFactory. java
package Builders;
public class CarFactory {
public SwiftBuilder getSwiftDesire()
{
return new SwiftBuilder();
}
}
Драйверы. java
package Builders;
public class Drivers {
Swift getMyCar() {
Swift s= this.factory().getSwiftDesire().setSeat(4).setEngine("CC").build();
return s;
}
CarFactory factory() {
return new CarFactory();
}
}
В драйверах. java класс Я не могу использовать метод setEngine () после метода setSeat (), this.factory (). getSwiftDesire () setSeat (4) .setEngine ( "CC") сборки ()..; Я не хочу объявлять setEngine в родительском классе, есть ли способ для того же?
Заранее спасибо!