我有以下案例类定义:
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
案例类相同的所有数据值。这似乎并不合适(因为我无法创建新的SingleFileMetadata
或MultiFileMetaData
类。
有没有办法在Scala中执行此操作?
答案 0 :(得分:2)
在您当前的代码中,SingleFileMetadata
和MultiFileMetadata
不会继承自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)
答案 1 :(得分:2)
您可以使您的基类成为特征,并使两个案例类继承它。
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
使用特征的另一个好处是,您可以将继承限制为仅在给定文件中定义的类,方法是将trait
指定为sealed trait
。
答案 2 :(得分:0)
您的问题的替代解决方案是只创建一个通用案例类,将可选参数设置为默认值None,通过灵活的模式匹配,您可以轻松地对此类执行操作。
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)