具有自由参数的特征方法

时间:2015-09-02 17:53:52

标签: scala

我正在尝试编写一个存储库特征,如:

trait Repository[E <: Entity] {
  def exists(id: Long): Boolean
  def get(id: Long): E
  def insert(entity: E): Unit
  def delete(entity: E): Unit
}

此代码的问题是实体可能有一个不是Long的复合键,因此在实现存储库时我遇到了完成特征合同的问题。

我试图将密钥表示为另一个特征的实现,但由于存储库特征无法处理每个实体的特定实现,因此我无法履行合同。

我可以设置exists的参数并获得免费吗?我可以指定依赖de实体键的类型的函数类型吗?

2 个答案:

答案 0 :(得分:3)

您可以尝试将复合键表示为元组。

trait Repository[E <: Entity, K] {
  def exists(id: K): Boolean
  def get(id: K): E
  def insert(entity: E): Unit
  def delete(entity: E): Unit
}

如果一个名为Thing的实体,其键是String和Long的复合,将是:

class ThingRepository extends Repository[Thing, (String, Long)] {
  def exists(id: (String, Long)): Boolean = ???
  def get(id: (String, Long)): Thing = ???
  def insert(entity: Thing): Unit = ???
  def delete(entity: Thing): Unit = ???
}

答案 1 :(得分:-1)

根据我的想法,您可以使用任意而不是,然后您可以使用大小写匹配进行转换回到你需要的类型。

以下代码编译并应该可以使用,但我还没有尝试过。

trait Repository[E <: Entity] {
  def exists(id: Any): Boolean
  def get(id: Any): E
  def insert(entity: E): Unit
  def delete(entity: E): Unit
}

case class SimpleRepository(user: User) extends Repository[User] {

   def exists(id: Any) = {
      id match {
         case key: Long => user.id.equals( key )
         case (key: Long, key2: String) => 
            user.id.equals( key ) && user.name.equals( key2 )
         case _ => false
      }
   }

   def get(id: Any) = {
      id match {
         case key:Long => user
         case _ => user
      }
   }

  def insert(entity: User) = {

  }

  def delete(entity: User) = {

  }

}

不确定您的具体用例,但我希望它有所帮助。