2014-02-26 125 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 
相關問題