Я ищу чистый объектно-ориентированный способ моделирования следующего (в 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? Помните: непреложность и безопасность типов являются обязательными.