【发布时间】:2016-12-05 18:23:37
【问题描述】:
我的项目中有代表 ID 的对象。
假设它是ChairId、TableId、LampId。我希望它们都继承自 GenericId。我希望能够拨打def f(x: GenericId) = x.id
我希望他们只持有一个 id: String,所以我想让他们扩展 AnyVal。
我还希望每种类型都提供函数generate,它会生成我的特定ID,即我想输入类似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 成为一个特征,并使案例类使用 GenericId 扩展 AnyVal,但也不会编译:/
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)
【问题讨论】:
-
我不完全确定你在这里问什么。如果有多个问题,您可能希望将它们拆分为多个 Stack Overflow 问题。
-
请包含您尝试过的代码和编译错误。我认为这会有所帮助。
标签: scala inheritance value-class