从抽象类继承的Case类

时间:2011-08-26 06:20:30

标签: class scala inheritance case

我目前正在学习Scala,我在设计案例类时遇到了一些问题。我需要两个具有相同属性的案例类。所以我认为从一个定义这些属性的抽象基类继承是个好主意。但是这段代码没有编译

abstract class Resource(val uri : String)

case class File(uri : String) extends Resource(uri)
case class Folder(uri : String) extends Resource(uri)

因为case类构造函数中的uri会覆盖基类的uri属性。

设计这个的正确方法是什么?

我希望能够做到这样的事情

val arr = Array[Resource](File("test"), Folder("test2"))

arr.foreach { r : Resource => r match {
  case f : File => println("It's a file")
  case f : Folder => println("It's a folder")
} }

“等效”Java代码应该类似于

abstract class Resource {
   private String uri;

   public Resource(String uri) {
       this.uri = uri
   }

   public String getUri() {
       return uri;
   }
}

// same for Folder
class File extends Resource {
    public File(String uri) {
        super(uri);
    }
}

2 个答案:

答案 0 :(得分:25)

正确的语法应该是:

abstract class Resource {
   val uri: String
}

case class File(uri : String) extends Resource
case class Folder(uri : String) extends Resource


Stream[Resource](File("test"), Folder("test2")) foreach { 
  r : Resource => r match {
   case f : File => println("It's a file")
   case f : Folder => println("It's a folder")
} }

修改

没有案例类:

abstract class Resource(val uri : String)

class File(uri : String) extends Resource(uri) {
   override def toString = "..."
}
object File {
   def apply(uri: String) = new File(uri)
}

class Folder(uri : String) extends Resource(uri) {
   override def toString = "..."
}
object Folder {
   def apply(uri: String) = new Folder(uri)
}

答案 1 :(得分:5)

使这两个案例类扩展了一个共同的特征,它定义了它的接口,它应该可以工作。

顺便说一句,在case语句中的类型子句之前需要一个标识符。

trait Resource {
    val uri: String
}

case class File(uri : String) extends Resource
case class Folder(uri : String) extends Resource

val arr = Array[Resource](File("test"), Folder("test2"))

arr.foreach { r : Resource => r match {
  case s: File => println("It's a file")
  case s: Folder => println("It's a folder")
}}