Классы Case, наследуемые от абстрактного класса - PullRequest
17 голосов
/ 26 августа 2011

В настоящее время я изучаю 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 в конструкторах класса case будет перезаписывать свойство uri базового класса.

Какой будет правильный способ разработкиthis?

Я хочу иметь возможность сделать что-то вроде этого

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 ]

25 голосов
/ 26 августа 2011

Правильный синтаксис должен быть:

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)
}
5 голосов
/ 26 августа 2011

Сделайте так, чтобы эти два кейс-класса расширяли общую черту, определяющую его интерфейс, и он должен работать.

Кстати, вам нужен идентификатор перед предложением типа в операторе 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")
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...