簡體   English   中英

Scala抽象類/特征,其方法返回子類型

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM