src/main
└─java
├─base...
│
└─lotto
├─controller
├─model
│ ├─bonus
│ ├─lotto
│ │ └─winning
│ ├─money
│ ├─prize
│ └─stats
└─view
├─sin
└─sout
추상 클래스 View
를 상속받는 클래스들은 필요에 따라 메서드를 @Overrides
하여 자신의 기능을 구현한다.
ConsoleInput
은 내부적으로 다음과 같은 생성자를 갖는다.
따라서, 상속받는 클래스는 super()
메서드를 통해 본 명세를 만족하도록 호출해야만 한다.
public abstract class ConsoleInput<IN extends Schema> implements AutoCloseable {
...
protected ConsoleInput(View<IN> view, Validator<IN> validator, Scanner scanner) {
this.scanner = scanner;
this.view = view;
this.validator = validator;
}
...
}
외부에서 적절한 인자를 넘겨주도록 구현할 수 있다.
이 경우, 다양성을 확보할 수 있지만, 호출부가 지저분해진다.
private MoneyConsoleInput(View<IMoneyInput> view, Validator<IMoneyInput> validator, Scanner scanner) {
super(view, validator, scanner);
}
클래스 내부에 기본값을 설정해둘 수 있다.
이 경우, 생성자 오버로딩
또는 public static of()
메서드를 제공하여 인스턴스를 생성한다.
public class WinningLottoConsoleInput extends ConsoleInput<IWinningLottoInput> {
private WinningLottoConsoleInput(
View<IWinningLottoInput> view,
Validator<IWinningLottoInput> validator,
Scanner scanner
) {
super(view, validator, scanner);
}
public static ConsoleInput<IWinningLottoInput> of(Scanner scanner) {
return new WinningLottoConsoleInput(
new WinningLottoInputView(),
new WinningLottoInputValidator(),
scanner
);
}
...
}