Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala保护对象_Scala_Protected - Fatal编程技术网

Scala保护对象

Scala保护对象,scala,protected,Scala,Protected,在Scala中,如果我创建了一个对象和伴生类,那么如果导入对象,则可以从类中访问使用protected修饰符声明的标识符: object Foo { protected val X = 42 } class Foo { import Foo._ def getX(): Int = X } 但是,无法从Foo类的子类访问受保护的标识符: class Bar extends Foo { import Foo._ def getX(): Int = X * 2 } 我在Bar中

在Scala中,如果我创建了一个对象和伴生类,那么如果导入对象,则可以从类中访问使用
protected
修饰符声明的标识符:

object Foo {
  protected val X = 42
}
class Foo {
  import Foo._
  def getX(): Int = X
}
但是,无法从Foo类的子类访问受保护的标识符:

class Bar extends Foo {
  import Foo._
  def getX(): Int = X * 2
}
我在
Bar
中遇到编译时错误


除此之外(暗示)
public
,我是否可以在
X
上放置任何访问修饰符,以便可以从其同伴的子类访问它,但不能从其他类访问它,包括同一包中的其他类?

这是因为只有类
Foo
是对象
Foo
的同伴

这里,
private
protected
之间的区别毫无意义,因为对象
Foo
是一个单态对象,这意味着没有任何其他对象具有与对象
Foo
相同的类(
Foo.type

Scala中的访问限制是基于包的,所以简短的回答是否定的。不过,您可以在基类上创建转发器,除非您需要它在没有实例的情况下可用


但是,在您的位置,我会回到设计板。

在这种情况下,我建议使用包专用修改器,如下所示:

object Foo {
  private[your_package] val X = 42
}

该值对包中的其他所有人仍然可见。

要实现同样的效果,此问题的一个解决方案可以是:

class Bar extends Foo {
  import Foo._
  override def getX(): Int = super.getX * 2
}

只是一个小问题:您的子类并不总是在同一个包中。