Class 从抽象类继承的案例类

Class 从抽象类继承的案例类,class,scala,inheritance,case,Class,Scala,Inheritance,Case,我目前正在学习Scala,在设计案例类时遇到了一些问题。我需要两个具有相同属性的case类。所以我认为从定义这些属性的抽象基类继承是个好主意。但是,此代码不编译 abstract class Resource(val uri : String) case class File(uri : String) extends Resource(uri) case class Folder(uri : String) extends Resource(uri) 因为类构造函数在这种情况下会覆盖基类的

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

abstract class Resource(val uri : String)

case class File(uri : String) extends Resource(uri)
case class Folder(uri : String) extends Resource(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);
    }
}

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

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

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")
}}

正确的语法应为:

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)
}

但是,uri属性和getter方法都存储在
文件
文件夹
(重复)中。我希望有一些像上面的Java示例那样的干净代码(我已经更新了我的问题)。但是这在
文件和
文件夹中重复了
uri
属性和getter。有没有可能得到像我问题中的Java示例那样干净的代码?那么为什么要使用case类呢?Case类添加getter和setter。编写普通类和它们的伴生对象。因为这将是太多的锅炉板代码?;-)你能举个例子吗?谢谢!我不需要一个
unapply()
,因为
case f:File=>
匹配对象的类?是的,如果您想编写类似于:r match{case File(b)=>…}的东西,您需要unapply