Редактирование из-за комбинации слишком сложного примера и непрозрачного изложения моих намерений.
У меня есть class
, из которого дизайнеры будут расширяться и строить. Чтобы сохранить код в чистоте, я хотел бы иметь возможность выполнять комбинацию действий, когда создаются определенные классы c.
Я знаю, что могу использовать объект-компаньон с пользовательским apply()
для выполнения большей части этого и будет работать за исключением того, что мне нужно знать класс, который создает экземпляр указанного класса c (и я пытаюсь избежать передачи this
в качестве параметра).
class Apple{}
class Orange{}
class MyBase{
val allApples = ListBuffer[Apple]()
val allOranges = ListBuffer[Orange]()
}
//User defined classes extending MyBase
class SomeNewClass extends MyBase{
val apple1 = new Apple //we would want to add apple1 to the allApples List
val apple2 = new Apple
val orange1 = new Orange
}
class AnotherClass extends MyBase{
val someClass = new SomeNewClass
val apple1 = new Apple
}
Таким образом, вы можете видеть, что я хочу иметь возможность добавлять экземпляры Apple в allApples ListBuffer и то же самое для апельсинов. Я хотел бы иметь возможность сделать это без , требующего типа addApple
метода. Проблема в том, что я не имею никакого отношения к SomeNewClass
или AnotherClass
(или к тому, что еще сделал бы дизайнер). Я мог бы иметь неявное подобное:
class Apple()(implicit myBaseCaller : MyBase){
myBaseCaller.addApple(this)
}
class MyBase{
implicit val myself : MyBase = this
//excluded for clarity
}
Создание нового Apple или Orange вне класса, расширяющего MyBase, было бы нарушением DSL в данном конкретном случае.
Так что я не согласен с тем, что лучшим решением будет явный метод addApples, однако я пытаюсь выяснить, есть ли решение, которое проще в кодировании.
Может не будет приличного способа сделать это, что было бы хорошо. В этом случае я не возражаю против дополнительных затрат в базовых классах, чтобы облегчить написание расширенных классов.
Удален оригинальный вопрос как слишком сложный