Scala Return абстрактный класс - PullRequest
0 голосов
/ 09 марта 2019

Как и в Java, у меня может быть доступ к новому параметру дочернего элемента в scala, почему у меня нет доступа?

abstract class superclass

class class1(c: Int) extends superclass

class class2(a: String) extends superclass


def foo(i: Int): superclass ={
  if(i == 1){
    return new class1(1)
  }
  else {
    return new class2("as")
  }
}

val cla = foo(1)

cla.c ??

Как я могу решить эту проблему?

1 Ответ

1 голос
/ 09 марта 2019

Самая большая проблема здесь в том, что class1 не имеет члена c, поэтому даже это не сработает:

val c1 = new class1(3)
c1.c // Error: value c is not a member of class1

c - это параметр для конструкторано не является членом.

Вы можете исправить это, сделав класс case, который превращает параметры конструктора в члены:

case class class1(c: Int) extends superclass

Как только это будет исправлено, вы все равно не сможетеполучить доступ к элементу c из экземпляра superclass, поскольку superclass не имеет члена с именем c.Это верно как для Java, так и для Scala.Таким образом, вы не можете напрямую получить доступ к элементу c результата foo.

Однако вы можете использовать match, чтобы определить, какой подкласс superclass будет возвращен, например так:

val cla = foo(1)

cla match {
  case class1(c) =>
    println(s"It is class1, c = $c")
  case class2(a) =>
    println(s"It is class2, a is $a")
  case _ =>
    println("It is some other class")
}

Это выведет «Это class1, c = 1»,при изменении foo(1) на foo(2) будет выведено «Это class2, a is as».

Другие проблемы: Имена классов должны начинаться с заглавной буквы (не требуется, но match путает с нижним-case имена классов), а ключевое слово return не является обязательным и не всегда ведет себя так, как вы ожидаете.

...