[英]Scala abstract class/trait with methods that return the sub-type
最近,我发现自己要使用结构相似的不同对象(使用播放框架,但这并不是很重要),我想将它们存储为不同的类。 他们通常会使用从根本上相同的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"
}
..这将导致error: value path is not a member of type parameter T
在这一点上,我选择的解决方案似乎存在严重缺陷,但是我不知道如何从这里继续。
您需要在FileSystemObject
上可访问的path
,以便使其在T
上可见。 尝试将其定义为具体类覆盖的def
:
abstract class FileSystemObject {
def id: Int
def path: String
}
case class File(id: Int, path: String) extends FileSystemObject
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.