Scala使用返回子类型的方法抽象类/特征

时间:2014-02-26 02:18:49

标签: scala

最近我发现自己正在使用具有相似结构的不同对象(使用播放框架,但这并不重要),我想将其存储为不同的类。它们通常具有基本相同的CRUD方法,因此我希望这些类中的每一个都从抽象类型继承以减少代码重复。我遇到的问题是:1。能够返回子类型,以及2.)在这些抽象方法中访问子类型的字段。

我成功地使用get方法成功地完成了这项工作(在一个更加充实的版本中)apply,但现在我已经碰壁了。这是一个高度简化的版本来表达我的问题,因此create的实现已被削减。 (实际的create方法需要访问对象的字段,将它们发送到数据库等。)

abstract class FileSystemObject(id: Int, path: String)

trait FileSystem[T <: FileSystemObject] {
    val table: String

    def apply(id: Int, path: String): T

    def create(obj: T): Option[T] = Some(apply(1, obj.path))

}

case class File(id: Int, path: String) extends FileSystemObject(id, path)

object File extends FileSystem[File] {
    val table: String = "files"
}

..这导致error: value path is not a member of type parameter T

此时,似乎我选择的解决方案存在严重缺陷,但我不知道如何从这里开始。

1 个答案:

答案 0 :(得分:4)

您需要path访问FileSystemObject才能在T上看到def。尝试将其设为abstract class FileSystemObject { def id: Int def path: String } case class File(id: Int, path: String) extends FileSystemObject ,由具体类覆盖:

{{1}}