Примеры классов, наследуемых от абстрактного класса
В настоящее время я изучаю Scala, и у меня есть некоторые проблемы при проектировании классов. Мне нужны два класса классов, которые имеют одинаковые свойства. Поэтому я думал, что было бы хорошей идеей унаследовать от абстрактного базового класса, который определяет эти свойства. Однако этот код не компилирует
abstract class Resource(val uri : String)
case class File(uri : String) extends Resource(uri)
case class Folder(uri : String) extends Resource(uri)
потому что uri
в конструкторах класса case будет перезаписывать свойство uri
базового класса.
Каким будет правильный способ его разработки?
Я хочу сделать что-то вроде этого
val arr = Array[Resource](File("test"), Folder("test2"))
arr.foreach { r : Resource => r match {
case f : File => println("It a file")
case f : Folder => println("It 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);
}
}
Ответы
Ответ 1
Правильный синтаксис должен быть:
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 a file")
case f : Folder => println("It 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)
}
Ответ 2
Сделайте эти два класса case расширением общей черты, которые определяют его интерфейс, и он должен работать.
Кстати, вам нужен идентификатор перед предложением type в инструкции 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 a file")
case s: Folder => println("It a folder")
}}