Scala返回抽象类

时间:2019-03-09 16:38:55

标签: scala abstract-class parent-child

就像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 个答案:

答案 0 :(得分:1)

这里最大的问题是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")
}

这将打印“ It is class1,c = 1”,而将foo(1)更改为foo(2)将打印“ It is class2,a as as”。

其他问题:类名应该以大写字母开头(不是必需的,但是match会与小写的类名混淆),并且return关键字不是必需的,并且并不总是表现出预期的效果。