Я ищу чистый объектно-ориентированный способ моделирования следующего (в Scala):
Человек может быть:
- Менеджер в какой-то фирме
- Математик
- Теннис в мире мирового класса
- Программист-программист
- Волонтер в местной школе
- Креативный художник
Это говорит о том, что мы вводим суперкласс и подклассы Person:
- class
Manager - class
Mathematician - class
TennisPlayer - class
HobbyistProgrammer - class
Volunteer - class
Painter
Класс Manager имеет такие методы, как: getSalary(), workLongHours(), findNewJob() и т.д. Класс TennisPlayer имеет такие методы, как: getWorldRanking(), playGame(), strainAnkle() и т.д.. И так далее. Кроме того, существуют методы в классе Person, такие как becomeSick(). Больной менеджер теряет работу, и теннисист перестает играть в сезоне.
Более того, классы неизменяемы. То есть, например, strainAnkle() возвращает новый TennisPlayer, который имеет напряженную лодыжку, но где все остальные свойства остаются неизменными.
Теперь вопрос: как мы моделируем тот факт, что человек может быть как Manager, так и TennisPlayer?
Важно, чтобы решение сохраняло как неизменность, так и безопасность типов.
Мы могли бы реализовать такие классы, как:
-
ManagerAndMathematician -
ManagerAndTennisPlayerAndPainter -
ManagerAndPainter
но это приводит к комбинаторному взрыву классов.
Мы могли бы также использовать черты (с состоянием), но тогда как мы реализуем такие методы, как findNewJob(), которые должны возвращать нового человека с теми же чертами, смешанными, но с новым состоянием Manager черта. Аналогично, как мы можем реализовать такие методы, как becomeSick()?
Вопрос: Как бы вы реализовали это в чистом OO-модуле в Scala? Помните: непреложность и безопасность типов являются обязательными.