2016-04-10 61 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