[英]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.