У меня есть объекты проекта, которые представляют идентификаторы.
Допустим, это ChairId, TableId, LampId. Я хочу, чтобы все они наследовали от GenericId. И я хочу иметь возможность звонить def f(x: GenericId) = x.id
Я хочу, чтобы они содержали только один id: String
, поэтому я хотел бы, чтобы они расширяли AnyVal.
Также я хотел бы, чтобы для каждого типа была предоставлена функция generate
, которая генерировала бы мой конкретный идентификатор, т.е. я хотел бы ввести что-то вроде ChairId.generate()
Я набрал это:
sealed abstract class GenericId(val id: String)
final case class ChairId(override val id: String) extends GenericId(id)
final case class TableId(override val id: String) extends GenericId(id
И я думал, что если бы GenericId наследовал AnyVal, это сработало бы, но пока безуспешно;/ Я также пытался сделать GenericId чертой и сделать классы case расширением AnyVal с помощью GenericId, но также не будет компилироваться:/
Еще одна вещь с TableId.generate()
. Я могу предоставить объект-компаньон только с функцией generate
, и это в основном решает мою проблему, но мне интересно, есть ли возможность решить это без определения объекта-компаньона? (т.е. как-то через имплициты)
// редактировать
относительно комментария для предоставления кода, который не компилируется (и я хотел бы):
sealed abstract class AbstractId(val id: String) extends AnyVal
final case class CatId(override val id: String) extends AbstractId(id)
final case class DogId(override val id: String) extends AbstractId(id)