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

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

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

Trait1: говори как мужчина

Trait2: говори как женщина

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

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

2 ответа

Решение

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

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

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)

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

Другие вопросы по тегам