Можем ли мы назначать/изменять черты для класса scala во время выполнения? Как - любой пример кода? Как шаблон стратегии (из шаблона проектирования «Банда четырех»)

Чтобы объяснить мой вопрос:

Класс : Игрушка

Черта 1: Говорите как мужчина

Черта 2: Говорите как женщина

Могу ли я изменить поведение (черты) Toy во время выполнения, чтобы иногда один и тот же объект говорил как мужчина, а иногда один и тот же объект говорил как женщина?

Я хочу изменить разговорное поведение во время выполнения.


person Optimight    schedule 15.06.2012    source источник


Ответы (2)


Scala действительно не делает этого. Есть подключаемый модуль автопрокси Кевина Райта, который может это сделать, и вы можете создавать экземпляры и возражать с любым трейтом, при этом этот трейт не является частью базового класса.

Лично я считаю, что пытаться добиться чего-то таким образом — значит идти против сути Scala: сложно и склонно застревать. Лучше спроектировать решение, которое не требует таких вещей — на самом деле зернистость Scala гораздо больше тяготеет к функционалу, который делает акцент на неизменности всего и замене одного объекта новым в результате вычислений.

person Daniel C. Sobral    schedule 15.06.2012
comment
Сэр, согласен и согласен с тем, что Scala стремится к функционалу, который делает упор на неизменность и замену одного объекта новым в результате вычислений. Запрос: В реальном мире игрок (объект) меняет свое поведение с оборонительного на агрессивное, поддерживающее и т. д., но его жизнь продолжается. Если игрок помещается в программу, всякий раз, когда его поведение меняется, мы должны программировать таким образом, чтобы существующий игрок (объект) заменялся новым игроком с текущим поведением, верно? Как запрограммировать этот сценарий на Scala. (сценарий Java: интерфейсы могут быть изменены во время выполнения.) - person Optimight; 16.06.2012
comment
Сэр, я прочитал Плагин Autoproxy - Часть I и II. Это функциональность, как в инструменте обработки аннотаций Java? Есть ли в Scala средства обработки аннотаций? - person Optimight; 16.06.2012
comment
@Optimight Scala не имеет инструментов для обработки аннотаций. Это плагин компилятора, то есть расширение самого компилятора. - person Daniel C. Sobral; 17.06.2012

sealed trait Speaker
case object Male extends Speaker
case object Female extends Speaker

class Toy(name: String, speaks: Speaker = Male) { 
  def speak = speaks match {
    case Male   => "ugh"
    case Female => "What time do you call this?"
  }
}

потом

barbie = ken.copy(speaks = Female)

Вы не можете изменить trait, которые объект расширяет во время выполнения, потому что trait смешивается для создания класса (в файле .class). У данного объекта есть только один класс, и это никогда не может быть изменено.

person oxbow_lakes    schedule 15.06.2012
comment
Сэр, большое спасибо за ваш вклад. Применю ваш код на практике и постараюсь в нем разобраться. Мне до сих пор непонятно, как заставить ту же Барби говорить как мужчина? Обратите внимание, что я только новичок в Scala и у меня очень мало опыта программирования. - person Optimight; 15.06.2012
comment
В этом случае просто сделайте val значением var (значения case class равны val по умолчанию). Попробуйте Toy(var speaks: Speaker), а затем ken.speaks = Female - person oxbow_lakes; 15.06.2012