2014-02-26 123 views
1

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

我成功地通过利用applyget方法得到了这个工作(在更加充实的版本中),但是现在我已经碰壁了。这是一个高度简化的版本来表达我的问题,所以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

在这一点上,似乎我已经解决选择是可怕的缺陷,但我不知道如何从这里开始。

回答

4

您需要path才能在FileSystemObject上访问,以便在T上看到它。尝试将其设为def,并由具体的类别覆盖:

abstract class FileSystemObject { 
    def id: Int 
    def path: String 
} 

case class File(id: Int, path: String) extends FileSystemObject 
相关问题