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

Наконец, я сделал это, как показано ниже, теперь я уверен, что это лучший способ. Я не хотел иметь три реализации только из-за одной переменной.

application.yaml

app:
   type-a:
      txn-log-file: data/type-a-txn-info.csv
   type-b:
      txn-log-file: data/type-b-txn-info.csv
   default: 
      txn-log-file: data/default/txn-info.csv

MainApplication.java

@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(MainApplication.class).web(WebApplicationType.NONE).run(args);
    }

    @Bean
    public TransactionManager transactionManager(@Value("${app.default.txn-log-file}") String txnLogFile) {
        return new TransactionManagerImpl(txnLogFile);
    }

    @Bean
    public CsvService csvService(String txnLogFile) {
        return new CsvServiceImpl(txnLogFile);
    }
}

TypeOneRoute.java

@Configuration
public class TypeOneRoute extends RouteBuilder {

    @Value("${app.type-a.txn-log-file}")
    private String txnLogFile;

    @Autowired
    private ApplicationContext applicationContext;

    private TransactionManager transactionManager;

    @Override
    public void configure() throws Exception {
        transactionManager = applicationContext.getBean(TransactionManager.class, txnLogFile);
        transactionManager.someOperation();

    }
}

TypeTwoRoute.java

@Configuration
public class TypeTwoRoute extends RouteBuilder {

    @Value("${app.type-b.txn-log-file}")
    private String txnLogFile;

    @Autowired
    private ApplicationContext applicationContext;

    private TransactionManager transactionManager;

    @Override
    public void configure() throws Exception {
        transactionManager = applicationContext.getBean(TransactionManager.class, txnLogFile);
        transactionManager.create();

    }
}

TransactionManager.java

@Service
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public interface TransactionManager {

    public ZonedDateTime create() throws IOException, ParseException;

}

TransactionManagerImpl.java

public class TransactionManagerImpl implements TransactionManager {

    @Autowired
    private ApplicationContext applicationContext;

    private String txnLogFile;

    public TransactionManagerImpl(String txnLogFile) {
        this.txnLogFile = txnLogFile;
    }

    private CsvService csvService;

    @PostConstruct
    public void init() {
        csvService = applicationContext.getBean(CsvService.class, txnLogFile);
    }

    public ZonedDateTime create() throws IOException, ParseException {
        try {
            csvService.createTxnInfoFile();
            return csvService.getLastSuccessfulTxnTimestamp();
        } catch (IOException e) {
            throw new IOException("Exception occured in getTxnStartDate()", e);
        }
    }

}

Изначально компонент TransactionManager будет зарегистрирован в app.default.txn-info.csv, и когда я получу его из ApplicationContext, я заменяю значение переданным параметром чтобы получить бин из ApplicationContext

18
задан Peter Wood 21 March 2013 в 19:47
поделиться

1 ответ

B::rofl(int) «скрывает» A::rofl(). Чтобы иметь A перегрузки rofl, вы должны объявить B как using A::rofl;.

class B : public A {
public: 
    using A::rofl;
    ...
};

Это мудрый шаг в C ++: он предупреждает вас о том, что вам, вероятно, также необходимо переопределить метод A::rofl() в B. Либо вы делаете это, либо вы явно заявляете, что используете другие перегрузки A.

31
ответ дан 30 November 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: