就像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 ??
我该如何解决这个问题?
答案 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
关键字不是必需的,并且并不总是表现出预期的效果。