2014-07-24 23 views
0

我有以下的情况下,类定义:继承的情况下,类

case class FileMetadata(announceUrls: List[String], pieceLength: Int, pieces: String) { 
    case class SingleFileMetadata(filename: String, length: Int) 
    case class MultiFileMetadata(dirname: String, files: List[FileInfo]) 
} 

,因为我想无论是单一和多文件类型都相同的数据值作为封闭FileMetaData案例类。这并没有真正似乎工作,虽然(在我不能创建一个新的SingleFileMetadataMultiFileMetaData类。

有没有办法在Scala中做到这一点?

回答

2

在你当前的代码,SingleFileMetadataMultiFileMetadata继承FileMetadata。事实上,他们只有FileMetadata特定情况下,你肯定不希望之内。而且,你不能扩展的情况下类,所有成员都是私有的,因此FileMetadata会必须是一个班(或特质)。

像这样的事情可能会为你工作:

class FileMetadata(announceUrls: List[String], pieceLength: Int, pieces: String) 

case class SingleFileMetadata(filename: String, length: Int, announceUrls: List[String], pieceLength: Int, pieces: String) extends FileMetadata(announceUrls, pieceLength, pieces) 

case class MultiFileMetadata(dirname: String, files: List[FileInfo], announceUrls: List[String], pieceLength: Int, pieces: String) extends FileMetadata(announceUrls, pieceLength, pieces) 
2

你可以让你的基类的一个特质,使这两个case类继承它。使用特质的

trait FileMetadata { 
    def announceUrls: List[String] 
    def pieceLength: Int 
    def pieces: String 
} 

case class SingleFileMetadata(filename: String, length: Int, announceUrls: List[String], pieceLength: Int, pieces: String) extends FileMetadata 
case class MultiFileMetadata(dirname: String, files: List[FileInfo], announceUrls: List[String], pieceLength: Int, pieces: String) extends FileMetadata 

一个额外的好处是,你可以继承限制为仅在给定文件中定义的类,通过指定traitsealed trait

0

您的问题的替代解决方案是创建只有一个通用案例类,将可选参数设置为默认值无,通过灵活的模式匹配,您可以轻松地对此类执行操作。

case class GenericFileMetadata(filename:Option[String] = None, 
           length:Option[String] = None, 
           dirname:Option[String] = None, 
           files:Option[List[FileInfo]]= None, 
           announceUrls: List[String], pieceLength: Int, pieces: String) 
相关问题