Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala抽象类/特征,包含返回子类型的方法_Scala - Fatal编程技术网

Scala抽象类/特征,包含返回子类型的方法

Scala抽象类/特征,包含返回子类型的方法,scala,Scala,最近,我发现自己使用play framework处理具有类似结构的不同对象,但这并不重要,我希望将其存储为不同的类。它们通常具有基本相同的CRUD方法,因此我希望这些类中的每一个都从抽象类型继承,以减少代码重复。我遇到的问题是:1。能够返回子类型,以及2。在这些抽象方法中访问子类型的字段 我利用apply的get方法成功地在一个更加充实的版本中实现了这一点,但现在我遇到了麻烦。这是一个高度简化的版本来表达我的问题,因此create的实现被减少了。实际的create方法需要访问对象的字段,将它们发

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

我利用apply的get方法成功地在一个更加充实的版本中实现了这一点,但现在我遇到了麻烦。这是一个高度简化的版本来表达我的问题,因此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"
}
。。这将导致错误:值路径不是类型参数T的成员

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

您需要在FileSystemObject上访问路径,以便在t上看到它。尝试将其设置为一个被具体类覆盖的def:

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

case class File(id: Int, path: String) extends FileSystemObject
您需要路径在FileSystemObject上可访问,才能在T上看到它。请尝试将其设置为被具体类重写的def:

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

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