Вызов метода / функции каждый раз, когда объявляется val / var (без явного вызова метода / функции) - PullRequest
0 голосов
/ 09 февраля 2020

Редактирование из-за комбинации слишком сложного примера и непрозрачного изложения моих намерений.

У меня есть 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, однако я пытаюсь выяснить, есть ли решение, которое проще в кодировании.

Может не будет приличного способа сделать это, что было бы хорошо. В этом случае я не возражаю против дополнительных затрат в базовых классах, чтобы облегчить написание расширенных классов.

Удален оригинальный вопрос как слишком сложный

1 Ответ

2 голосов
/ 10 февраля 2020

Создание нового Apple или Orange вне класса, который расширяет MyBase, было бы нарушением DSL в данном конкретном случае.

Из контекста не ясно, будет ли это желательно или нет.

В любом случае, вы рассматривали, что может быть достигнуто с помощью частного конструктора и вспомогательного конструктора publi c?

import scala.collection.mutable.ListBuffer

class MyBase{
  class Apple private (lb :ListBuffer[Apple]) {
    lb += this
    def this() = this(allApples)
  }
  class Orange private (lb :ListBuffer[Orange]) {
    lb += this
    def this() = this(allOranges)
  }
  val allApples  = ListBuffer[Apple]()
  val allOranges = ListBuffer[Orange]()
}

class SomeNewClass extends MyBase{
  val apple1 = new Apple
  val apple2 = new Apple
  val orange1 = new Orange
}

class AnotherClass extends MyBase{
  val someClass = new SomeNewClass
  val apple1 = new Apple
}

val snc = new SomeNewClass
val ac = new AnotherClass
snc.allApples.size   //res0: Int = 2
snc.allOranges.size  //res1: Int = 1
ac.allApples.size    //res2: Int = 1
ac.allOranges.size   //res3: Int = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...