我目前正在学习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);
}
}
答案 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")
}}