Чтобы полностью избежать реализации практически идентичного метода во всех подклассах, вам необходимо использовать рефлексию.Я думаю, это будет вашим последним средством, если вы выбрали Scala.Вот как минимизировать повторяющийся код:
// additional parameter: a factory function
abstract class MyClass(data: MyData, makeNew: MyData => MyClass) {
def update(): MyClass = {
makeNew(process())
}
def process(): MyData = {
...
}
}
class Concrete(data: MyData) extends MyClass(data, new Concrete(_))
Таким образом, вы повторяете только самый короткий фрагмент, необходимый для создания экземпляра подкласса.