2016-07-31 42 views
1

我在我的项目中有代表ID的对象。scala value class multiple inheritance

假设它是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成为一个特性,并使案例类扩展AnyVal与GenericId,但也不会编译:/

Anot她的事TableId.generate()我可以提供功能generate伴侣对象,基本上解决了我的问题,但我想知道是否有可能解决,而无需定义伴侣对象? (即通过某种方式implicits)

//编辑

有关评论提供的代码不编译(我想):

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) 
+0

我不完全确定你在问什么。如果存在多个问题,您可能希望将它们分成多个Stack Overflow问题。 –

+0

请包括您尝试过的代码和编译错误。我认为这会有所帮助。 –

回答

3

值类不能对这种工作方式几个原因。

首先,从documentation开始,值类别不能被任何其他类别扩展,所以AbstractId不能延伸AnyVal。 (Limitation #7

scala> abstract class AbstractId(val id: String) extends AnyVal 
<console>:10: error: `abstract' modifier cannot be used with value classes 
     abstract class AbstractId(val id: String) extends AnyVal 
        ^

其次,即使你让AbstractId一个特点,并定义其他IDS是这样的:

final case class DogId(val id: String) extends AnyVal with AbstractId 

..值类的用法不适合你情况,因为类本身仍然会被分配。看到allocation summary

  1. 的值类是作为另一种类型的处理:当

    值类实际上实例化。

  2. 一个值类被分配给一个数组。
  3. 进行运行时类型测试,如模式匹配。
+0

你打了我几秒钟:) – pedrofurla

1

value classes SIP有可能澄清你的疑虑的一些话:

值类...

  1. ...只能有恰好与一个公开,VAL 参数,其类型不是值类的主要构造。

  2. ...不能被另一个类扩展。

作为每1.它不能是抽象;每2.您的编码不起作用。

还有一个警告:

值类只能延伸普遍的特征和不能扩展 本身。通用性状是扩展Any的一个特征,只是将其作为成员,并且不进行初始化。通用特征允许值类的方法的基本继承,但它们产生分配的开销 。

与所有考虑到这一点,根据你过去的片段,这可能工作:

sealed trait AbstractId extends Any { def id: String } 
final case class CatId(id: String) extends AnyVal with AbstractId 
final case class DogId(id: String) extends AnyVal with AbstractId 

但是要记住分配唯一的,如果你想使用CATID和DogId作为AbstractId发生。为了更好的理解,我推荐阅读SIP。