Самая большая проблема здесь в том, что 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
не является обязательным и не всегда ведет себя так, как вы ожидаете.