【问题标题】:Scala A companion Object Vs. Scala Class new ObjectScala 一个伴随对象 Vs。 Scala 类新对象
【发布时间】:2018-02-06 21:30:19
【问题描述】:

这是代码和输出:

//A scala class with a private variable and one method
class A {
  private var a1 = "Zoom"
  def A1(): Unit = {
    println("A1 Class")
  }
}

//A companion object
object A {

  def A2(): Unit = {
    println("A1 Obj")
    val objA = new A
    objA.A1()
    println("a1 -> "+ objA.a1)
  }
}

Output
======
A1 Obj
A1 Class
a1 -> Zoom

现在我的疑问是,如果我不想使用 new 运算符创建 A 类的对象,A 伴随对象如何打印 a1(私有变量)值并访问 A1 的方法一类。我的意思是说我想通过伴随对象 A 访问 Companion Class A 的两个成员。

//A companion object
object A {

  def A2(): Unit = {
    println("A1 Obj")

    A.A1()  //It should print A1 Class

    println("a1 -> "+ A.a1) //It should print Zoom
  }
}

上面的代码 sn-p 也应该可以正常工作,因为在 Mardin Odersky 的书中写道,一个类及其伴随对象可以访问彼此的私有成员。

【问题讨论】:

  • 首先使用var 可变性并不是使用Scala 最惯用的方式

标签: scala object companion-object


【解决方案1】:

因为在 Mardin Odersky 的书中写道,A 类及其伴生对象可以访问彼此的私有成员

这仅仅意味着你可以在object A 的第一个sn-p 中访问objA.a1,即使它不在class A 内(同样,如果你在object A 中有任何私人成员,您可以从class A 访问它们。它根本与第二个 sn-p 无关。

现在我的疑问是,如果我不想使用 new 运算符创建 A 类的对象,伴生对象如何打印 a1(私有变量)值并访问 A 类的 A1 方法。

好吧,你需要使用new somewhere,因为只有class A 的实例才有A1() 方法和a1 字段。

注意class A 和object A 之间的主要特殊关系是这个特殊的可见性规则(其他细节在这个学习阶段可能与你无关)。所以对于A1() 调用,你有一个伴生对象并不重要。也可以是object B。

您可以通过编写object A extends A 使object A 成为class A 的实例,但这只会在编译器生成的代码中隐藏new 调用。

【讨论】:

  • 谢谢。 @Alexey 你能告诉我 - 其他细节是什么,我可以在哪里了解更多信息。
  • @PardeepSharma 你会在了解它们时了解它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多