scala: получить аргументы, используемые для создания экземпляра класса наследуемым способом? - PullRequest
10 голосов
/ 19 мая 2011

в Scala, у меня есть ситуация, когда базовый класс / черта расширяется очень многими дочерними классами.я собираюсь сериализовать экземпляр дочернего класса (с целью его реконструкции позже), получив имя класса и аргументы, используемые для создания экземпляра класса.легко получить имя экземпляра класса, используя отражение, но я не уверен, как получить аргументы экземпляра таким образом, чтобы не требовалось писать код в каждом дочернем классе.это должно также работать для аргументов, названных по имени.это кажется хитрым, потому что у каждого дочернего класса может быть совершенно разное число и тип аргументов конструктора:

abstract class Base {
  // ideally implements some way of finding out the arguments used to construct this object
  def getArgs = {...}
}

class ChildA() // args would be a 0-tuple

class ChildB(arg1: Int) // getArgs would be a 1-tuple of arg1

class ChildC(arg1: Double, arg2: Boolean) // args would be a 2-tuple of (arg1, arg2)

// etc... 

Чего я хочу избежать, так это чтобы каждый класс реализовывал метод, такой как "getArgs", и просто возвращал дубликат кортежа.аргументы от конструктора.Любой способ сделать это?

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

edit: подход с классом case элегантен, но в моей ситуации не подходит, потому что мы должны иметь возможность разрешить конкретным дочерним классам расширять другие конкретные дочерние классы.

1 Ответ

9 голосов
/ 19 мая 2011

Если ваша цель состоит в том, чтобы избежать написания кода в каждом дочернем классе для захвата аргументов, и все дочерние классы находятся в плоской иерархии, напрямую наследуемой от Base, а не друг от друга, вам следует рассмотреть возможность объявления их как case class вместо этого. Затем они автоматически расширили бы Product, и вы могли бы использовать и productIterator, например. сохраните все аргументы в Array[Any] (я использую Array, потому что это то, что нужно, когда вы рефлекторно вызываете конструктор этих классов позже):

* * 1010

Если вы хотите, чтобы toArray принимал только подклассы Base, объявите его параметр как Product with Base.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...