案例类中的继承

时间:2014-07-24 14:16:21

标签: scala

我有以下案例类定义:

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中执行此操作?

3 个答案:

答案 0 :(得分: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)

答案 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)