Вы не можете сделать это с изменяемым репозиторием, потому что вы не можете изменить сигнатуру класса, как только он определен.
Это было бы возможно сделать, если бы addThing
возвратил новый репозиторий, потому что добавление ComplexThing
может вернуть хранилище без метода addThing
, а добавление SimpleThing
возвращает хранилище с методом addThing
.
case class StaticThingRepository(buffer: List[Thing])
class ThingRepository private(buffer: List[Thing]) {
def addThing(thing: Thing): ThingRepository =
new ThingRepository(buffer :+ thing)
def addThing(thing: ComplexThing): StaticThingRepository =
StaticThingRepository(buffer :+ thing)
}
object ThingRepository {
def apply() = new ThingRepository(Nil)
}