Предположим, у меня есть следующее
abstract class Strategy {
val lib: TestingLibrary = ...
}
Стратегия и TestingLibrary являются абстрактными, поскольку для них требуется getClosingTime, предоставленный
trait Market {
def getClosingTime: String
}
Конкретная реализация может быть
trait LSE extends Market {
def getClosingTime = "16:35:00"
}
Во время выполнения я хочу иметь возможность указать, что конкретная стратегия и библиотека TestingLibrary используют LSE.Это означает, что при вызове getClosingTime они оба должны иметь конкретную реализацию, возвращающую «16:35:00».Я думал о чем-то вроде
val lseStrategy = new Strategy with LSE
Я хотел бы придерживаться черт, если это возможно, но не знаю, как смешать LSE с TestingLibrary.Возможно, весь мой подход необходимо изменить, но основные бизнес-правила:
- Стратегия имеет - TestingLibrary
- Стратегия и TestingLibrary оба полагаются на абстрактный метод getClosingTime
- getClosingTime должен иметь одинаковую конкретную реализацию для обоих во время выполнения
- Стратегия не должна принимать никаких параметров в конструкторе (из-за дополнительных расширений ее может потребоваться преобразовать в черту)
- Пользователи стратегиине должен ничего знать о TestingLibrary
На данный момент я нахожу количество различных опций в недоумении.В Java я сделал что-то вроде следующего:
class LSETestingLibrary extends TestingLibrary {
String getClosingTime {return "16:35:00"}
}
class Strategy {
TestingLibrary lib;
Strategy(Market market) {
if (market == LSE) lib = new LSETestingLibrary();
}
String getClosingTime { return lib.getClosingTme();}
}
, но я считаю "если" уродливым способом сделать что-то, так как добавление новых рынков потребовало бы излишне перекомпилировать Strategy