2016-04-10 57 views
2

我对正确理解类和伴侣对象的使用存在问题。案例分类和伴随对象

当定义一个case类时,它的陪伴对象随它而来,但是定义一个与case类同名的对象的结果是什么?它是否覆盖伴侣对象?以及如何访问案例类参数?

例如在TestCaseClass.scala文件I定义如下:

case class TestCaseClass(att1: String, att2: Int, att4s: List[String]) 

object TestCaseClass { 

    def iWantDoSomethingWithMyParams: String = { 
    att1 + " " + att2 
    } 

    // Other functions 
} 

object AnotherTestCaseClass { 

    def iWantDoSomethingWithTestCaseClassParams: String = { 
    // How to access TestCaseClass.att1 
    TestCaseClass.att1 + " " + TestCaseClass.att2 
    } 

    def iWantGetAllAttr4: List[String] = { 
    // ??? 
    } 
} 
+0

http://stackoverflow.com/questions/5827510/how-to-override-apply-in-a-case-class-companion –

回答

3

给人一种object的同名class(或trait)没有太多特殊的意义。这主要是一个常规问题。

伴随对象是一个单例类,就像任何其他对象一样。如果你想让伴随对象中的方法与类的实例进行交互,就必须像在其他任何情况下一样将它传递给类的一个实例。因此,要解决您的第一个例子:

case class TestCaseClass(att1: String, att2: Int, att4s: List[String]) 

object TestCaseClass {  
    def iWantDoSomethingWithMyParams(x: TestCaseClass): String = 
    x.att1 + " " + x.att2 
} 

类和对象没有“覆盖”或对方的脚趾一步以任何方式,因为类和对象属于不同的命名空间。类名称用于类型级别(也用于构造函数调用),对象名称用于术语级别。

这就是说,有一类和它的同伴之间的一些关系:

  • 它不会影响implicits的解决方式 - 在一个类中的同伴对象定义的任何implicts被自动纳入范围。

  • private该类的成员对该对象可见,反之亦然。

  • 案例类是有点不同,因为case class实际上是一个速记其中,除了定义一个类,还增加了applyunapply方法,它的同伴对象。

+2

“它不具备任何特殊权限进级相同的名称“是的,它的确如此。它可以访问类的私有成员(并且该类可以访问该对象)。 –

+0

@AlexeyRomanov谢谢,更新。 –

+0

如果将伴随对象命名为类没有任何意义 - 是什么使它成为伴侣对象?它是在同一个文件中定义的事实? – Make42